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周也是同样的,包含的那些段中都要进行异或操作。
树状数组
- /*************************************************************************
- > File Name: poj2155.cpp
- > Author: cy
- > Mail: 1002@qq.com
- > Created Time: 14/10/18 12:30:44
- ************************************************************************/
- #include<iostream>
- #include<cstring>
- #include <algorithm>
- #include<cstdlib>
- #include<vector>
- #include<cmath>
- #include<stdlib.h>
- #include<iomanip>
- #include<list>
- #include<deque>
- #include<map>
- #include <stdio.h>
- #include <queue>
- #define maxn 1400+5
- #define inf 0x3f3f3f3f
- #define INF 0x3FFFFFFFFFFFFFFFLL
- #define rep(i,n) for(i=0;i<n;i++)
- #define reP(i,n) for(i=1;i<=n;i++)
- #define ull unsigned long long
- #define ll long long
- #define cle(a) memset(a,0,sizeof(a))
- using namespace std;
- int val[1500][1500];
- int bit(int x){
- return x&(-x);
- }
- void update(int x,int y){
- int i,j;
- for(i=x;i<=maxn;i+=bit(i)){
- for(j=y;j<=maxn;j+=bit(j)){
- val[i][j]++;
- }
- }
- }
- int getsum(int x,int y){
- int i,j;int sum=0;
- for(i=x;i>0;i-=bit(i)){
- for(j=y;j>0;j-=bit(j)){
- sum+=val[i][j];
- }
- }
- return sum;
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- #endif
- int T;cin>>T;
- while(T--){
- int n,m;
- cin>>n>>m;
- cle(val);
- for(int tt=1;tt<=m;tt++){
- char c;cin>>c;
- if(c=='C'){
- int x1,y1,x2,y2;
- cin>>x1>>y1>>x2>>y2;
- update(x1,y1);update(x2+1,y2+1);update(x2+1,y1);update(x1,y2+1);
- }
- if(c=='Q'){
- int x,y;
- cin>>x>>y;
- cout<<getsum(x,y)%2<<endl;
- }
- }
- cout<<endl;
- }
- return 0;
- }
二维线段树
- /*************************************************************************
- > File Name: poj12155.cpp
- > Author: cy
- > Mail: 1002@qq.com
- > Created Time: 14/10/18 14:33:19
- ************************************************************************/
- #include<iostream>
- #include<cstring>
- #include <algorithm>
- #include<cstdlib>
- #include<vector>
- #include<cmath>
- #include<stdlib.h>
- #include<iomanip>
- #include<list>
- #include<deque>
- #include<map>
- #include <stdio.h>
- #include <queue>
- #define maxn 5000+5
- #define inf 0x3f3f3f3f
- #define INF 0x3FFFFFFFFFFFFFFFLL
- #define rep(i,n) for(i=0;i<n;i++)
- #define reP(i,n) for(i=1;i<=n;i++)
- #define ull unsigned long long
- #define ll long long
- #define cle(a) memset(a,0,sizeof(a))
- using namespace std;
- bool tree[maxn][maxn];
- int ans=0;
- int n;
- void update_y(int i,int rt,int l,int r,int l1,int rr){
- if(l==l1&&r==rr){
- tree[i][rt]^=1;
- return;
- }
- int mid=(l+r)>>1;
- if(rr<=mid){
- update_y(i,rt<<1,l,mid,l1,rr);
- }
- else if(l1>mid){
- update_y(i,rt<<1|1,mid+1,r,l1,rr);
- }
- else{
- update_y(i,rt<<1,l,mid,l1,mid);
- update_y(i,rt<<1|1,mid+1,r,mid+1,rr);
- }
- }
- void update_x(int rt,int l,int r,int x1,int y1,int x2, int y2){
- if(l==x1&&r==y1){
- update_y(rt,1,1,n,x2,y2);
- return;
- }
- int mid=(l+r)>>1;
- if(y1<=mid){
- update_x(rt<<1,l,mid,x1,y1,x2,y2);
- }
- else if(x1>mid){
- update_x(rt<<1|1,mid+1,r,x1,y1,x2,y2);
- }
- else{
- update_x(rt<<1,l,mid,x1,mid,x2,y2);
- update_x(rt<<1|1,mid+1,r,mid+1,y1,x2,y2);
- }
- }
- void query_y(int i,int rt,int l,int r,int y){
- ans^=tree[i][rt];
- if(l==r)return;
- int mid=(l+r)>>1;
- if(y<=mid){
- query_y(i,rt<<1,l,mid,y);
- }
- else if(y>mid){
- query_y(i,rt<<1|1,mid+1,r,y);
- }
- }
- void query_x(int rt,int l,int r,int x,int y){
- query_y(rt,1,1,n,y);
- if(l==r)return;
- int mid=(l+r)>>1;
- if(x<=mid){
- query_x(rt<<1,l,mid,x,y);
- }
- else {
- query_x(rt<<1|1,mid+1,r,x,y);
- }
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- #endif
- int T;cin>>T;
- while(T--)
- {
- int m;
- cin>>n>>m;
- cle(tree);
- int i;
- rep(i,m){
- ans=0;
- char c;
- cin>>c;
- if(c=='C')
- {
- int x1,y1,x2,y2;
- cin>>x1>>y1>>x2>>y2;
- update_x(1,1,n,x1,x2,y1,y2);
- }
- else{
- int x,y;
- cin>>x>>y;
- query_x(1,1,n,x,y);
- cout<<ans<<endl;
- }
- }
- cout<<endl;
- }
- return 0;
- }
0 0
- poj 2155 二维线段树/树状数组
- POJ-2155-Matrix(二维树状数组 & 二维线段树)
- poj 2155 二维树状数组 二维线段树
- poj 2155 二维线段树或树状数组入门
- 【线段树】 POJ 2155 Matrix 二维线段树/二维树状数组
- POJ 1195 二维线段树||二维树状数组
- poj 1195(二维线段树||二维树状数组)
- POJ 2155——Matrix(树套树,二维树状数组,二维线段树)
- POJ-2155:Matrix(二维线段树或二维树状数组)
- poj2155二维线段树,二维树状数组
- 二维线段树和二维树状数组
- poj 2155 Matrix(二维树树状数组)
- poj Matrix 2155 (树状数组&&二维线段树) 好题
- poj 2155 二维树状数组 poj 1195 二维树状数组
- POJ 2155 二维树状数组
- POJ 2155 二维树状数组
- poj 2155 二维树状数组
- poj 2155 二维树状数组
- dropbear 安全登录
- c#线程的创建与启动
- iOS获取当前城市
- 业界资讯:下一个版本出啥?
- ListView中实现互斥按钮(每个Item中有两个button,永远只有一个item中的一个按钮被选中)
- poj 2155 二维线段树/树状数组
- 一树秋风
- 成佩涛——访问被屏蔽国外网捷径
- 黑马程序员_多线程(线程安全和通信)
- hdu 5063 Operation the Sequence
- 有关超声探头阻抗的分析
- Java总结之容器
- 第8周项目5 定期存款利息计算器
- 黑马程序员_集合概述(Collection List&Set)