hdu 5700 区间交

来源:互联网 发布:数据分析包括哪些内容 编辑:程序博客网 时间:2024/04/29 19:53
#include<cstdio>#include<cstring>#include<algorithm>#include<set>#include<map>#include<vector>#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)#define per(i,j,k) for(int i=(int)j;i>=(int)k;i--)using namespace std;typedef long long LL;typedef double db;const int N=110000;inline void read(int &x){    x=0;char p=getchar();    while(!(p<='9'&&p>='0'))p=getchar();    while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();}int n,k,m;int l[N],r[N];int a[N];LL sum[N];int cnt[N];vector<int> g[N];void add(int x,int v){    for(;x<=n;x+=x&(-x))cnt[x]+=v;}int C=0;int ask(int x){    int ret=C;    for(x=x-1;x;x-=x&(-x))ret-=cnt[x];    return ret;}int main(){    while(scanf("%d%d%d",&n,&k,&m)!=EOF){        rep(i,1,n)read(a[i]);        rep(i,1,m){read(l[i]);read(r[i]);}        rep(i,1,n)sum[i]=sum[i-1]+a[i]*1ll;        rep(i,1,n)g[i].clear();        rep(i,0,n)cnt[i]=0;        C=0;        rep(i,1,m){            g[l[i]].push_back(r[i]);        }        LL ans=0;        rep(i,1,n){            rep(j,0,g[i].size()-1)            {add(g[i][j],1);++C;}            if(ask(i)>=k){                int L=i;int R=n;                int ret=i;                while(L<R){                    int mid=(L+R)>>1;                    if(ask(mid)>=k)ret=mid,L=mid+1;                    else R=mid;                }                if(ask(L)>=k)ret=L;                ans=max(ans,sum[ret]-sum[i-1]);            }        }        printf("%I64d\n",ans);    }    return 0;}
0 0
原创粉丝点击