线段树例题

  

 

 原题链接

线段树模板

  

复制代码
 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 }
复制代码

 

posted @   scannerkk  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示