美團(tuán)4.1春招筆試編程題
第一題:排列一個(gè)數(shù)組,使得兩兩差值的絕對(duì)值和最小
貪心,數(shù)組排序之后,相鄰兩兩相減,注意答案可能會(huì)爆int,開(kāi)long long。
第二題:有一組展品,每個(gè)展品有價(jià)值,一共進(jìn)行m次操作,操作為0時(shí)修改展品價(jià)值,操作為1時(shí)查看展品價(jià)值和
使用樹(shù)狀數(shù)組,抽象出問(wèn)題模型就是一個(gè)單點(diǎn)修改、區(qū)間查詢(xún)的模板。
#include <bits/stdc++.h> using i64 = long long; const int N = 50010; int n, m; int o[N], tr[N]; std::pair<int, int> p[N]; void add(int x, int k) { for (int i = x; i <= n; i += i & -i) { tr[i] += k; } } i64 sum(int x) { i64 ret = 0; for (int i = x; i; i -= i & -i) { ret += tr[i]; } return ret; } int main() { std::ios::sync_with_stdio(0); std::cin.tie(nullptr); std::cin >> n >> m; for (int i = 0; i < m; i++) { std::cin >> o[i]; } for (int i = 0; i < m; i++) { std::cin >> p[i].first; } for (int i = 0; i < m; i++) { std::cin >> p[i].second; } std::vector<i64> ans; for (int i = 0; i < m; i++) { if (o[i] == 0) { add(p[i].first, -(sum(p[i].first) - sum(p[i].first - 1))); add(p[i].first, p[i].second); } else { ans.push_back(sum(p[i].second) - sum(p[i].first - 1)); } } for (int i = 0; i < ans.size(); i++) { std::cout << ans[i] << " \n"[i == ans.size() - 1]; } return 0; }