题解见 : http://blog.csdn.net/iamzky/article/details/41088151
ORZ ZKY
2个懒标记:是否翻转,覆盖成了什么。
怎么处理一个块上有两个标记的情况呢?
若该块原来没有任何标记,或要打的标记和原本的标记种类相同,则直接打上标记;
若已有翻转标记,再覆盖时则先清除翻转标记,再打上覆盖标记;
若已有覆盖标记,再翻转时,则直接将覆盖标记取反。
So 某个块上同时只会有1个标记。
P.S.分块此题挺快的……
1 #include2 #include 3 using namespace std; 4 #define sz 370 5 const int n=131070; 6 char op[1],cl,cr; 7 int x,y,num[132000],l[sz],r[sz],cov[sz],sum; 8 bool a[132000],spin[sz],goal; 9 void makeblock() 10 { 11 for(sum=1;sum*sz >1); 94 if(i&1) {printf("%d",i+1>>1); putchar(')');} 95 else {printf("%d",i>>1); putchar(']');} 96 putchar(' '); 97 } 98 } 99 if(!goal) puts("empty set");100 return 0;101 }