QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#152764 | #6837. AC Automaton | 275307894a | WA | 15ms | 28408kb | C++14 | 4.0kb | 2023-08-28 19:58:10 | 2023-08-28 19:58:11 |
Judging History
answer
#include<bits/stdc++.h>
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
using namespace std;using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned long long;using pii=pair<int,int>;using LL=__int128;
const int N=3e5+5,M=3e5+5,K=600+5,mod=1e9+7,Mod=mod-1;const db eps=1e-9;const int INF=1e9+7;mt19937 rnd(time(0));
int n,m,x[N];char s[N],c[N];vector<int> S[N];
ll ans,tot;
int Bg[N],En[N],Bh,fa[N];
void Make(int x){
Bg[x]=++Bh;for(int i:S[x]) Make(i);En[x]=Bh;
}
struct bit{
int f[N];
void add(int x,int y){while(x<=n) f[x]+=y,x+=x&-x;}
int qry(int x){int ans=0;while(x) ans+=f[x],x-=x&-x;return ans;}
}f1,f2;
// void dfs(int x,int w){
// g[x]=0;
// for(int i:S[x]) dfs(i,w+(s[x]=='A'||s[x]=='?')),g[x]+=g[i];
// if(s[x]=='?') ans+=max(g[x]-w,0);
// g[x]+=(s[x]=='C'||s[x]=='?');
// }
void ins(int x){
if(s[x]=='A'){
tot+=f2.qry(En[x])-f2.qry(Bg[x]-1);
f1.add(Bg[x],1);f1.add(En[x]+1,-1);
}
else{
tot+=f1.qry(Bg[x]);
f2.add(Bg[x],1);
}
}
void del(int x){
if(s[x]=='A'){
tot-=f2.qry(En[x])-f2.qry(Bg[x]-1);
f1.add(Bg[x],-1);f1.add(En[x]+1,1);
}else{
tot-=f1.qry(Bg[x]);
f2.add(Bg[x],-1);
}
}
int BB,t1[N],t2[N],To[N],CC,t3[N];
struct block{
int f[K*2],Pt,id;ll sum,siz;
void clear(int x){Me(f,0);id=x;Pt=BB;sum=siz=0;}
void add(int x){if(x>=0) siz++,sum+=x;if(abs(x-Pt)<=BB) f[Pt+x]++;}
void ins(int x){
if(x==1) Pt--,sum+=siz,siz+=f[Pt];
else siz-=f[Pt],sum-=siz,Pt++;
}
}f[K*4];
int newn(int x){f[++CC].clear(x);return CC;}
int dfs1(int x){
vector<int> B;
for(int i:S[x]){
int p=dfs1(i);if(p) B.emplace_back(p);
}
if(t1[x]||B.size()>=2) {
if(!t1[x]) t1[x]=newn(x),t3[x]=newn(x);
for(int i:B) To[i]=x;
return x;
}
if(B.size()==1) return B[0];
return 0;
}
int g1[N],g2[N],A[N];
void dfs2(int x){
g2[x]=g2[fa[x]]+(s[fa[x]]=='A'||s[fa[x]]=='?');g1[x]=0;
for(int i:S[x]) dfs2(i),g1[x]+=g1[i]+(s[i]=='C'||s[i]=='?');
}
void dfs3(int x,int Is,int op){
if(t1[x]||t2[x]||!x) return;
if(s[x]=='?') f[op?t1[Is]:t3[Is]].add(A[x])/*,cerr<<"ins "<<f[t1[Is]].sum<<'\n'*/;
t2[x]=1;dfs3(fa[x],Is,1);
for(int i:S[x]) dfs3(i,Is,0);
}
void add1(int x,int w){
for(int i=1;i<=CC;i++) if(Bg[f[i].id]>Bg[x]&&Bg[f[i].id]<=En[x]) f[i].ins(w),A[f[i].id]+=w;
}
void add2(int x,int w){
int op=1;while(x){
if(op) f[t1[x]].ins(w),x=To[x];
else A[x]+=w;
op^=1;
}
}
void Solve(){
int i,j;scanf("%d%d",&n,&m);BB=sqrt(m);
scanf("%s",s+1);
for(i=2;i<=n;i++) scanf("%d",&fa[i]),S[fa[i]].emplace_back(i);
Make(1);
for(i=1;i<=n;i++) ins(i);
for(i=1;i<=m;i++) scanf("%d",&x[i]),Gc(),c[i]=Gc();
for(i=1;i<=m;i++){
if((i-1)%BB==0){
Me(t1,0);Me(To,0);Me(t3,0);Me(t2,0);
CC=0;for(j=i;j<i+BB;j++) if(!t1[x[j]]) t1[x[j]]=newn(x[j]),t3[x[j]]=newn(x[j]);
dfs1(1);
dfs2(1);for(j=1;j<=n;j++) A[j]=g1[j]-g2[j]/*,cerr<<A[j]<<' '*/;
Me(t2,0);for(j=1;j<=n;j++) if(t1[j]) dfs3(fa[j],j,1);
for(j=1;j<=n;j++) if(t1[j]&&!S[j].empty()&&!t2[S[j].front()]){
for(int p:S[j]) dfs3(p,j,0);
}
}
// cerr<<"S "<<f[1].sum<<'\n';
del(x[i]);
if(s[x[i]]=='A'||s[x[i]]=='?') add1(x[i],1);
if(s[x[i]]=='C'||s[x[i]]=='?') add2(x[i],-1);
s[x[i]]=c[i];
ins(x[i]);
if(s[x[i]]=='A'||s[x[i]]=='?') add1(x[i],-1);
if(s[x[i]]=='C'||s[x[i]]=='?') add2(x[i],1);
ll ans=0;for(j=1;j<=CC;j++){
ans+=f[j].sum;//cerr<<"ans "<<ans<<'\n';
if(j==t1[f[j].id]&&s[f[j].id]=='?') ans+=max(A[f[j].id],0);
}
printf("%lld\n",ans+tot);
}
// for(i=1;i<=m;i++){
// int x;char c;scanf("%d",&x);
// del(x);
// Gc();s[x]=Gc();
// ins(x);
// ans=0;dfs(1,0);
// printf("%lld\n",ans+tot);
// }
}
int main(){
int t;
// scanf("%d",&t);
t=1;
while(t--) Solve();
cerr<<clock()*1.0/CLOCKS_PER_SEC<<'\n';
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 28408kb
input:
5 3 AC??C 1 2 2 1 1 ? 4 A 2 ?
output:
4 3 3
result:
ok 3 lines
Test #2:
score: -100
Wrong Answer
time: 15ms
memory: 24532kb
input:
1000 1000 AC?ACCCCC?CCA??CCCCC?A?AC?C??C?ACCCACC?C?CCC?CACACA???????C?????CC?C?AAAAACCA??AAAACACACA???AACAC?CCC?CAC?AAAACCAC???ACAA??A??A?CA?A?ACACACCAA?ACACA?AC??AC??ACAAACCC??CAA?A???CC?AA??AC???A?CCCC??CACCAACC?AA?C?AAACCCA?AAA??C?CC??CACCACAACCA?AACCC?A?CCC?CC???AA?CACCCAAC??CAA??C?AA??CA???CAAA...
output:
2327 2328 2325 2325 2758 2758 2762 2762 2762 2762 2762 2762 2762 2757 2757 2757 2757 2754 2756 2756 2759 2755 2751 2754 2757 2762 2762 2762 2762 2762 2762 2686 2686 2686 2686 2683 2680 2683 2691 2687 2687 2681 2677 2681 2681 2681 2681 2681 2683 2683 2687 2690 2690 2688 2691 2693 2696 2691 2695 2697 ...
result:
wrong answer 1st lines differ - expected: '2344', found: '2327'