解题: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\n"):printf("NIE\n");
49     }
50     return 0;
51 }
52 
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/9879018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值