传送门

设\(lim=2^n-1\),对于一个区间\([l,r]\)来说,如果\(sum\neq lim\)且能换出\(x\)并换进\(y\)来,使得\(sum\bigoplus a_x\bigoplus a_y=lim\),那么\(a_x\bigoplus a_y\)是个定值,所以如果对于每一个\(x\),它对应的\(y\)都在\([l,r]\)之间,这个区间就是不合法的

因为有一一对应关系,所以整个区间是由若干个二元组构成的,\(sum\)不管异或上哪个二元组都等于\(lim\),所以如果二元组个数为偶数,所有二元组异或起来为\(0\),\(sum\)也为\(0\),如果二元组个数是奇数,那么\(sum\)就等于二元组的值,则有\(a_x\bigoplus a_y=lim\)

综上,一个区间不合法当且仅当这个区间长度为\(4\)的倍数且这个区间内每一个的\(x\),与它对应的\(a_x\bigoplus a_y=lim\)的\(y\)都在区间内

那么把每个点和它对应的\(y\)连边,那么这个区间内就不能有边连到外面。记\(cnt_i\)为点\(i\)被边覆盖的次数,那么当\(i\)作为不合法区间的右端点时,最右边的能作为这个不合法区间左端点的为\(j\),满足\(cnt_j=cnt_i\),且对于任意\(j<p<i\),\(cnt_p\neq cnt_i\),简单来说就是前面一个与它覆盖次数相等的点

然而这个点不一定合法,所以可以用线段树之类的来做一下判定

记\(dp_{i,0/1}\)为以\(i\)为右端点的,长度\(len\%4=0/2\)的区间个数,那么则有转移$$dp_{i,0}=dp_{las_i,len%4}+1$$

\[dp_{i,1}=dp_{las_i,len\%4\bigoplus1}
\]

其中\(las_i\)就是之前说的最右边的能作为不合法区间的左端点,那个要加一是要加上一个空集

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define ls (p<<1)
  5. #define rs (p<<1|1)
  6. #define ll long long
  7. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  8. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  9. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  10. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  11. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
  12. using namespace std;
  13. char buf[1<<21],*p1=buf,*p2=buf;
  14. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  15. int read(){
  16. R int res,f=1;R char ch;
  17. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  18. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  19. return res*f;
  20. }
  21. char sr[1<<21],z[20];int C=-1,Z=0;
  22. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  23. void print(R int x){
  24. if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
  25. while(z[++Z]=x%10+48,x/=10);
  26. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  27. }
  28. const int N=(1<<20)+5;
  29. struct node{int mn,mx;}tr[N<<2];
  30. int to[N],las[N],a[N],pos[N],nxt[N],dp[N][2];
  31. int n,m,cnt;ll ans;
  32. void build(int p,int l,int r){
  33. if(l==r)return (void)(tr[p]={to[l],to[l]});
  34. int mid=(l+r)>>1;
  35. build(ls,l,mid),build(rs,mid+1,r);
  36. tr[p].mn=min(tr[ls].mn,tr[rs].mn);
  37. tr[p].mx=max(tr[ls].mx,tr[rs].mx);
  38. }
  39. node query(int p,int l,int r,int ql,int qr){
  40. // if(l<=r)printf("%d %d %d %d\n",l,r,ql,qr);
  41. if(ql<=l&&qr>=r)return tr[p];
  42. int mid=(l+r)>>1;node res={m,0};
  43. if(ql<=mid){
  44. node d=query(ls,l,mid,ql,qr);
  45. cmin(res.mn,d.mn),cmax(res.mx,d.mx);
  46. }
  47. if(qr>mid){
  48. node d=query(rs,mid+1,r,ql,qr);
  49. cmin(res.mn,d.mn),cmax(res.mx,d.mx);
  50. }return res;
  51. }
  52. inline bool check(int l,int r){
  53. node res=query(1,1,m,l,r);
  54. return res.mn>=l&&res.mx<=r;
  55. }
  56. int main(){
  57. // freopen("testdata.in","r",stdin);
  58. n=read(),m=(1<<n);
  59. if(n==1)return puts("2"),0;
  60. fp(i,1,m)a[i]=read(),pos[a[i]]=i;
  61. fp(i,1,m)to[i]=pos[a[i]^(m-1)];
  62. fp(i,1,m)if(to[i]<i)--cnt,las[i]=nxt[cnt],nxt[cnt]=i;
  63. else ++cnt,nxt[cnt]=i;
  64. ans=1ll*m*(m+1)/2;
  65. build(1,1,m),dp[0][0]=1;
  66. fp(i,1,m){
  67. dp[i][0]=1;
  68. if(to[i]>i)continue;
  69. // printf("%d %d\n",las[i]+1,i);
  70. if(check(las[i]+1,i)){
  71. int len=(i-las[i])%4/2;
  72. ans-=dp[las[i]][len];
  73. dp[i][0]=dp[las[i]][len]+1;
  74. dp[i][1]=dp[las[i]][len^1];
  75. }
  76. }printf("%lld\n",ans);
  77. return 0;
  78. }

P4443 [COCI2017-2018#3] Dojave(线段树)的更多相关文章

  1. LOJ #2537. 「PKUWC 2018」Minimax (线段树合并 优化dp)

    题意 小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点. 定义结点 \(x\) 的权值为: 1.若 \(x\) 没有子结点,那么它的权值会在输入 ...

  2. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  3. [九省联考2018]IIIDX 贪心 线段树

    ~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...

  4. 洛谷P4364 [九省联考2018]IIIDX 【线段树】

    题目 [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了.这款 ...

  5. [COCI2017.1]Deda —— 解锁线段树的新玩法

    众所周知,能用线段树做的题一定可以暴力 但考场上也只能想到暴力了,毕竟还是对线段树不熟练. deda 描述 有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下 ...

  6. [BZOJ5249][九省联考2018]IIIDX:线段树+贪心

    分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...

  7. 洛谷P4364 [九省联考2018]IIIDX(线段树)

    传送门 题解看得……很……迷? 因为取完一个数后,它的子树中只能取权值小于等于它的数.我们先把权值从大到小排序,然后记$a_i$为他左边(包括自己)所有取完他还能取的数的个数.那么当取完一个点$x$的 ...

  8. [Luogu P4215] 踩气球 (线段树)

    题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...

  9. BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树

    BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...

随机推荐

  1. EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能

    本文转自:http://blog.csdn.net/jyt0551/article/details/56942795 对于一个裸的RTSP URL,存放在播放列表上略显单调与枯燥.大家可以看到Easy ...

  2. redis事务和乐观锁

    1 MULTI/EXEC 执行本事务. MULTI set foo bar get foo set foo hello EXEC 在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行.没有回滚 ...

  3. python的self

    python类定义里面的self就是指的该类的对象本身.

  4. python exception的传递

    try: block except1: except2: ... 如果block中出现了except,那么会先取匹配except1,如果匹配了,进行处理,程序继续执行. 如果except1没有匹配上, ...

  5. Android笔记之文本随滑块移动的SeekBar

    效果图 FloatingTextSeekBar.java package com.bu_ish.blog; import android.content.Context; import android ...

  6. CMTime 与 CMTimeMakeWithSeconds

    1.首先先看代码,这段代码的作用就是要让视频播放区域有个封面.不会显的太空当. - (void)avPlayerDidPlayed:(NSNotification *)noti { [_avPlaye ...

  7. Codeforces Round #379 (Div. 2) C. Anton and Making Potions —— 二分

    题目链接:http://codeforces.com/contest/734/problem/C C. Anton and Making Potions time limit per test 4 s ...

  8. iap 应用内购买相关的解释

    应用范围app Store Review Guidelines : https://developer.apple.com/app-store/review/guidelines/  中 11.12  ...

  9. git bash使用端口转发连接服务器

    之前的配置是 url = user@xx.xx.xx.xx:/home/tutu/thelib/ww.git xx.xx.xx.xx是服务器的外网地址,其内网地址是zz.zz.zz.zz 但是现在服务 ...

  10. CQOI2017 部分题解

    部分题解是指没写那道算几. BZOJ上目前没有day2的题面D2T2的图. BZOJ4813 小Q的棋盘 显然可以$O(n^2)$DP,然而可以$O(n)$贪心:只有一条从根出发的一条链上的边可以只经 ...