dtoi4706 异或
题意: 题解: 询问l~r的答案,很显然我们直接转化成0~r的答案减去0~(l-1)的答案。 如何求0~a的答案,从高位往低位枚举。 (1)如果当前位置在a中是1,那么这个位置可以取0,也可以取1。如果取0,那后面的随便取都无所谓,也就是说,后面的位置的0,1是可以随便乱放的,也就是说当前这一位为0^(x的这一位),然后之后位随便取,恰好是一个区间,可以求区间的答案。接下来把这一位取1^(x的这一位)然后继续往低位走。 (2)如果当前位置在a中是0,那么这个位置只能取0,就把这一位取0^(x的这一位),接着走。 接下来就是快速查询一段区间的答案,也就是一段区间的f(i)值。方法很多,可以二分直接做,然而我写了颗线段树维护。。。 #include<cstdio> #include<algorithm> #include<cstdlib> using namespace std; const int mod=998244353,INF=(1<<30)-1; int n,q,a[100002],cnt=1; typedef struct{ int ls,rs; long long sum,f; }P; P p[10000002]; void pushdown(int root,int begin,int mid,int end){ if (p[root].f) { if (!p[root