BZOJ 2683 简单题(CDQ分治+树状数组)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2683
【题目大意】
给一张二维表,要求支持两种操作,查询矩阵和以及增加单个格子的数值
【题解】
对于区间询问拆点
1.读入询问,按x排序
2.将[L,R]中的数分为前部分操作,后部分操作(各部分仍保持X升序)
3.将前面对后面的影响记录ans
4.复原影响
5.递归[L,M],[M+1,R]
【代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <cstdio> #include <algorithm> using namespace std; int m,x1,x2,y1,y2,u,opt,ans[200010],c[500010],M; struct data{ int x,y,val,pos,id,opt;}q[800010],tmp[800010]; bool operator<(data a,data b){ if (a.x==b.x&&a.y==b.y) return a.opt<b.opt; else return (a.x==b.x?a.y<b.y:a.x<b.x); } void addquery(){ scanf ( "%d%d%d%d" ,&x1,&y1,&x2,&y2); int pos=++ans[0]; ans[pos]=(x2-x1+1)*(y2-y1+1)*u; q[++m].pos=pos;q[m].id=m;q[m].x=x1-1;q[m].y=y1-1;q[m].val=1;q[m].opt=1; q[++m].pos=pos;q[m].id=m;q[m].x=x2;q[m].y=y2;q[m].val=1;q[m].opt=1; q[++m].pos=pos;q[m].id=m;q[m].x=x1-1;q[m].y=y2;q[m].val=-1;q[m].opt=1; q[++m].pos=pos;q[m].id=m;q[m].x=x2;q[m].y=y1-1;q[m].val=-1;q[m].opt=1; } void addmodify(){++m; scanf ( "%d%d%d" ,&q[m].x,&q[m].y,&q[m].val);q[m].id=m;} void update( int x, int val){ while (x<=M)c[x]+=val,x+=x&-x;} int query( int x){ int s=0; while (x)s+=c[x],x-=x&-x; return s;} void CDQ( int l, int r){ if (l==r) return ; int mid=(l+r)>>1,l1=l,l2=mid+1; for ( int i=l;i<=r;i++){ if (q[i].id<=mid&&!q[i].opt)update(q[i].y,q[i].val); if (q[i].id>mid&&q[i].opt)ans[q[i].pos]+=q[i].val*query(q[i].y); } for ( int i=l;i<=r;i++) if (q[i].id<=mid&&!q[i].opt)update(q[i].y,-q[i].val); for ( int i=l;i<=r;i++) if (q[i].id<=mid)tmp[l1++]=q[i]; else tmp[l2++]=q[i]; for ( int i=l;i<=r;i++)q[i]=tmp[i]; CDQ(l,mid);CDQ(mid+1,r); } int main(){ scanf ( "%d" ,&M); while (1){ scanf ( "%d" ,&opt); if (opt==1)addmodify(); else if (opt==2)addquery(); else break ; }sort(q+1,q+m+1);CDQ(1,m); for ( int i=1;i<=ans[0];i++) printf ( "%d\n" ,ans[i]); return 0; } |
愿你出走半生,归来仍是少年
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2014-07-17 BZOJ 1005 明明的烦恼 (组合数学)
2014-07-17 BZOJ 1058 报表统计 (STL)
2014-07-17 BZOJ 1008 越狱 (组合数学)
2014-07-17 BZOJ 1874 取石子游戏 (NIM游戏)
2014-07-17 BZOJ 1022 小约翰的游戏 (Anti-Nim游戏)
2014-07-17 BZOJ 2761 不重复数字 (Hash)
2014-07-17 BZOJ 2463 谁能赢呢? (博弈论)