QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#883362 | #8240. Card Game | ReqCxmChtChr | WA | 3ms | 12100kb | C++14 | 3.3kb | 2025-02-05 16:02:52 | 2025-02-05 16:02:55 |
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<<4],ls[MAXN<<4],rs[MAXN<<4];
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);}
}
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 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;
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;
cin>>n>>q;
rep(i,1,n)a[i]=qread();
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);
}
}
int lst=0;
while(q--){
int l=qread()^lst,r=qread()^lst;
int rs=que(rt[l],1,n,r);lst=(r-l+1-rs);
printf("%d\n",lst);
}
}
/*
DS真爽
主席树也行,rt[l]中下标r表示[l,r]的答案,对于i先继承rt[i+1],nxt后的区间由rt[nxt]替换且区间减1
标记永久化,repl的过程不会修改已经有的点
说句实话,(抛开复杂度)分块真的好,预处理保持在块内时有哪些需要决策的地方
*/
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 6100kb
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: 0ms
memory: 3968kb
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: 3ms
memory: 12100kb
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:
-1490 -2755 -5456 -12500 6160 9 28 -2435 -4398 4328 -621 -1358 -2328 -1455 -1594 -3011 -1284 -6371 -76 -1064 1115 -2210 -4764 6728 -311 -3148 -2117 -8119 5256 -7185 4649 1039 -3155 -10633 -4451 -1341 -3412 -6315 2185 -3162 802 -104 -3395 -10496 3260 -3509 -3029 -2870 -1589 -1924 -4380 -6592 -9968 -5...
result:
wrong answer 1st numbers differ - expected: '8', found: '-1490'