• Matrix(线段树版)


    poj2155:http://poj.org/problem?id=2155

    题意;同上一遍随笔。

    题解:这里用二维线段树打了一发。第一次学习别人的代码。才学的。这种树套树的程序,确实很费脑子,一不小心就会晕了,而且这次是用省空间的方法写的。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 bool seg[4010][4009];
     7 int n,ans;
     8 void updatey(int i,int l,int r,int j,int y1,int y2){
     9      if(l==y1&&r==y2){
    10         seg[i][j]^=1;
    11         return;
    12      }
    13     int mid=(l+r)/2;
    14     if(mid>=y2)updatey(i,l,mid,j*2,y1,y2);
    15       else if(mid<y1)updatey(i,mid+1,r,j*2+1,y1,y2);
    16     else {
    17         updatey(i,l,mid,j*2,y1,mid);//注意这里不要写成updatey(i,l,mid,j*2,y1,(y1+y2)/2)
    18         updatey(i,mid+1,r,j*2+1,mid+1,y2);
    19     }
    20 }
    21 void updatex(int i,int l,int r,int x1,int x2,int y1,int y2){
    22       if(l==x1&&r==x2){
    23         updatey(i,1,n,1,y1,y2);
    24         return;
    25       }
    26       int mid=(l+r)/2;
    27       if(mid>=x2)updatex(i*2,l,mid,x1,x2,y1,y2);
    28       else if(mid<x1)updatex(i*2+1,mid+1,r,x1,x2,y1,y2);
    29       else {
    30         updatex(i*2,l,mid,x1,mid,y1,y2);
    31         updatex(i*2+1,mid+1,r,mid+1,x2,y1,y2);
    32       }
    33 }
    34 void queryY(int i,int l,int r,int j,int y ){
    35     ans^=seg[i][j];
    36     if(l==r)return;
    37     int mid=(l+r)/2;
    38     if(mid>=y)queryY(i,l,mid,j*2,y);
    39     else
    40         queryY(i,mid+1,r,j*2+1,y);
    41 
    42 }
    43 void queryX(int i,int l,int r,int x,int y){
    44     queryY(i,1,n,1,y);
    45     if(l==r)return;
    46     int mid=(l+r)/2;
    47     if(mid>=x)queryX(i*2,l,mid,x,y);
    48     else
    49         queryX(i*2+1,mid+1,r,x,y);
    50 
    51 }
    52 int t,x1,y1,x2,y2,cas;
    53 char temp[4];
    54 int main(){
    55     scanf("%d",&cas);
    56     int tt=1;
    57     while(cas--){
    58       memset(seg,0,sizeof(seg));
    59       scanf("%d%d",&n,&t);
    60       if(tt>1)printf("
    ");
    61       tt=2;
    62       for(int i=1;i<=t;i++){
    63         scanf("%s%d%d",temp,&x1,&y1);
    64         if(temp[0]=='C'){
    65             scanf("%d%d",&x2,&y2);
    66           updatex(1,1,n,x1,x2,y1,y2);
    67         }
    68         else{
    69            ans=0;
    70            queryX(1,1,n,x1,y1);
    71            printf("%d
    ",ans);
    72         }
    73 
    74       }
    75     }
    76 }
    View Code
  • 相关阅读:
    nodejs install
    taobao sass
    Cors 跨域访问API
    多文件上传
    Next
    实用小工具
    下载包含src,tgz,zip的文件
    HTML5文件API
    Bootstrap (导航、标签、面包屑导航)
    Bootstrap 固定定位(Affix)
  • 原文地址:https://www.cnblogs.com/chujian123/p/3861293.html
Copyright © 2020-2023  润新知