JZOJ 3469. 【NOIP2013模拟联考7】数列(sequence)
Solution
明显的 K-D Tree 基操题
提前给出了数列,那么考虑提前建好树,省去重构
但还是要开 O
Code
#pragma GCC optimize(3) #pragma GCC optimize("inline") #pragma GCC optimize("Ofast") #pragma GCC target("sse3","sse2","sse") #pragma GCC diagnostic error "-std=c++14" #pragma GCC diagnostic error "-fwhole-program" #pragma GCC diagnostic error "-fcse-skip-blocks" #pragma GCC diagnostic error "-funsafe-loop-optimizations" #pragma GCC optimize("fast-math","unroll-loops","no-stack-protector","inline") #include <cstdio> #include <iostream> #include <algorithm> #define LL long long #define re register using namespace std; const int N = 5e4 + 5; const LL P = 536870912; int n, m, cur, x0, y0, x1, y1, rt, L1[N], L2[N], R1[N], R2[N], siz[N], ls[N], rs[N], ds[N], gs[N]; LL sum[N], tg1[N], tg2[N], v1, v2; struct node{int x, y; LL v;}s[N]; inline bool cmpx(int a, int b){return s[a].x < s[b].x;} inline bool cmpy(int a, int b){return s[a].y < s[b].y;} inline void read(int &x) { x = 0; char ch = getchar(); while (!isdigit(ch)) ch = getchar(); while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar(); } inline void update(int p, int o) { L1[p] = min(L1[p], L1[o]), R1[p] = max(R1[p], R1[o]); L2[p] = min(L2[p], L2[o]), R2[p] = max(R2[p], R2[o]); } inline void maintain(int p) { siz[p] = siz[ls[p]] + siz[rs[p]] + 1, sum[p] = sum[ls[p]] + sum[rs[p]] + s[p].v; L1[p] = R1[p] = s[p].x, L2[p] = R2[p] = s[p].y; if (ls[p]) update(p, ls[p]); if (rs[p]) update(p, rs[p]); } int build(int l, int r) { if (l > r) return 0; int mid = (l + r) >> 1; double av1 = 0, av2 = 0, s1 = 0, s2 = 0; for(re int i = l; i <= r; i++) av1 += s[gs[i]].x, av2 += s[gs[i]].y; av1 /= (r - l + 1), av2 /= (r - l + 1); for(re int i = l; i <= r; i++) s1 += (av1 - s[gs[i]].x) * (av1 - s[gs[i]].x), s2 += (av2 - s[gs[i]].y) * (av2 - s[gs[i]].y); if (s1 > s2) nth_element(gs + l, gs + mid, gs + r + 1, cmpx), ds[gs[mid]] = 1; else nth_element(gs + l, gs + mid, gs + r + 1, cmpy), ds[gs[mid]] = 2; ls[gs[mid]] = build(l, mid - 1), rs[gs[mid]] = build(mid + 1, r), maintain(gs[mid]); return gs[mid]; } inline void add1(int p, LL v) { s[p].v = s[p].v * v % P, sum[p] = sum[p] * v % P, tg1[p] = tg1[p] * v % P, tg2[p] = tg2[p] * v % P; } inline void add2(int p, LL v) { s[p].v = (s[p].v + v) % P, sum[p] = (sum[p] + v * siz[p] % P) % P, tg2[p] = (tg2[p] + v) % P; } inline void pushdown(int p) { add1(ls[p], tg1[p]), add1(rs[p], tg1[p]), tg1[p] = 1; if (tg2[p]) add2(ls[p], tg2[p]), add2(rs[p], tg2[p]), tg2[p] = 0; } void modify(int p) { if (!p || L1[p] > x1 || R1[p] < x0 || L2[p] > y1 || R2[p] < y0) return; if (x0 <= L1[p] && R1[p] <= x1 && y0 <= L2[p] && R2[p] <= y1) return add1(p, v1), add2(p, v2); if (s[p].x >= x0 && s[p].x <= x1 && s[p].y >= y0 && s[p].y <= y1) sum[p] = (sum[p] - s[p].v + P) % P, s[p].v = (s[p].v * v1 % P + v2) % P, sum[p] = (sum[p] + s[p].v) % P; pushdown(p), modify(ls[p]), modify(rs[p]), maintain(p); } LL query(int p) { if (!p || L1[p] > x1 || R1[p] < x0 || L2[p] > y1 || R2[p] < y0) return 0; if (x0 <= L1[p] && R1[p] <= x1 && y0 <= L2[p] && R2[p] <= y1) return sum[p]; pushdown(p); LL res = 0; if (s[p].x >= x0 && s[p].x <= x1 && s[p].y >= y0 && s[p].y <= y1) res = s[p].v; return (res + query(ls[p]) + query(rs[p])) % P; } int main() { freopen("sequence.in", "r", stdin), freopen("sequence.out", "w", stdout); read(n), read(m); for(re int i = 1; i <= n; i++) ++cur, read(s[cur].y), s[cur].x = i, gs[++gs[0]] = i, tg1[i] = 1; rt = build(1, n); for(int opt; m; m--) { read(opt); if (opt == 0) read(x0), read(x1), read(y0), read(y1), v1 = y0, v2 = y1, y0 = 1, y1 = n, modify(rt); else if (opt == 1) read(y0), read(y1), read(x0), read(x1), v1 = x0, v2 = x1, x0 = 1, x1 = n, modify(rt); else if (opt == 2) read(x0), read(x1), y0 = 1, y1 = n, printf("%lld\n", query(rt)); else if (opt == 3) read(y0), read(y1), x0 = 1, x1 = n, printf("%lld\n", query(rt)); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!