BZOJ4113 : [Wf2015]Qanat】的更多相关文章

设$f_i$表示用$i$个辅助井时代价的最小值,$x_i$表示此时最后一个辅助井的位置. 则$f_i$是关于$x_i$的一个二次函数,其中系数跟$f_{i-1}$有关,递推求出极值点即可. 时间复杂度$O(n)$. #include<cstdio> #define N 1010 double w,h,A,B,a,b,x[N],f[N];int n,i; int main(){ scanf("%lf%lf%d",&w,&h,&n); h/=w; A=1…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
4108: [Wf2015]Catering 题意:有一家装备出租公司收到了按照时间顺序排列的n个请求. 这家公司有k个搬运工.每个搬运工可以搬着一套装备按时间顺序去满足一些请求.一个搬运工从第i个请求的位置把东西搬到第j个请求的位置需要一些费用.公司的编号是1,请求的编号是2到n+1.所有搬运工必需从公司出发.求满足所有请求所需的最小搬运费用. laekov 翻译水平高超 orz 每个点只能经过一次,从1号点出发最多m次,最小花费 拆点上下界限制次数和之前做的差不多 唯一坑人的地方是注意1是公…
[BZOJ4108][Wf2015]Catering Description 有一家装备出租公司收到了按照时间顺序排列的n个请求. 这家公司有k个搬运工.每个搬运工可以搬着一套装备按时间顺序去满足一些请求.一个搬运工从第i个请求的位置把东西搬到第j个请求的位置需要一些费用.公司的编号是1,请求的编号是2到n+1.所有搬运工必需从公司出发. 求满足所有请求所需的最小搬运费用. Input 有可能有多组数据(我也不知道). 第一行两个正整数n,k. 接下来n行,第i行有n-i+1个数.第j个数表示把…
[Wf2015]Tours 题目 给定一张n个点m条边的无向图,你需要选择一个颜色种类数k,然后用这k种颜色给每条边染色,要求对于图中任意一个简单环,每种颜色的边的数量都相同,求所有可行的k INPUT 第一行两个正整数n,m接下来m行,每行两个正整数x,y(1<=x<y<=n),代表一条无向边数据保证无重边无自环 OUTPUT 一行输出所有可行的k,按递增顺序输出 6 6 1 2 2 3 1 3 1 4 2 5 3 6 SAMPLE INPUT 6 6 1 2 2 3 1 3 1 4…
将边集划分成若干极大不相交集合,满足每个简单环都可以由某些集合相加得到,则答案就是这些集合大小的$\gcd$的约数. 对于一个简单环,上面的边一定不是桥边,而和它在一个集合的边肯定不在其他简单环上.因此删除它之后,这些边就从非桥边变成了桥边. 枚举每条非桥边跑Tarjan计算答案即可. 时间复杂度$O(m(n+m))$. #include<cstdio> const int N=2005,BUF=21000; int n,m,i,x,y,now,ans,D,cut[N],g[N],v[N<…
首先将速度相减,变成A在动而B不动,若速度为0则显然永远不会相交. 枚举A的每个点以及B的每条线段,计算这三个点共线的时刻. 将时刻排序,对于每个区间进行三分,用半平面交计算相交面积. 注意特判相交面积为0但是存在交点的情况. 时间复杂度$O(n^4\log^2n)$. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=200; const doub…
OPEN.CLOSE.RESIZE操作直接模拟即可. 对于MOVE,设$f_i$表示$i$号矩形的坐标,先无视边界通过DP求出每个矩形的坐标,再根据边界反向用第二次DP求出被移动矩形移动的真实距离,再正着进行一次DP即可. 时间复杂度$O(n^3)$. #include<cstdio> #include<algorithm> #define N 260 #define rep(i) for(int i=1;i<=n;i++) using namespace std; int…
枚举答案,考虑将速度区间等长地划分成若干个小区间. 设$n_i$表示$i$次敲击能得到的区间数,$v_i$表示$i$次敲击之后答案落在$[v1,v_i]$之间,则$n_0=1,v_0=v2$. 因为对于第$i$次敲击的时候,$v_f=\frac{l}{s(i+1)}$以上的速度是无法查询的,所以$[v_f+t,v_{i-1}]$这段区间必须要在之前就被询问掉,这需要$n_f=\lceil\frac{\max(v_i-v_f-t,0)}{t})\rceil$个区间. 然后用敲击来进行二分答案,因此…
首先每个串都必须是$S$的子序列,否则无解. 按长度从小到大依次考虑每个串,如果它两边都不能放,那么无解. 如果能放一边,那么放进去,把待定的全部放入另一边. 如果两边都能放,那么看看能否待定,如果不能则把它和待定的分别放入两边. 时间复杂度$O(nm)$. #include<cstdio> #include<cstring> #include<algorithm> #define N 4005 int n,i,j,x,y,len[N],b[N],f[2][N],cnt…