同一份代码评测结果不同
查看原帖
同一份代码评测结果不同
569702
_xxy_楼主2023/8/8 17:47

Rt,一开始RE以为是数组开小了,然后一直开到4千万还是过不了,后来发现同一份代码每次RE的点都不一样,比如同样开到8百万,一次RE on #8,一次 #12 ,一次 #14 ,不知道哪出了问题。

#include<cstdio>
#include<algorithm>
#include<vector>
int read(){
    int x=0,f=1;
    char ac=getchar();
    while(ac<'0'||ac>'9'){
        if(ac=='-') f=-1;
        ac=getchar();
    }
    while(ac>='0'&&ac<='9'){
        x=(x<<3)+(x<<1)+(ac-'0');
        ac=getchar();
    }
    return x*f;
}
struct tree{
    int l,r,sum;
}w[40000005];
int n,m,maxr,left[200005],right[200005],s[200005],tim[200005],num,ans[200005];
std::vector<int> v[200005];
void update(int &u,int his,int p,int l,int r,int val){
    u=++num;
    w[u]=w[his];
    w[u].sum+=val;
    if(l==r) return;
    int mid=l+r>>1;
    if(p<=mid) update(w[u].l,w[his].l,p,l,mid,val);
    else update(w[u].r,w[his].r,p,mid+1,r,val);
}
int query(int l,int r,int L,int R,int k){
    if(L==R) return L;
    int mid=L+R>>1;
    int now=w[w[r].l].sum-w[w[l].l].sum;
    if(k<=now) return query(w[l].l,w[r].l,L,mid,k);
    else return query(w[l].r,w[r].r,mid+1,R,k-now);
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        left[i]=read(),right[i]=read(),s[i]=read();
        maxr=std::max(maxr,right[i]);
    }
    for(int i=1;i<=maxr;i++) v[i].push_back(m+1);
    for(int i=1;i<=m;i++){
        int x=read();
        if(v[x][0]==m+1) v[x][0]=i;
        else v[x].push_back(i);
    }
    m++;
    for(int i=1;i<=maxr;i++){
        update(tim[i],tim[i-1],v[i][0],1,m,1);
        int len=v[i].size();
        for(int j=1;j<len;j++) update(tim[i],tim[i],v[i][j],1,m,1);
    }
    for(int i=1;i<=n;i++){
        int nowans=query(tim[left[i]-1],tim[right[i]],1,m,s[i]);
        ans[nowans]++;
    }
    for(int i=1;i<m;i++) printf("%d\n",ans[i]);
    return 0;
}
2023/8/8 17:47
加载中...