poj 2155 二维线段树/树状数组

来源:互联网 发布:mac便签 桌面显示 编辑:程序博客网 时间:2024/05/14 18:50

题目:Matrix


大体内容

   题意:       初始化的矩阵为0;       C->给出矩形范围,范围内的进行一次翻转操作       Q->查询某个位置0或者1    解法:       二维线段树,或者树状数组       树状数组:同一维

详细分析

    树状数组无;    线段树,静等填坑

二维线段树

    //由于只有0,1所以只需异或操作即可    // * 成段更新,单点查询    > * 更新的时候,找到所在的段,更新即可    > * 一个点[x,y],x属于固定的一些段中    如:         [1,5]    [1,3]     [4,5] [1,2]    3    4     51     2    对于横坐标为3的点,只可能在更新[1,5][1,3][3,3]时会更新到,所以查询时都要进行y的查询。    同样的对于y周也是同样的,包含的那些段中都要进行异或操作。

树状数组

  1. /************************************************************************* 
  2.     > File Name: poj2155.cpp 
  3.     > Author: cy 
  4.     > Mail: 1002@qq.com  
  5.     > Created Time: 14/10/18 12:30:44 
  6.  ************************************************************************/ 
  7.  
  8. #include<iostream> 
  9. #include<cstring> 
  10. #include <algorithm> 
  11. #include<cstdlib> 
  12. #include<vector> 
  13. #include<cmath> 
  14. #include<stdlib.h> 
  15. #include<iomanip> 
  16. #include<list> 
  17. #include<deque> 
  18. #include<map> 
  19. #include <stdio.h> 
  20. #include <queue> 
  21.  
  22. #define maxn 1400+5 
  23.  
  24. #define inf 0x3f3f3f3f 
  25.   #define INF 0x3FFFFFFFFFFFFFFFLL 
  26. #define rep(i,n) for(i=0;i<n;i++) 
  27.  #define reP(i,n) for(i=1;i<=n;i++) 
  28.  
  29. #define ull unsigned long long 
  30.  #define ll long long 
  31.  
  32. #define cle(a) memset(a,0,sizeof(a)) 
  33.  
  34. using namespace std; 
  35. int val[1500][1500]; 
  36. int bit(int x){ 
  37.     return x&(-x); 
  38. void update(int x,int y){ 
  39.     int i,j; 
  40.     for(i=x;i<=maxn;i+=bit(i)){ 
  41.         for(j=y;j<=maxn;j+=bit(j)){ 
  42.             val[i][j]++; 
  43.         } 
  44.     } 
  45. int getsum(int x,int y){ 
  46.     int i,j;int sum=0
  47.     for(i=x;i>0;i-=bit(i)){ 
  48.         for(j=y;j>0;j-=bit(j)){ 
  49.             sum+=val[i][j]; 
  50.         } 
  51.     } 
  52.     return sum; 
  53. int main() 
  54. #ifndef ONLINE_JUDGE 
  55.      freopen("in.txt","r",stdin); 
  56.      //freopen("out.txt","w",stdout); 
  57. #endif 
  58.     int T;cin>>T; 
  59.     while(T--){ 
  60.         int n,m; 
  61.         cin>>n>>m; 
  62.         cle(val); 
  63.         for(int tt=1;tt<=m;tt++){ 
  64.         char c;cin>>c; 
  65.         if(c=='C')
  66.             int x1,y1,x2,y2; 
  67.             cin>>x1>>y1>>x2>>y2; 
  68.             update(x1,y1);update(x2+1,y2+1);update(x2+1,y1);update(x1,y2+1); 
  69.         } 
  70.         if(c=='Q')
  71.             int x,y; 
  72.             cin>>x>>y; 
  73.             cout<<getsum(x,y)%2<<endl; 
  74.         } 
  75.         } 
  76.         cout<<endl; 
  77.     } 
  78.     return 0
  79. }

二维线段树

  1. /************************************************************************* 
  2.     > File Name: poj12155.cpp 
  3.     > Author: cy 
  4.     > Mail: 1002@qq.com  
  5.     > Created Time: 14/10/18 14:33:19 
  6.  ************************************************************************/ 
  7.  
  8. #include<iostream> 
  9. #include<cstring> 
  10. #include <algorithm> 
  11. #include<cstdlib> 
  12. #include<vector> 
  13. #include<cmath> 
  14. #include<stdlib.h> 
  15. #include<iomanip> 
  16. #include<list> 
  17. #include<deque> 
  18. #include<map> 
  19. #include <stdio.h> 
  20. #include <queue> 
  21.  
  22. #define maxn 5000+5 
  23.  
  24. #define inf 0x3f3f3f3f 
  25.   #define INF 0x3FFFFFFFFFFFFFFFLL 
  26. #define rep(i,n) for(i=0;i<n;i++) 
  27.  #define reP(i,n) for(i=1;i<=n;i++) 
  28.  
  29. #define ull unsigned long long 
  30.  #define ll long long 
  31.  
  32. #define cle(a) memset(a,0,sizeof(a)) 
  33.  
  34. using namespace std; 
  35. bool tree[maxn][maxn]; 
  36.  int ans=0
  37.  int n; 
  38. void update_y(int i,int rt,int l,int r,int l1,int rr){ 
  39.     if(l==l1&&r==rr){ 
  40.         tree[i][rt]^=1
  41.         return
  42.     } 
  43.     int mid=(l+r)>>1
  44.     if(rr<=mid){ 
  45.         update_y(i,rt<<1,l,mid,l1,rr); 
  46.     } 
  47.     else if(l1>mid){ 
  48.         update_y(i,rt<<1|1,mid+1,r,l1,rr); 
  49.     } 
  50.     else
  51.         update_y(i,rt<<1,l,mid,l1,mid); 
  52.         update_y(i,rt<<1|1,mid+1,r,mid+1,rr); 
  53.     } 
  54. void update_x(int rt,int l,int r,int x1,int y1,int x2, int y2){ 
  55.     if(l==x1&&r==y1){ 
  56.         update_y(rt,1,1,n,x2,y2); 
  57.         return
  58.     } 
  59.     int mid=(l+r)>>1
  60.     if(y1<=mid){ 
  61.         update_x(rt<<1,l,mid,x1,y1,x2,y2); 
  62.     } 
  63.     else if(x1>mid){ 
  64.         update_x(rt<<1|1,mid+1,r,x1,y1,x2,y2); 
  65.     } 
  66.     else
  67.         update_x(rt<<1,l,mid,x1,mid,x2,y2); 
  68.         update_x(rt<<1|1,mid+1,r,mid+1,y1,x2,y2); 
  69.     } 
  70. void query_y(int i,int rt,int l,int r,int y){ 
  71.     ans^=tree[i][rt]; 
  72.     if(l==r)return
  73.     int mid=(l+r)>>1
  74.     if(y<=mid){ 
  75.         query_y(i,rt<<1,l,mid,y); 
  76.     } 
  77.     else if(y>mid){ 
  78.         query_y(i,rt<<1|1,mid+1,r,y); 
  79.     } 
  80. void query_x(int rt,int l,int r,int x,int y){ 
  81.     query_y(rt,1,1,n,y); 
  82.     if(l==r)return
  83.     int mid=(l+r)>>1
  84.     if(x<=mid){ 
  85.         query_x(rt<<1,l,mid,x,y); 
  86.     } 
  87.     else { 
  88.         query_x(rt<<1|1,mid+1,r,x,y); 
  89.     } 
  90. int main() 
  91. #ifndef ONLINE_JUDGE 
  92.      freopen("in.txt","r",stdin); 
  93.      //freopen("out.txt","w",stdout); 
  94. #endif 
  95.     int T;cin>>T; 
  96.     while(T--) 
  97.     { 
  98.         int m; 
  99.         cin>>n>>m; 
  100.         cle(tree); 
  101.         int i; 
  102.         rep(i,m){ 
  103.             ans=0
  104.             char c; 
  105.             cin>>c; 
  106.             if(c=='C') 
  107.             { 
  108.                 int x1,y1,x2,y2; 
  109.                 cin>>x1>>y1>>x2>>y2; 
  110.                 update_x(1,1,n,x1,x2,y1,y2); 
  111.             } 
  112.             else
  113.                 int x,y; 
  114.                 cin>>x>>y; 
  115.                 query_x(1,1,n,x,y); 
  116.             cout<<ans<<endl; 
  117.             } 
  118.         } 
  119.         cout<<endl; 
  120.     } 
  121.     return 0
  122. }
0 0
原创粉丝点击