uva 12003 分块
大白上的原题,我就练练手。。。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 3e5 + 10; const int SIZE = 4096; ll block[N / SIZE + 1][SIZE + 1]; ll A[N]; int query(int L, int R, int v) { int k = 0; int lb = L / SIZE, rb = R / SIZE; if(lb == rb) { for(int i = L; i <= R; ++i) if(A[i] < v) k++; } else { for(int i = L; i < (lb + 1) * SIZE; ++i) if(A[i] < v) k++; for(int i = rb * SIZE; i <= R; ++i) if(A[i] < v) k++; for(int i = lb + 1; i < rb; ++i) { k += lower_bound(block[i], block[i] + SIZE, v) - block[i]; } } return k; } void change(int k, int u, int p, int L, int R) { ll x = (ll)u * k / (R - L + 1); if(A[p] == x) return; int la = p / SIZE; ll* B = &block[la][0]; int pos = 0; ll old = A[p]; while(B[pos] < old) pos++; A[p] = x; B[pos] = x; if(x > old) { while(pos < SIZE - 1 && B[pos] > B[pos + 1]) { swap(B[pos + 1], B[pos]); pos++; } } else { while(pos > 0 && B[pos] < B[pos - 1]) { swap(B[pos - 1], B[pos]); pos--; } } } int main() { int n, m, u; while(~scanf("%d%d%d", &n, &m, &u)) { int j = 0, k = 0; for(int i = 0; i < n; ++i) { scanf("%lld", &A[i]); block[k][j++] = A[i]; if(j == SIZE) { k++; j = 0; } } for(int i = 0; i < k; ++i) sort(block[i], block[i] + SIZE); if(j) sort(block[k], block[k] + j); int L, R, v, p; while(m --) { int ans = 0; scanf("%d%d%d%d", &L, &R, &v, &p); L--; R--; p--; ans = query(L, R, v); change(ans, u, p, L, R); } for(int i = 0; i < n; ++i) printf("%lld\n", A[i]); } return 0; }
分类:
Uva
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧