Codeforces 617 E【モキューアルゴリズム+プレフィックス異或】

1537 ワード

タイトル:
一連の数を与え、各クエリ区間に対して、複数のサブゾーン間異またはkが計算される.
考え方:
異種または接頭辞を先に処理することができ、1つの区間[L,R]の異種または値=sum[R]^sum[L-1]である.
現在の区間が[a,b],右端点b+1を加えると,このb+1の寄与は[a,b]区間内にsum[x]=sum[b+1]^kがどれだけあるかである.
では,num[sum[x],すなわちnum[sum[b+1]^k]を毎回記録し,num[sum[b+1]++を同理左区間で記録することができる.
では、モキューアルゴリズムを使用することができます.
#include 
using namespace std;
typedef long long LL;
typedef pair PII;
const int N=2e6+10;
int sum[N],pos[100010];
LL num[N];
int n,m,k,x;
struct asd{
    int left,right,id;
    LL res;
}e[100010];
bool cmp(asd x,asd y)
{
    if(pos[x.left]==pos[y.left]) return x.right=e[i].left)                      //       ,       
        {
            L--;
            ans+=num[sum[L]^k];          //    
            num[sum[L]]++;                      //  
        }
        while(R<=e[i].right)                //  ,    
        {
            ans+=num[sum[R]^k];        //    
            num[sum[R]]++;                   //  
            R++;
        }
        while(R>e[i].right+1)               // ,   
        {
            R--;
            num[sum[R]]--;                      //  
            ans-=num[sum[R]^k];         //    
        }
        e[e[i].id].res=ans;
    }
    for(int i=0;i