线段树例题
一
原题链接
线段树模板
1 #include <bits/stdc++.h> 2 const int maxn=4096+5; 3 typedef long long ll; 4 ll c1[maxn][maxn],c2[maxn][maxn],c3[maxn][maxn],c4[maxn][maxn]; 5 int n,m; 6 int lowbit(int x){return x & -x;} 7 void modify(ll x,ll y,ll z){//点(x,y)增加z 8 for(int i=x;i<=n;i+=lowbit(i)) 9 for(int j=y;j<=m;j+=lowbit(j)){ 10 c1[i][j]+=z; 11 c2[i][j]+=x*z; 12 c3[i][j]+=y*z; 13 c4[i][j]+=x*y*z; 14 } 15 } 16 ll getsum(ll x,ll y){ 17 ll tot=0; 18 for(int i=x;i;i-=lowbit(i)) 19 for(int j=y;j;j-=lowbit(j)) 20 tot+=(x+1)*(y+1)*c1[i][j]-(y+1)*c2[i][j]-(x+1)*c3[i][j]+c4[i][j]; 21 return tot; 22 } 23 void Solve(){ 24 scanf("%d%d",&n,&m); 25 int ch; 26 int q; 27 scanf("%d",&q); 28 while(q--){ 29 scanf("%d",&ch); 30 if(ch==1){ 31 int x1,x2,y1,y2; 32 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 33 modify(x1,y1,1); 34 modify(x2+1,y2+1,1); 35 modify(x2+1,y1,-1); 36 modify(x1,y2+1,-1); 37 } 38 else{ 39 int x1,y1,x2,y2; 40 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 41 printf("%lld\n",(getsum(x2,y2)+getsum(x1-1,y1-1)-getsum(x2,y1-1)-getsum(x1-1,y2)) & 1); 42 } 43 } 44 } 45 int main(){ 46 Solve(); 47 return 0; 48 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效