BZOJ1135: [POI2009]Lyz

来源:互联网 发布:mac键盘pc机能用吗 编辑:程序博客网 时间:2024/05/21 02:22

似乎是hall定理的经典模型

贪心的想,对于人的任意一个集合,肯定编号是连续的l~r一段更容易使匹配不合法
写成柿子就是ri=lsi>(d+rl+1)k
把l,r移项,令ci=sik
柿子可以化为ri=lci>dk
用线段树维护序列里的最大连续子序列和判一下

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 longusing namespace std;inline void read(int &x){    char c; int f=1;    while(!((c=getchar())>='0'&&c<='9')) if(c=='-') f=-f;    x=c-'0';    while((c=getchar())>='0'&&c<='9') (x*=10)+=c-'0';    x*=f;}const int maxn = 210000;const int maxm = 510000;int n,N,m,K,d;ll a[maxn];struct segment{ll ls,rs,sum,c;}seg[maxn<<2];void pushup(const int x){    int lc=x<<1,rc=lc|1;    seg[x].c=seg[lc].c+seg[rc].c;    seg[x].sum=max(seg[lc].sum,seg[rc].sum);    seg[x].sum=max(seg[x].sum,seg[lc].rs+seg[rc].ls);    seg[x].ls=max(seg[lc].ls,seg[lc].c+seg[rc].ls);    seg[x].rs=max(seg[rc].rs,seg[rc].c+seg[lc].rs);}void build(const int x,const int l,const int r){    if(l==r) { seg[x].c=seg[x].ls=seg[x].rs=seg[x].sum=a[l]; return; }    int mid=l+r>>1;    build(x<<1,l,mid);    build(x<<1|1,mid+1,r);    pushup(x);}int loc;void upd(const int x,const int l,const int r){    if(l==r) { seg[x].c=seg[x].ls=seg[x].rs=seg[x].sum=a[l]; return ; }    int mid=l+r>>1;    if(loc<=mid) upd(x<<1,l,mid);    else upd(x<<1|1,mid+1,r);    pushup(x);}int main(){    read(n); read(m); read(K); read(d);    for(int i=1;i<=n;i++) a[i]=-K;    build(1,1,N=n-d);    for(int i=1;i<=m;i++)    {        int ri,xi; read(ri); read(xi);        a[ri]+=(ll)xi; loc=ri; upd(1,1,N);        puts(seg[1].sum>(ll)K*d?"NIE":"TAK");    }    return 0;}
原创粉丝点击