解题:POI 2009 Lyz

Posted ydnhaha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题:POI 2009 Lyz相关的知识,希望对你有一定的参考价值。

题面

板板讲的霍尔定理

霍尔定理:一张二分图有完全匹配的充要条件是对于任$i$个左部点都有至少$i$个右部点与它们相邻。放在这个题里就是说显然最容易使得鞋不够的情况是一段连续的人,那就维护一下最大子段和就好了=。=

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=200005;
 6 long long ll[4*N],rr[4*N],len[4*N],val[4*N];
 7 long long n,m,k,d,t1,t2;
 8 void pushup(int nde)
 9 {
10     int ls=2*nde,rs=2*nde+1;
11     ll[nde]=max(val[ls]+ll[rs],ll[ls]);
12     rr[nde]=max(val[rs]+rr[ls],rr[rs]);
13     len[nde]=max(max(len[ls],len[rs]),rr[ls]+ll[rs]);
14     val[nde]=val[ls]+val[rs];
15 }
16 void create(int nde,int l,int r)
17 {
18     if(l==r) 
19         ll[nde]=rr[nde]=len[nde]=val[nde]=-k;
20     else
21     {
22         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1;
23         create(ls,l,mid),create(rs,mid+1,r);
24         pushup(nde);
25     }
26 }
27 void change(int nde,int l,int r,int pos,int task)
28 {
29     if(l==r) 
30     {
31         ll[nde]+=task,rr[nde]+=task;
32         len[nde]+=task,val[nde]+=task;
33     }
34     else
35     {
36         int mid=(l+r)/2,ls=2*nde,rs=2*nde+1;
37         if(pos<=mid) change(ls,l,mid,pos,task);
38         else change(rs,mid+1,r,pos,task);
39         pushup(nde);
40     }
41 }
42 int main ()
43 {
44     scanf("%lld%lld%lld%lld",&n,&m,&k,&d),create(1,1,n);
45     for(int i=1;i<=m;i++)
46     {
47         scanf("%lld%lld",&t1,&t2),change(1,1,n,t1,t2);
48         (len[1]<=k*d)?printf("TAK
"):printf("NIE
");
49     }
50     return 0;
51 }
52 
View Code

 

以上是关于解题:POI 2009 Lyz的主要内容,如果未能解决你的问题,请参考以下文章

[POI2009]Lyz

[POI2009]Lyz

bzoj 1135 [POI2009]Lyz 线段树+hall定理

BZOJ1135[POI2009]Lyz 线段树

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

题解Luogu P3488 [POI2009]LYZ-Ice Skates