【NOIP模拟】成绩调研

来源:互联网 发布:淘宝美工的后台 编辑:程序博客网 时间:2024/05/16 15:15

Description

这里写图片描述

Solution

这题明明是道水题,但是却不小心打错了。
做法大致是每次搜到一个i,对于每个等级k,都找一个[x,y]满足[x~y,i]是合法的,然后用线段树求一下区间的交集就好了。
每次多找到一个a[i]是,左右区间本来都要向右移动的(如果已经有的话),但是我的右区间移动了,左区间却没有移动,而且我并没有考虑l=0的情况,以后要注意点啊,思维一定要谨慎。
这次又忘了开long long。

Code

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)using namespace std;typedef long long ll;const int maxn=500007;typedef long long ll;int i,j,k,n,m,a[maxn],zuo,you,ou,sz,sy;int x[maxn],y[maxn],c[maxn],hou[maxn],l[maxn],r[maxn],tou[maxn],tt[maxn];int yi[maxn],er[maxn],cc[maxn];bool bz[maxn],az[maxn];ll ans;int t[maxn*3][2];void change(int x,int l,int r,int y,int z,int bz){    int mid=(l+r)/2;    if(l==r){t[x][bz]=z;return;}    if(y<=mid)change(x*2,l,mid,y,z,bz);    else change(x*2+1,mid+1,r,y,z,bz);    t[x][0]=min(t[x*2][0],t[x*2+1][0]);    t[x][1]=max(t[x*2][1],t[x*2+1][1]);}int main(){    freopen("survey.in","r",stdin);    freopen("survey.out","w",stdout);    scanf("%d%d",&n,&m);    fo(i,1,n){        scanf("%d",&a[i]);l[i]=hou[a[i]],hou[a[i]]=i;    }    fo(i,1,m)tou[i]=n+1;    fod(i,n,1)r[i]=tou[a[i]],tou[a[i]]=i;    fo(i,1,m)tt[i]=tou[i],er[i]=n+1;    fo(i,1,m){        change(1,1,m,i,tou[i],0);        change(1,1,m,i,l[er[i]]+1,1);    }    fo(i,1,m){        scanf("%d%d",&x[i],&y[i]);        if(!x[i])ou++;    }    fo(i,1,n){        c[a[i]]++;cc[a[i]]++;        if(c[a[i]]==y[a[i]]&&!bz[a[i]])        er[a[i]]=tt[a[i]],bz[a[i]]=1,change(1,1,m,a[i],l[er[a[i]]]+1,1);        if(c[a[i]]==x[a[i]]&&!az[a[i]])az[a[i]]=1,ou++;        if(c[a[i]]>y[a[i]]){            c[a[i]]--;            er[a[i]]=r[er[a[i]]];            change(1,1,m,a[i],l[er[a[i]]]+1,1);        }        if(cc[a[i]]>x[a[i]]){            cc[a[i]]--;            if(!x[a[i]])tou[a[i]]=n;            else tou[a[i]]=r[tou[a[i]]];            change(1,1,m,a[i],tou[a[i]],0);        }            if(ou!=m)continue;        if(t[1][1]>t[1][0])continue;        ans+=(t[1][0]-t[1][1]+1);    }    printf("%lld\n",ans);}
2 0
原创粉丝点击