BZOJ 4341 [CF253 Printer] 解题报告
乍一看这个题好像可以二分优先度搞搞。。。
实际上能不能这么搞呢。。。?
我反正不会。。。
于是开始讲我的乱搞算法:
首先肯定要把任务按照优先度排序。
用一棵在线建点的线段树维护一个时刻是否在工作。
然后就依次插入任务,记为 i,具体而言就是二分其右端点,然后令这整个区间都变成 “工作” 的状态。
在 i 被插入之前,还要检验一下在当前情况那个神秘任务的右端点是不是题中所要求的那个。
如果是,并且 i-1 的优先度和 i 的优先度不相邻或者 i 就是最优先的任务,那么就令那个神秘任务的优先度为 i 的优先度+1。
然后把这个神秘任务插入,再来考虑任务 i。
这么写完之后发现超时了。一个点要跑 2.5s 左右。
实际上到了后面,超过 10^9 的时间是一段 1,然后才是 0。
所以这里我们只需维护这个分界点就可以了。
线段树的上界就从 10^15 变成了 10^9,比原来快了一倍。
于是就可以 AC 了。
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = + ;
const int M = + ;
const int T = ; int n, root, tot, ans_p;
LL end, Tend = T, owari, Ans[N]; struct Segment_Tree
{
int l, r, sum;
}h[M]; struct Task
{
int s, t, p, id;
Task (int _s = , int _t = , int _p = , int _id = ) {s = _s, t = _t, p = _p, id = _id;}
bool operator < (const Task a) const
{
return p > a.p;
}
}P[N]; inline void Modify(int &x, int l, int r, int s, int t)
{
if (!x) x = ++ tot;
if (l == s && r == t) h[x].sum = r - l + ;
if (h[x].sum == r - l + ) return ;
LL mid = l + r >> ;
if (t <= mid) Modify(h[x].l, l, mid, s, t);
else if (s > mid) Modify(h[x].r, mid + , r, s, t);
else Modify(h[x].l, l, mid, s, mid), Modify(h[x].r, mid + , r, mid + , t);
h[x].sum = h[h[x].l].sum + h[h[x].r].sum;
} inline LL Query(int x, int l, int r, int s, int t)
{
if (!x) return ;
if (h[x].sum == r - l + ) return t - s + ;
if (l == s && r == t) return h[x].sum;
LL mid = l + r >> ;
if (t <= mid) return Query(h[x].l, l, mid, s, t);
else if (s > mid) return Query(h[x].r, mid + , r, s, t);
else return Query(h[x].l, l, mid, s, mid) + Query(h[x].r, mid + , r, mid + , t);
} inline LL Calc(Task x)
{
int need = x.t;
int blank = T - x.s + - Query(, , T, x.s, T);
if (blank < need) return need - blank + Tend;
int l = x.s, r = T;
while (l < r)
{
int mid = l + r >> ;
blank = mid - x.s + - Query(, , T, x.s, mid);
if (blank < need) l = mid + ;
else r = mid;
}
return l;
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i ++)
{
int s, t, p;
scanf("%d%d%d", &s, &t, &p);
if (p == -) p = ;
P[i] = Task(s, t, p, i);
}
sort(P + , P + n + );
scanf("%lld", &end);
Ans[P[n].id] = end;
for (int i = ; i <= n; i ++)
{
if (ans_p) goto deal;
owari = Calc(P[n]);
if (owari + == end && (i == || P[i].p != P[i - ].p - ))
{
ans_p = P[i].p + ;
Modify(root, , T, P[n].s, owari < T ? owari : T);
Tend = Tend > owari ? Tend : owari;
} deal :;
if (i == n) continue ;
owari = Calc(P[i]);
Modify(root, , T, P[i].s, owari < T ? owari : T);
Tend = Tend > owari ? Tend : owari;
Ans[P[i].id] = owari + ;
}
printf("%d\n", ans_p);
for (int i = ; i <= n; i ++)
printf("%lld%c", Ans[i], i == n ? '\n' : ' '); return ;
}
4341_Gromah
BZOJ 4341 [CF253 Printer] 解题报告的更多相关文章
- BZOJ 4619 Swap Space 解题报告
今天是因为David Lee正好讲这个题的类似题,我才做了一下. 本题是world final 2016的一道水…… 题目地址如下 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 2839: 集合计数 解题报告
BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...
- BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...
- BZOJ 1044 木棍分割 解题报告(二分+DP)
来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...
- BZOJ 4036 [HAOI2015] Set 解题报告
首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...
- BZOJ 3288 Mato矩阵 解题报告
这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...
- BZOJ 4123 [Baltic2015] Hacker 解题报告
首先,Alice 会选择一个长度为 $\lfloor\frac{n+1}{2}\rfloor$ 的区间,我们把这个长度记为 $len$. 有这么一个结论:令 $F_i$ 为覆盖 $i$ 点的所有长度为 ...
- BZOJ 4146 [AMPPZ2014] Divisors 解题报告
这个题感觉比较小清新... 我们记录每个数出现的次数 $T_i$. 首先依次枚举每个数字,令 $ans = ans + T_i \times (T_i - 1)$,然后枚举这个数的倍数,令 $ans ...
- BZOJ 3971 Матрёшка 解题报告
很自然想到区间 DP. 设 $Dp[i][j]$ 表示把区间 $[i, j]$ 内的套娃合并成一个所需要的代价,那么有: $Dp[i][i] = 0$ $Dp[i][j] = min\{Dp[i][k ...
随机推荐
- Ubuntu中设置永久的DNS
通过修改: sudo vi /etc/resolvconf/resolv.conf.d/base(这个文件默认是空的) 在里面插入:nameserver 8.8.8.8nameserver 8.8.4 ...
- Firefox 与 IE 对Javascript和CSS的区别
1. document.formName.item("itemName") 问题 说明:IE下,可以使用document.formName.item("itemName& ...
- 火狐谷歌浏览器Json查看插件
1.搜: Firefox的JSON插件 参考: Chrome/FireFox浏览器下处理JSON的插件_Bruce_新浪博客 JSONView :: Firefox 附加组件 但是后来去发现没用: 打 ...
- zedboard 构建嵌入式linux
本文通过五部完成zedboard的嵌入式LINUX搭建,所谓磨刀不五砍材工嘛 1:系统环境搭建 要准备好交叉编译环境 见http://blog.csdn.net/xiabodan/article/de ...
- (一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习
ThinkPHP作为国内具有代表性的PHP框架,经过多年的发展,受到越来越多公司与开发者的青睐.我也在忙里偷闲中抽出部分时间,来学习这个优秀的框架.在开始学习这个框架时,最好通过实例来学习,更容易结合 ...
- 如何使用NET Reactor为您的.Net(C#,VB.Net) 源代码加密
前言 VS开发的源代码安全性,是很多开发者头痛的事情.于是保护好源代码便成了开发者们最关心的事情之一了. 在网上搜一搜,很多有不少的第三方工具可以为源代码加密.加密方式不外乎就是混淆,加壳. 理论上, ...
- PHPcms 摘要
一 常量 /** * 主要定义了路径常量,项目中经常用到 **/ define('PHPCMS_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR);// 项目 ...
- WPF学习01:初始XAML浅析
本文内容: 浅析WPF应用默认创建的XAML中元素.attributes. 新建WPF工程“HelloWPF”. 初始创建的主窗体XAML代码如下: <Window x:Class=" ...
- gif修改背景透明
1.用ImageReady打开,将选中所有帧,右键选择“恢复为背景”. 2.打开“颜色板”,点击左下角的惊叹号,用吸色器点击背景,颜色板自动选中了背景色,将其映射为透明. 3.文件->将优化结果 ...
- mapreduce 实现pagerank
输入格式: A 1 B,C,D B 1 C,Dmap: B A 1/3 C A 1/3 D A 1/3 A |B,C,D C B 1/2 D B 1/2 B |C,Dreduce: B (1-0.85 ...