题意:

解法:

一个比较重要的推导:
假设有n个2^k块不纯色(k>1),那么答案为4x+1.计算不纯色的块比较困难,考虑计算纯色的块,全部块-纯色块=不纯色的块.判断一个块是否纯色,只需要判断这个块是否所有行的翻转次数相同,是否所有列的翻转次数相同.发现2^k是2的幂次,对于行,每次可以拆分为两块,拆分出的两块又能继续递归拆分,
直到只有一行的时候结束,
可以用线段树维护,线段树的每个节点就表示一个2^k块.
我们维护每个块拆分出的两个行是否操作次数相同即可.列同理,维护方式相同.对于固定的k,我们假设有p个2^k行纯色,q个2^k列纯色,那么纯色的(2^k)*(2^k)块就有p*q个.

code:

#include<bits/stdc++.h>
// #define SYNC_OFF
typedef std::vector<int> VE;
typedef std::pair<int,int> PI;
#define int long long
#define ll long long
#define ull unsigned long long
//fast-coding
#define ST(x) x.begin()
#define ED(x) x.end()
#define RST(x) x.rbegin()
#define RED(x) x.end()
#define CL(x) x.clear();
#define all(a,n) a+1,a+1+n
#define ff(i,n) for(ll i=1;i<=n;i++)
#define rff(i,n) for(ll i=n;i>=1;i--)
#define fff(i,n) for(ll i=0;i<n;i++)
#define rfff(i,n) for(ll i=n-1;i>=0;i--)
#define SC(x) scanf("%s",x)
#define SL(x) strlen(x)
#define pss(a) push_back(a)
#define ps(a) push(a)
#define SZ(x) (int)x.size()
#define pee puts("");
#define eee putchar(' ');
#define re readdd()
#define pr(a) printtt(a)
int readdd(){int x=0,f=1;char c=getchar();//
while(!isdigit(c)&&c!='-')c=getchar();
if(c=='-')f=-1,c=getchar();
while(isdigit(c))x=x*10+c-'0',c=getchar();
return f*x;}
void printtt(int x){if(x<0)putchar('-'),x=-x;//
if(x>=10)printtt(x/10);putchar(x%10+'0');}
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}//
int ppow(int a,int b,int mod){a%=mod;//
int ans=1%mod;while(b){if(b&1)ans=(long long)ans*a%mod;
a=(long long)a*a%mod;b>>=1;}return ans;}
bool addd(int a,int b){return a>b;}
int lowbit(int x){return x&-x;}
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
bool isdigit(char c){return c>='0'&&c<='9';}
bool Isprime(int x){for(int i=2;i*i<=x;i++)if(x%i==0)return 0;return 1;
}
void ac(int x){if(x)puts("YES");else puts("NO");}
//
using namespace std;
// const int mod=998244353;
const int mod=1e9+7;
const int maxm=2e6+5;
int a[2][maxm<<2];
int cnt[2][22];
int n,q;
void pp(int p,int k,int node){if(a[p][node]!=-1)cnt[p][k]--;if(a[p][node*2]==a[p][node*2+1]){//奇偶性相同a[p][node]=a[p][node*2];}else{//奇偶性不同a[p][node]=-1;}if(a[p][node]!=-1)cnt[p][k]++;
}
void build(int p,int k,int l,int r,int node){a[p][node]=0;if(k>0)cnt[p][k]++;if(l==r)return ;int mid=(l+r)/2;build(p,k-1,l,mid,node*2);build(p,k-1,mid+1,r,node*2+1);
}
void upd(int p,int k,int v,int l,int r,int node){if(l==r){a[p][node]^=1;return ;}int mid=(l+r)/2;if(v<=mid)upd(p,k-1,v,l,mid,node*2);else upd(p,k-1,v,mid+1,r,node*2+1);pp(p,k,node);
}
void solve(){n=re,q=re;int tot=(1<<n);build(0,n,1,tot,1);build(1,n,1,tot,1);int num=0;//2^k的方块总数量,k>0for(int i=n,c=1;i>=1;i--,c*=4){num+=c;}while(q--){int op=re,x=re;upd(op,n,x,1,tot,1);int eq=0;//相同2^k块的数量(k>0)for(int i=1;i<=n;i++){eq+=cnt[0][i]*cnt[1][i];}int neq=num-eq;int ans=neq*4+1;pr(ans);pee;}
}
void Main(){// #define MULTI_CASE#ifdef MULTI_CASEint T;cin>>T;while(T--)#endifsolve();
}
void Init(){#ifdef SYNC_OFFios::sync_with_stdio(0);cin.tie(0);#endif#ifndef ONLINE_JUDGEfreopen("../in.txt","r",stdin);freopen("../out.txt","w",stdout);#endif
}
signed main(){Init();Main();return 0;
}

gym101964 G.Matrix Queries(思维+线段树)相关推荐

  1. P2787 语文1(chin1)- 理理思维(线段树)

    P2787 语文1(chin1)- 理理思维(线段树) 对每个字母开一棵线段树 操作1就是区间查询 操作2就是区间修改 操作3可以看成 先预处理查询出区间对应的每个字母的个数,然后进行区间修改. 然后 ...

  2. SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

    Can you answer these queries II 这是一道线段树的题目,维护历史版本,给出N(<=100000)个数字(-100000<=x<=100000),要求求出 ...

  3. POJ2155 Matrix 二维线段树

    关键词:线段树 二维线段树维护一个 维护一个X线段的线段树,每个X节点维护一个 维护一个Y线段的线段树. 注意,以下代码没有PushDownX.因为如果要这么做,PushDownX时,由于当前X节点的 ...

  4. CF911G Mass Change Queries (线段树区间 合并)

    题意: 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 题解: 100个数,很容易想到要从这里进行突破,对于某次操作我们只需要把这个区间的数x给移动到y ...

  5. Can you answer these queries III (线段树维护最大子段和)

    题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...

  6. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

  7. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

    题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...

  8. SPOJ - GSS3 Can you answer these queries III(线段树+区间合并)

    题目链接:点击查看 题目大意:给出一个长度为n的序列,进行m次操作: 1 x y  查询区间[l,r]中的最大连续子段和 0 x y  将第x个数修改为y 题目分析:因为涉及到单点修改和区间查询等操作 ...

  9. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 1 #include<iostream> 2 #include<math.h> 3 #include<algorithm> 4 #inclu ...

  10. duliu——思维+线段树

    题目 [题目描述] 小 `D` 喜欢出毒瘤题毒人.当然,他的毒瘤更多体现在若干个难题组合在同一场比赛时. 小 `D` 脑中有 $n$ 个毒瘤题 idea,第 $i$ 个的毒值为$d_i$.当第 $i$ ...

最新文章

  1. python从控制台读取数据
  2. linux pssh parallel-ssh 批量执行远程shell命令
  3. python和java哪个-Java和Python现在都很热门,哪个更有前途?
  4. 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
  5. 去掉button按钮左右两边的留白
  6. [JavaWeb-Servlet]Servlet的体系结构
  7. java基于文件的map实现_Mybatis中返回Map的实现
  8. react设置static defaultProps报错问题解决
  9. Elasticsearch--高级-映射mapping_添加行的字段映射---全文检索引擎ElasticSearch工作笔记018
  10. eclipse新建maven项目和聚合项目
  11. linux rm -rf 根目录,在linux 根目录rm * -rf以后怎么办?
  12. Class类文件结构之ConstantValue属性
  13. 【微信小程序】实现手机全屏滚动字幕
  14. nginx 使用配置解释
  15. SMD电容极性的区分
  16. kindeditor=4.1.5上传漏洞复现
  17. torch-sparse安装教程
  18. HTML5期末大作业:旅行网站设计——开心网旅游(11页) web前端期末大作业 html+css+javascript网页设计实例
  19. 疯狂天才乔治·霍兹:17岁黑掉苹果,22岁搞垮索尼,还是特斯拉、谷歌最可怕的对手!
  20. 【项目管理一点通】(46) 项目验收

热门文章

  1. 分析案例:贷款逾期分析
  2. C++标准库string类型那些事儿
  3. heka数据流处理工具
  4. 苹果cms10好看的模板自适应高端大气免费模板
  5. 图文并茂讲VLAN,让你看一遍就理解VLAN
  6. android 动画闪屏问题,Android中闪屏实现方法小结(普通闪屏、倒计时闪屏、倒计时+动画...
  7. linux中查看ruby版本号,Ruby 版本常量
  8. 编译原理之Frist集与Follow集
  9. flask序列化框架之marshmallow详解
  10. php odbc informix,Informix CLI 与 ODBC