QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#883466 | #8240. Card Game | ReqCxmChtChr | WA | 2ms | 10780kb | C++14 | 3.9kb | 2025-02-05 16:32:20 | 2025-02-05 16:32:20 |
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的过程不会修改已经有的点
说句实话,(抛开复杂度)分块真的好,预处理保持在块内时有哪些需要决策的地方
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3968kb
input:
5 5 3 3 1 1 1 5 5 3 4 3 3 0 5 3 5
output:
1 2 1 0 1
result:
ok 5 number(s): "1 2 1 0 1"
Test #2:
score: 0
Accepted
time: 1ms
memory: 5944kb
input:
7 7 2 4 1 2 3 1 2 1 6 0 4 3 3 0 4 0 3 0 6 2 7
output:
2 1 1 1 2 3 0
result:
ok 7 numbers
Test #3:
score: -100
Wrong Answer
time: 2ms
memory: 10780kb
input:
10000 10000 160 120 157 1393 1368 911 449 735 662 698 480 730 1184 768 1291 1012 834 61 1925 642 1401 1681 441 367 1498 1215 1969 1895 857 304 400 524 1138 846 810 885 68 1737 199 90 321 1109 980 1097 1936 1482 753 1796 1787 1939 291 1201 1025 367 980 1785 1781 276 1774 777 861 967 1428 1060 1300 32...
output:
8 31 35 76 35 9 63 27 30 38 72 22 133 45 71 92 22 49 25 47 56 30 32 87 90 31 50 56 76 108 69 60 56 90 104 59 107 40 53 46 50 82 92 20 34 85 90 -88 -6841 1924 35 133 86 90 14 27 25 67 38 27 41 92 34 53 63 143 64 92 56 66 66 20 5 65 61 48 102 27 57 18 26 63 18 62 78 51 45 23 47 52 57 108 13 25 69 18 3...
result:
wrong answer 48th numbers differ - expected: '8', found: '-88'