[POI2009]Lyz

Description

初始时滑冰俱乐部有1到n号的溜冰鞋各k双。已知x号脚的人可以穿x到x+d的溜冰鞋。 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人。xi为负,则代表走了这么多人。 对于每次操作,输出溜冰鞋是否足够。

Input

n m k d ( 1≤n≤200,000 , 1≤m≤500,000 , 1≤k≤10^9 , 0≤d≤n ) ri xi ( 1≤i≤m, 1≤ri≤n-d , |xi|≤10^9 )

Output

对于每个操作,输出一行,TAK表示够 NIE表示不够。

Sample Input

4 4 2 1
1 3
2 3
3 3
2 -1

Sample Output

TAK
TAK
NIE
TAK

Solution

终于从网络流中解放出来了。

这题怎么说呢,还是和二分图有点关系。根据霍尔定理,我们可以得出如果在某一个时刻不符合要求的话,那么对于一个l,r,一定有\((r-l+1+d)*k<\sum_{l\le i \le r}a_i\)随便移项就可以得出\(\sum_{l\le i \le r}a_i-(r-l+1)\times k>d*k\)然后在建树的时候把所有点-k就可以用线段树维护了。

所以说这题叫动态最大子段和??

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#define re register
#define MAXN 200005
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(arr) memset(arr, 0, sizeof(arr))
#define int ll
const int inf = 0x3f3f3f3f;
int maxl[MAXN<<2],maxr[MAXN<<2],sum[MAXN<<2],maxx[MAXN<<2];
int n,m,K,d;
inline void pushup(int rt)
{
    sum[rt]=sum[ls]+sum[rs];
    maxl[rt]=max(maxl[ls],sum[ls]+maxl[rs]);
    maxr[rt]=max(maxr[rs],sum[rs]+maxr[ls]);
    maxx[rt]=max(maxx[ls],max(maxx[rs],maxl[rs]+maxr[ls]));
}
inline void build(int l,int r,int rt)
{
    if(l==r){
        maxx[rt]=-K;sum[rt]=-K;
        return;
    }
    build(l,mid,ls);build(mid+1,r,rs);
    pushup(rt);
}
inline void update(int x,int y,int l,int r,int rt)
{
    if(l==r) {
        maxx[rt]+=y;sum[rt]+=y;
        maxl[rt]=maxr[rt]=max(sum[rt],0ll);
        return;
    }
    if(mid>=x) update(x,y,l,mid,ls);
    else update(x,y,mid+1,r,rs);
    pushup(rt);
}
inline int read()
{
    int x=0,c=1;
    char ch=' ';
    while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
    while(ch=='-') c*=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();
    return x*c;
}
main()
{
    n=read();m=read();K=read();d=read();
    build(1,n,1);
    for(re int i=1;i<=m;i++){
        int x=read(),y=read();
        update(x,y,1,n,1);
        if(maxx[1]<=K*d) printf("TAK\n");
        else printf("NIE\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/victorique/p/9139512.html

时间: 2024-10-08 15:32:52

[POI2009]Lyz的相关文章

BZOJ1135: [POI2009]Lyz

1135: [POI2009]Lyz Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 264  Solved: 106[Submit][Status] Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人. 对于每次操作,输出溜冰鞋是否足够. Input n m k d ( 1≤n≤200,000 ,

【BZOJ1135】[POI2009]Lyz 线段树

[BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人. 对于每次操作,输出溜冰鞋是否足够. Input n m k d ( 1≤n≤200,000 , 1≤m≤500,000 , 1≤k≤10^9 , 0≤d≤n ) ri xi ( 1≤i≤m, 1≤ri≤n-d , |xi|≤10^9 ) Output

BZOJ 1135 POI2009 Lyz 线段树+Hall定理

题目大意:有1~n型号的滑冰鞋,每种有k双,一个x号脚的人只能适应[x,x+d]号滑冰鞋,每次增加一些x号脚的人或减少一些x号脚的人,问能否匹配 http://m.blog.csdn.net/blog/u012732945/40707885 OTZ 这题我居然还能贡献一个WA真是醉了 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M

BZOJ 1135 [POI2009]Lyz 线段树

题意:链接 方法:线段树维护子区间最值. 解析: 我们可以推出来一个式子. 就是如果满足题意的话. 那么任意一个子区间[l,r] f[i]表示穿i的鞋的人数 (r?l+1+d)?k>=∑f[i](l<=i<=r) d?k>=∑(f[i]?k) 所以维护个区间最大值即可. 最大值比d*k小的话显然满足. 复杂度O(nlogn+mlogn); 代码: #include <cstdio> #include <cstring> #include <iostre

【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)

题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这个时候我们可以根据霍尔定理得出满足人人有鞋子穿的时候的式子是 令\(sum[i]\)表示穿\(i\)号鞋子的人数 \[\Sigma^r_{i=l} sum[i] \leq (r-l+1+d)*k\] 我们把这个式子整理下: \[\Sigma^r_{i=l} (sum[i]-k) \leq d*k\]

【BZOJ 1119】 1119: [POI2009]SLO (置换)

1119: [POI2009]SLO Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次交换的代价之和.请问将(ai)变为(bi)所需的最小代价是多少. Input 第一行N.第二行N个数表示wi.第三行N个数表示ai.第四行N个数表示bi. 2<=n<=1000000 100<=wi<=6500 1<=ai,bi<=n ai各不相等,bi各不相等 (ai)&

BZOJ1119: [POI2009]SLO

1119: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 379  Solved: 181[Submit][Status] Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次交换的代价之和.请问将(ai)变为(bi)所需的最小代价是多少. Input 第一行N. 第二行N个数表示wi. 第三行N个数表示ai. 第四行N个

BZOJ 1115: [POI2009]石子游戏Kam

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 924  Solved: 574[Submit][Status][Discuss] Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行

bzoj1137【POI2009】Wsp 岛屿

1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 75  Solved: 38 [Submit][Status][Discuss] Description Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道路与未被控制的道路的交点.