BZOJ4378: [POI2015]Logistyka

来源:互联网 发布:金凯度 知乎 编辑:程序博客网 时间:2024/05/16 03:38

题意看错以为有坐标的限制….赋值0的情况没处理好

对于一个询问,每次选c个,拿s次
如果序列中某个元素>=s,每次一定要拿它,设这样的有k个,对于剩下的< s的元素,易证当序列中剩余的数之和>=(c-k)*s时有解,就是个二维偏序问题,离散化+树状数组

code:

#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long long#define lowbit(x) x&(-x)using namespace std;const int maxn = 1100000;int n,m,N;ll s1[maxn],s2[maxn],c[maxn],To[maxn];void add1(int x,int c){for(;x<=N;x+=lowbit(x))s1[x]+=c;}int query1(int x){int re=0;for(;x;x-=lowbit(x))re+=s1[x];return re;}void add2(int x,ll c){for(;x<=N;x+=lowbit(x))s2[x]+=c;}ll query2(int x){ll re=0;for(;x;x-=lowbit(x))re+=s2[x];return re;}struct node{int ti,ki,p,c,nc;}a[maxn];inline bool cmpt(const node x,const node y){return x.ti<y.ti;}inline bool cmpc(const node x,const node y){return x.nc<y.nc;}char str[1100];int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        a[i].ti=i;        scanf("%s",str);        a[i].ki=str[0]=='U'?0:1;        scanf("%d%d",&a[i].p,&a[i].nc);    }    sort(a+1,a+m+1,cmpc);    for(int i=1;i<=m;i++)    {        if(a[i].nc!=a[i-1].nc) To[++N]=a[i].nc;        a[i].c=N;    }    sort(a+1,a+m+1,cmpt);    int num=0;    for(int i=1;i<=m;i++)    {        if(!a[i].ki)        {            if(c[a[i].p]) add2(c[a[i].p],-To[c[a[i].p]]),add1(c[a[i].p],-1),num--;            if(a[i].c)            {                ++num; c[a[i].p]=a[i].c;                add2(a[i].c,To[a[i].c]); add1(a[i].c,1);            }        }        else        {            int temp=num-query1(a[i].c);            if(temp>=a[i].p) { puts("TAK");continue; }            a[i].p-=temp;            ll tmp=query2(a[i].c);            if(tmp>=(ll)a[i].p*a[i].nc) puts("TAK");            else puts("NIE");        }    }    return 0;}
原创粉丝点击