bzoj1135
POI阴影又发作了
但这道题挺好的,比较涨知识
裸的想法是裸的每次二分图匹配,但显然会TLE
这里就要引入Hall定理:
二分图G中的两部分顶点组成的集合分别为X, Y, X={X1, X2, X3,X4,.........,Xm}, Y={y1, y2, y3, y4 ,.........,yn},
图G中有一组无公共点的边,一端恰好为组成X的点的充分必要条件是:
X中的任意k个点至少与Y中的k个点相邻。(1≤k≤m)
任意这个东西相当烦,不能穷举,也不知道底要取X集合中哪些点来判断,乍一看还是不怎么好弄
但是这个图很特殊,把人看做X集合,鞋看做Y集合
因为同一鞋号x的人连的鞋都是[x,x+d],所以集合X中同一个鞋号里的人要么取要么都不取(全取比取部分一定更具代表性)
然后再看,鞋号为x+1的人连的鞋是[x+1,x+1+d],会有[x+1,x+d]的点被鞋号为x+1的人重复连了
也就是人鞋号是连续的时候连接的鞋最少
显然,所取的鞋号为连续的更有代表性(更可能出现不满足的情况)
因此,我们必须对于任意一段连续鞋号[l,r]
满足sigma(xi) (i∈[l,r]) <=(r-l+1+d)*k
也就是 sigma(xi)<=(r-l+1)*k+d*k
即 sigma(xi-k)<=d*k
也就是我们只要找出当前最长连续子序列与d*k比较就可以了
由于要修改,所以我们用线段树来维护
好,到这里我又要说pascal的不幸了,TLE到死……实在懒得卡常数了,就交了c++的
- type node=record
- lm,rm,mm,s:int64;
- end;
- var tree:array[..] of node;
- n,m,k,d,i,x,y:longint;
- t:int64;
- function max(a,b:int64):int64;
- begin
- if a>b then exit(a) else exit(b);
- end;
- procedure work(i,l,r:longint);
- var m:longint;
- begin
- if l=r then
- begin
- tree[i].s:=tree[i].s+y;
- tree[i].lm:=tree[i].s;
- tree[i].rm:=tree[i].s;
- tree[i].mm:=tree[i].s;
- end
- else begin
- m:=(l+r) shr ;
- if x<=m then work(i*,l,m)
- else work(i*+,m+,r);
- tree[i].lm:=max(tree[i*].lm,tree[i*].s+tree[i*+].lm);
- tree[i].rm:=max(tree[i*+].rm,tree[i*+].s+tree[i*].rm);
- tree[i].mm:=max(tree[i*].mm,tree[i*+].mm);
- tree[i].mm:=max(tree[i].mm,tree[i*].rm+tree[i*+].lm);
- tree[i].s:=tree[i*].s+tree[i*+].s;
- end;
- end;
- procedure build(i,l,r:longint);
- var m:longint;
- begin
- if l=r then
- begin
- tree[i].s:=-k;
- tree[i].lm:=-k;
- tree[i].rm:=-k;
- tree[i].mm:=-k;
- end
- else begin
- m:=(l+r) shr ;
- build(i*,l,m);
- build(i*+,m+,r);
- tree[i].lm:=max(tree[i*].lm,tree[i*].s+tree[i*+].lm);
- tree[i].rm:=max(tree[i*+].rm,tree[i*+].s+tree[i*].rm);
- tree[i].mm:=max(tree[i*].mm,tree[i*+].mm);
- tree[i].mm:=max(tree[i].mm,tree[i*].rm+tree[i*+].lm);
- tree[i].s:=tree[i*].s+tree[i*+].s;
- end;
- end;
- begin
- readln(n,m,k,d);
- build(,,n);
- t:=int64(k)*int64(d);
- for i:= to m do
- begin
- readln(x,y);
- work(,,n);
- if tree[].mm<=t then
- writeln('TAK')
- else writeln('NIE');
- end;
- end.
bzoj1135的更多相关文章
- 【BZOJ1135】[POI2009]Lyz 线段树
[BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...
- BZOJ1135: [POI2009]Lyz
1135: [POI2009]Lyz Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 264 Solved: 106[Submit][Status] ...
- 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)
题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这 ...
- 【BZOJ1135】[POI2009]Lyz
题解: hall定理..第一次听说 思考了半小时无果 二分图匹配时间显然太大 但是有这个hall定理 二分图有完美匹配的充要条件是 对于左边任意一个集合(大小为|s|),其连边点构成的集合(大小为|s ...
- [BZOJ1135][POI2009]Lyz[霍尔定理+线段树]
题意 题目链接 分析 这个二分图匹配模型直接建图的复杂度太高,考虑霍尔定理. 对于某些人组成的区间,我们只需要考虑他们的并是一段连续的区间的集合.更进一步地,我们考虑的人一定是连续的. 假设我们考虑的 ...
- BZOJ1135:[POI2009]Lyz(线段树,Hall定理)
Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ...
- [bzoj1135][Ceoi2011]Match_线段树
[Ceoi2011]Match 题目大意:初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负, ...
- BZOJ1135 LYZ(POI2009) Hall定理+线段树
做这个题之前首先要了解判定二分图有没有完备匹配的Hall定理: 那么根据Hell定理,如果任何一个X子集都能连大于等于|S|的Y子集就可以获得完备匹配,那么就是: 题目变成只要不满足上面这个条件就能得 ...
- [bzoj1135]Lyz
可以看成一张二分图,判断左半部分是否存在完美匹配根据hall定理,当且仅当左半部分每一个子集所连向的点数量超过了这个子集的大小都判定复杂度肯定爆炸,可以贪心,一定选择的是一个区间,即对于任意区间[l, ...
随机推荐
- Java基础知识强化之集合框架笔记18:List集合特有的ListIterator迭代器
1. ListIterator(列表迭代器): ListIterator listIterator():List集合特有的迭代器 2. 代码示例: package cn.itcast_04; impo ...
- Java——(二)Java集合容器
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本概念 1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则.Lis ...
- springmvc配置文件 spring-servlet
<?xml version="1.0" encoding="UTF-8"?><!-- Bean头部 --><beans xmlns ...
- Java实现ajax
jsp端的代码,sucess:function(){} 里面就是返回的处理 function ChangeTime(){ alert("www"); var startYmd = ...
- Encapsulation.
Access control is often referred to as implementation hiding. Wrapping data and methods within class ...
- 1 加到 100 的 时间复杂度 C#.
//1 加到 100 的 时间复杂度: ; ; ; i <= n; i++){ sum += i; } T() = ; //Initialize 'n'. T() = ; //Initializ ...
- linux 命令学习(4)
Linux中常用的关机和重新启动命令有shutdown.halt.reboot以及init,它们都可以达到关机和重新启动的目的,但是每个命令的内部工作过程是不同的,下面将逐一进行介绍. 1. shut ...
- hdoj 1087 (DP)
代码: #include<iostream> #include<cmath> using namespace std; int a[1005], dp[1005]; ...
- 【HDU4366】【DFS序+分块】Successor
Problem Description Sean owns a company and he is the BOSS.The other Staff has one Superior.every st ...
- php 备份和还原数据库
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $int ...