社区讨论

被卡成 MLE 了求救

P9867[POI 2021/2022 R2] kon参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mji7bzw1
此快照首次捕获于
2025/12/23 14:26
2 个月前
此快照最后确认于
2025/12/23 16:28
2 个月前
查看原帖
数组我只用了 100 MB 左右,为什么我的代码在以下数据会 MLE (大约需要 320 MB 才能通过,题目限制 256 MB):
CPP
1000000
W 1
(上一行再重复 999996 次)
? 1
Z 1
? 1
这是我的代码:
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>
void in(T &x){
	char c=getchar();T f=1; x=0;
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	x*=f;
}
const int N=2000010,M=2000000;
vector<int> g[N],h[N];
int n,m,p;
char str[2];
char op[N];
int now[N],cur[N],nwc[N],nxt[N];
int dfn[N],lst[N],anc[N],ck;
queue<int> q;
void dfs(int u){
    dfn[u]=lst[u]=++ck;
    for(int v:g[u]){
        anc[v]=anc[u];
        dfs(v);
        lst[u]=max(lst[u],lst[v]);
    }
    for(int v:h[u]){
        anc[v]=u;
        q.push(v);
    }
}
struct BIT{
    int a[N];
    int lowbit(int x){return x&-x;}
    void update(int x,int y){
        for(;x<=M;x+=lowbit(x))
            a[x]+=y;
    }
    int query(int x){
        int res=0;
        for(;x;x-=lowbit(x))
            res+=a[x];
        return res;
    }
}bita,bitb;
int main(){
    in(n); m=1; nwc[1]=1;
    for(int i=0;i<=n;i++){
        if(i==0){
            str[0]='W';
            cur[i]=1;
        }else{
            scanf("%s",str);
            in(cur[i]);
        }
        if(str[0]=='?') continue;
        now[i]=++m; nwc[m]=m;
        if(str[0]=='W'){
            op[i]=1;
            g[nwc[cur[i]]].push_back(M-p);
            nwc[cur[i]]=nxt[nwc[cur[i]]]=M-p;
            p++;
            h[nwc[cur[i]]].push_back(m);
        }else{
            op[i]=2;
            g[nwc[cur[i]]].push_back(m);
        }
    }
    q.push(1);
    while(!q.empty()){
        dfs(q.front());
        q.pop();
    }
    bitb.update(dfn[1],1);
    for(int i=1;i<=m;i++) nwc[i]=i;
    for(int i=0;i<=n;i++){
        int u=nwc[cur[i]]; int v=anc[cur[i]];
        if(op[i]==0){
            int ans=bita.query(dfn[u]);
            if(v) ans+=bitb.query(lst[v])-bitb.query(dfn[v]-1);
            printf("%d\n",ans);
        }else if(op[i]==1){
            bitb.update(dfn[nwc[now[i]]],1);
            bitb.update(dfn[u],-1);
            nwc[cur[i]]=u=nxt[u];
            bitb.update(dfn[u],1);
            if(u){
                bita.update(dfn[u],1);
                bita.update(lst[u]+1,-1);
            }
        }else{
            bitb.update(dfn[nwc[now[i]]],1);
            if(v){
                bita.update(dfn[v],1);
                bita.update(lst[v]+1,-1);
            }
        }
    }
}

回复

4 条回复,欢迎继续交流。

正在加载回复...