【bzoj4378】[POI2015]Logistyka

来源:互联网 发布:mysql 阻止连接半小时 编辑:程序博客网 时间:2024/05/02 00:37

题目

对于每次询问:
如果ai>=s,ai最大贡献为s。
如果ai<s,ai最大贡献为ai。
设数列中大于等于s的数有k个,小于s的数的和为sum。
需要总贡献为c*s,最后只需判断sum+k*s>=c*s即可。

代码:

#include<cstdio>#include<map>#include<algorithm> #define lowbit(x) (x&-x)#define maxn 1000010 using namespace std; typedef long long ll;int n,m,num,t[maxn],a[maxn];ll tr1[maxn],tr2[maxn];char cmd[10];map<int,int>M; struct que{    int c,x,w;}q[maxn]; void modify(int pos,int w,ll *tr){    for(int i=pos;i<=num;i+=lowbit(i)) tr[i]+=w;} ll ask(int pos,ll *tr){    ll ans=0;    for(int i=pos;i>0;i-=lowbit(i)) ans+=tr[i];    return ans;} int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        scanf("%s%d%d",cmd,&q[i].x,&q[i].w);        if(cmd[0]=='U'){            t[++t[0]]=q[i].w;            q[i].c=0;        }else{            t[++t[0]]=q[i].w;            q[i].c=1;        }    }    t[++t[0]]=0;    sort(t+1,t+t[0]+1);    for(int i=1;i<=t[0];i++) if(t[i]!=t[i-1]||i==1) M[t[i]]=++num;    for(int i=1;i<=m;i++){        if(q[i].c==0){            modify(M[a[q[i].x]],-a[q[i].x],tr1);            modify(M[q[i].w],q[i].w,tr1);            modify(M[a[q[i].x]],-1,tr2);            modify(M[q[i].w],1,tr2);            a[q[i].x]=q[i].w;        }else{            ll t1=ask(M[q[i].w],tr1),t2=ask(num,tr2)-ask(M[q[i].w],tr2);            if(t1>=1ll*q[i].w*(q[i].x-t2)){                puts("TAK");            }else{                puts("NIE");            }        }    }    return 0;}


1 0
原创粉丝点击