QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#883462 | #8240. Card Game | ReqCxmChtChr | WA | 0ms | 6100kb | C++14 | 3.9kb | 2025-02-05 16:31:07 | 2025-02-05 16:31:09 |
Judging History
answer
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
//#define int long long
#define ll long long
#define ull unsigned ll
#define db double
#define ldb long db
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pbI push_back
#define inf 1e18
#define mdI int mid=(l+r)>>1
#define lowbit(x) ((x)&(-(x)))
#define ppc(x) __builtin_popcount(x)
#define rep(a,b,c) for(signed a=b;a<=c;a++)
#define vep(a,b,c) for(int a=b;a>=c;a--)
#define MAXN 300010
#define gint __int128
#define MOD 1000000009//998244353
int qread(){
char o=getchar();int f=1,x=0;
for(;!isdigit(o);o=getchar())if(o=='-')f*=-1;
for(;isdigit(o);o=getchar())x=x*10+o-'0';
return f*x;
}
ll qp(ll a,ll b,ll p=MOD){
ll bs=a,rs=1;while(b){if(b&1)rs=rs*bs%p;bs=bs*bs%p;b>>=1;}return rs;
}
template<typename T> void chmx(T &x,T y){if(y>x)x=y;}
template<typename T> void chmi(T &x,T y){if(y<x)x=y;}
template<typename T> void chmd(T &x,T y,T m=MOD){x=(x+y)%MOD;}
//void chmd(ll &x,ll y,ll m=MOD){x=(x+y)%m;}
bool FLA;
int n,q;
int a[MAXN],nxt[MAXN];
int wh[MAXN];
int rt[MAXN],cnt;
int ren(int &x){return x?x:x=++cnt;}
int tg[MAXN<<5],ls[MAXN<<5],rs[MAXN<<5];
int Rve;
void bui(int &x,int od,int l,int r,int p){
x=++cnt;tg[x]=tg[od],ls[x]=ls[od],rs[x]=rs[od];
if(l==r)return;mdI;
if(p<=mid)bui(ls[x],ls[od],l,mid,p);
else{bui(rs[x],rs[od],mid+1,r,p);}
}
int rew(int &x){
if(x<Rve){int y=++cnt;tg[y]=tg[x],ls[y]=ls[x],rs[y]=rs[x];return x=y;}
return x;
}
void ins(int &x,int od,int l,int r,int p,int va){
if(x<Rve){x=++cnt;tg[x]=tg[od],ls[x]=ls[od],rs[x]=rs[od];}
if(l==r){tg[x]=va;return;}mdI;
if(p<=mid)ins(ls[x],ls[od],l,mid,p,va);
else{ins(rs[x],rs[od],mid+1,r,p,va);}
}
void pd(int x){
if(tg[x]){
tg[rew(ls[x])]+=tg[x];
tg[rew(rs[x])]+=tg[x];
tg[x]=0;
}
}
void repl(int &x,int od,int rd,int l,int r,int ql,int qr,int va){
if(x<Rve){x=++cnt;tg[x]=tg[od],ls[x]=ls[od],rs[x]=rs[od];}
if(l==ql&&r==qr){tg[x]=tg[rd]+va,ls[x]=ls[rd],rs[x]=rs[rd];return;}mdI;pd(x);
if(qr<=mid){repl(ls[x],ls[od],ls[rd],l,mid,ql,qr,va);}
else if(ql>mid){repl(rs[x],rs[od],rs[rd],mid+1,r,ql,qr,va);}
else{
repl(ls[x],ls[od],ls[rd],l,mid,ql,mid,va);
repl(rs[x],rs[od],rs[rd],mid+1,r,mid+1,qr,va);
}
}
int que(int x,int l,int r,int p){
if(!x)return 0;
int b=tg[x];
if(l==r){return b;}mdI;
if(p<=mid)return b+que(ls[x],l,mid,p);
else{return b+que(rs[x],mid+1,r,p);}
}
bool FLB;
signed main(){
cerr<<((&FLB)-(&FLA))/1024.0/1024<<endl;
n=20,q=3e5;
cin>>n>>q;
//rep(i,1,n)a[i]=((ll)rand())*rand()%n+1;
rep(i,1,n)a[i]=qread();
//rep(i,1,n)cout<<a[i]<<" ";cout<<endl;
vep(i,n,1){
nxt[i]=wh[a[i]];wh[a[i]]=i;
bui(rt[i],rt[i+1],1,n,i);
Rve=rt[i];
if(nxt[i]){
ins(rt[i],rt[i+1],1,n,nxt[i],nxt[i]-i+1);
if(nxt[i]<n)
repl(rt[i],rt[i+1],rt[nxt[i]+1],1,n,nxt[i]+1,n,nxt[i]-i+1);
}
//cerr<<cnt<<" "<<n-i+1<<endl;
}
//cerr<<cnt<<endl;
int lst=0;
while(q--){
//int l=rand()%n+1,r=rand()%(n-l+1)+l;
int l=qread()^lst,r=qread()^lst;
l^=lst,r^=lst;
int rs=que(rt[l],1,n,r);lst=(r-l+1-rs);
printf("%d\n",lst);
//if(lst<0){cerr<<l<<" "<<r<<endl;assert(1==0);}
}
}
/*
20 1
8 1 17 5 9 6 8 12 11 13 5 7 5 17 11 3 19 9 14 11
2 20
15 1
1 17 5 9 6 8 12 11 13 5 7 5 17 11 3
1 15
DS真爽
主席树也行,rt[l]中下标r表示[l,r]的答案,对于i先继承rt[i+1],nxt后的区间由rt[nxt]替换且区间减1
标记永久化,repl的过程不会修改已经有的点
说句实话,(抛开复杂度)分块真的好,预处理保持在块内时有哪些需要决策的地方
*/
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 6100kb
input:
5 5 3 3 1 1 1 5 5 3 4 3 3 0 5 3 5
output:
1 0 1 6 1
result:
wrong answer 2nd numbers differ - expected: '2', found: '0'