Everyone is a winner

题目链接:AGC053D

题目大意

有 n 个人 n 道题目,每个人做其中 ai 个题目需要 1 分钟,bi 个题目需要 2 分钟,ci 个题目需要 3 分钟。
需要你给每个人安排做每道题用的时间,使得第 i 个人是最早做完 i 道题目的人之一。
问你是否能安排出合法的方案。

思路

发现如果我们确定了前 i i i 步做什么,剩下的做法是显然的:
就是不要太快,所以是从大到小放。
那前面的也是不能太快,因为你最终到 i i i 的时间已经固定,所以我们也是从大到小放。

于是有这么一个猜想过程,我们让 f i , j f_{i,j} fi,j​ 为 i i i 这个人做了 j j j 题目需要的时间,然后我们有一个限制 T i T_i Ti​ 就是前 i i i 道题最早被解决掉的时间(在考虑的人之中)。

那先考虑后面的怎么放(从后面往前看是因为最后的位置放的是确定的),那首先是肯定给前面的留空间,所以我们最大化做完 i i i 题需要的时间,接着我们让 3 3 3 尽可能的多(这样不容易比别人快)

那求出上面的 f f f 之后,我们可以给 T i T_i Ti​ 更新限制: T y = min ⁡ ( T y , t x , y ) ( 1 ⩽ y < x ) T_y=\min(T_y,t_{x,y})(1\leqslant y<x) Ty​=min(Ty​,tx,y​)(1⩽y<x)
那我们给前面的留了空间,但是后面的呢?它会不会因此比后面的更快呢?

我们其实可以通过证明发现在只有 1 , 2 , 3 1,2,3 1,2,3 这种耗时的情况下,是不会有的。
考虑分类讨论,如果我们有 T i + 2 ⩾ T i + 1 T_i+2\geqslant T_{i+1} Ti​+2⩾Ti+1​(就是这前面 i + 1 i+1 i+1 个不是都填 3 3 3,因为如果不是,至少会有 2 / 1 2/1 2/1 在最后)
那我们扩展一下对于 j > i , T i + 2 ( j − i ) ⩾ T j j>i,T_i+2(j-i)\geqslant T_j j>i,Ti​+2(j−i)⩾Tj​。
那自然合法。

那如果是都填 3 3 3,那对于前面的一段都填 3 3 3 的,那比它编号小的人要做到前面的某个时刻比他小或者跟它一样,这个时刻又要比它大或者一样,所以就也是全 3 3 3,那后面的数也是一个道理,那这 n n n 个人的前 i + 1 i+1 i+1 个都是 3 3 3,那也就没啥事了。
后面出现了没有 3 3 3,那又是上面的情况了。

所以是对的!

那我们就用一个斜率为 1 / 2 / 3 1/2/3 1/2/3 的凸包来维护 T T T 这个东西。
然后这里的 T T T 其实我们减可以直接一个一个减,因为这个东西是递减的,均摊下来只会减 O ( n ) O(n) O(n) 次。

然后就是看给你 T T T,要你看是否合法:
考虑化一下式子得到一些不等式:
x + y + z = i x+y+z=i x+y+z=i
x + 2 y + 3 z = t x+2y+3z=t x+2y+3z=t
(解二元一次方程,以 y , z y,z y,z 为未知数)
y + z = i − x , 2 y + 3 z = t − x y+z=i-x,2y+3z=t-x y+z=i−x,2y+3z=t−x
y = − 2 x − t + 3 i y=-2x-t+3i y=−2x−t+3i
z = x + t − 2 i z=x+t-2i z=x+t−2i

x = z − t + 2 i = 3 i − t − y 2 x=z-t+2i=\dfrac{3i-t-y}{2} x=z−t+2i=23i−t−y​
0 ⩽ x ⩽ a i , 0 ⩽ y ⩽ b i , 0 ⩽ z ⩽ c i 0\leqslant x\leqslant a_i,0\leqslant y\leqslant b_i,0\leqslant z\leqslant c_i 0⩽x⩽ai​,0⩽y⩽bi​,0⩽z⩽ci​(这是条件,两个极值分别带入)
2 i − t ⩽ x ⩽ c i + 2 i − t , 3 i − t − b i + 1 2 ⩽ x ⩽ 3 i − t 2 2i-t\leqslant x\leqslant c_i+2i-t,\dfrac{3i-t-b_i +1}{2}\leqslant x\leqslant \dfrac{3i-t}{2} 2i−t⩽x⩽ci​+2i−t,23i−t−bi​+1​⩽x⩽23i−t​
(注意第二个式子的多边界,要在上面 + 1 +1 +1,因为它上面 x = x= x= 的位置不能直接这么看,你真正要满足的是上面方程解出来的结果,所以要记得 + 1 +1 +1,不加样例也过不了)

代码

#include<cstdio>
#include<iostream>
#define INF 0x3f3f3f3f3f3f3f3fusing namespace std;const int N = 2e5 + 100;
int n, a[N], b[N], c[N];struct Line {int a, b, c;//斜率(填1/2/3)对应的截距 Line(int aa = INF, int bb = INF, int cc = INF) {a = aa; b = bb; c = cc;}int get_val(int x) {return min(min(a + x, b + 2 * x), c + 3 * x);}
}T;Line merge(Line x, Line y) {return Line(min(x.a, y.a), min(x.b, y.b), min(x.c, y.c));
} void slove() {scanf("%d", &n); T = Line();for (int i = 1; i <= n; i++) {scanf("%d %d %d", &a[i], &b[i], &c[i]);T = merge(T, Line(b[i] + 2 * c[i], c[i], 0));}bool yes = 1;for (int i = n; i >= 1; i--) {int t = T.get_val(i), x;while (t >= 0) {x = min(a[i], min(c[i] + 2 * i - t, (3 * i - t) / 2));if (x >= max(0, max(2 * i - t, (3 * i - t - b[i] + 1) / 2))) break;t--;}if (t < 0) {yes = 0; break;}int y = -2 * x - t + 3 * i, z = x + t - 2 * i;T = merge(T, Line(y + 2 * z, z, 0));}if (yes) printf("Yes\n");else printf("No\n");
}int main() {int T; scanf("%d", &T);while (T--) slove();return 0;
}

【AGC053D】Everyone is a winner(贪心)(凸包)相关推荐

  1. 【2019南昌邀请赛现场赛 - G】Winner(建图,tarjan缩点 或 贪心)

    题目大意: n个人参加竞技比赛.比赛由三种模式a,b,c,每个人在每种模式下有对应的权值a[i]b[i]c[i].举行n−1场比赛,每场比赛主办方可以选择两个人决斗,能力值低的人淘汰.这样保证n-1场 ...

  2. nyoj--364--田忌赛马(贪心)

    田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Here is a famous story in Chinese history. "That wa ...

  3. Gym - 101471D Money for Nothing(决策单调性+分治+贪心)

    题目链接:点击查看 题目大意:在二维平面中给出 n 个点可以作为矩形左下角的点,再给出 m 个点可以作为矩形右上角的点,现在问最大可以构造出多大面积的矩形,即如何选择,可以使得 ( b[ j ] . ...

  4. upc 组队赛18 STRENGTH【贪心模拟】

    STRENGTH 题目链接 题目描述 Strength gives you the confidence within yourself to overcome any fears, challeng ...

  5. [NOI2007] 货币兑换 (dp+李超树维护凸包)

    description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个实 ...

  6. c++ 凸包 分治算法_三维凸包

    缘起 众所周知,二维凸包可以使用 Graham 扫描 内解决. 所以本文来学习一下三维空间中凸包的一种直观算法--增量算法(increment algorithm) 分析 有一条叫 Willy 的苹果 ...

  7. 贪心法田忌赛马问题Java代码,hdoj 1052 Tian Ji - The Horse Racing【田忌赛马】 【贪心】...

    hdoj 1052 Tian Ji -- The Horse Racing[田忌赛马] [贪心] 思路:先按从小到大排序, 然后从最快的开始比(假设i, j 是最慢的一端, flag1, flag2是 ...

  8. UVA10602 Editor Nottoobad【贪心】

    Company Macrohard has released it's new version of editor Nottoobad, which can understand a few voic ...

  9. 2018 Multi-University Training Contest 3: G. Interstellar Travel(凸包)

    题意:给你平面上n个点,第一个点一定在(0, 0),第n个点的y坐标一定为0,除此之外中间所有点的x坐标一定大于0且小于最后一个点的x坐标,你从一号点开始出发,中间从第i个点到第j个点必须满足xj&g ...

最新文章

  1. 你认识的世界与客观世界间差了N光年
  2. 智能车百度赛道培训第二弹-算法篇
  3. TFS的Web门户工作项(七)
  4. 推荐常用算法之-基于内容的推荐(转自-BreezeDeus博主)
  5. 《TCP/IP Sockets 编程》笔记5
  6. C语言的数组基础,C语言基础-数组
  7. python字符串迭代_Python字符串迭代/函数
  8. 【noi 2.6_2421】Exchange Rates(DP)
  9. 洛谷P2486 [SDOI2011]染色(树链剖分+线段树判断边界)
  10. 2019年,网站优化,该如何正视SEO?
  11. 【计算机网络笔记】物理层:概念传输媒体传输方式
  12. 【送书活动】一本超牛作者,超牛口碑,超牛销量的R数据科学重磅图书免费送啦!...
  13. mysql中各种连接的区别
  14. 计算机网络培训心得PPT,ppt培训心得体会(精选3篇)
  15. 上海计算机科学大学排名,2019上海软科世界一流学科排名计算机科学与工程专业排名卡耐基梅隆大学排名第4...
  16. (已解决)vue数组添加数据后页面无法实时渲染
  17. Ubuntu卸载安装包
  18. js页面加载实现loading提示效果
  19. Shell 脚本 — 多行注释、开启子/不开启子进程执行、转义带颜色输出、读取键盘输入、输入输出重定向、单双引号、命令替换、读取变量、系统变量、正则过滤、算术运算、一行多条命令、字符串比较
  20. 【窗体控件】:Button按钮控件

热门文章

  1. Creo3.0模板设置
  2. Flutter 系统弹框
  3. 优信与汽车之家二手车达成合作 将在交易解决方案等方面展开合作
  4. 序列化与反序列化原理
  5. 空间同位模式挖掘 co-location
  6. 《剑指offer》(第二版)题集目录索引
  7. Schnorr数字签名方案
  8. LinuxCNC的初步了解
  9. idea插件Rainbow Brackets---标识成对括号“彩虹色的括号”
  10. iPhone XS 上的 Siri 没反应怎么办?苹果手机无法使用嘿 Siri 解决方法