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]++を同理左区間で記録することができる.
では、モキューアルゴリズムを使用することができます.
一連の数を与え、各クエリ区間に対して、複数のサブゾーン間異または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