乍一看这个题好像可以二分优先度搞搞。。。

实际上能不能这么搞呢。。。?

我反正不会。。。

于是开始讲我的乱搞算法:

首先肯定要把任务按照优先度排序。

用一棵在线建点的线段树维护一个时刻是否在工作。

然后就依次插入任务,记为 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] 解题报告的更多相关文章

  1. BZOJ 4619 Swap Space 解题报告

    今天是因为David Lee正好讲这个题的类似题,我才做了一下. 本题是world final 2016的一道水…… 题目地址如下 http://www.lydsy.com/JudgeOnline/p ...

  2. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  3. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  4. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  5. BZOJ 4036 [HAOI2015] Set 解题报告

    首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...

  6. BZOJ 3288 Mato矩阵 解题报告

    这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...

  7. BZOJ 4123 [Baltic2015] Hacker 解题报告

    首先,Alice 会选择一个长度为 $\lfloor\frac{n+1}{2}\rfloor$ 的区间,我们把这个长度记为 $len$. 有这么一个结论:令 $F_i$ 为覆盖 $i$ 点的所有长度为 ...

  8. BZOJ 4146 [AMPPZ2014] Divisors 解题报告

    这个题感觉比较小清新... 我们记录每个数出现的次数 $T_i$. 首先依次枚举每个数字,令 $ans = ans + T_i \times (T_i - 1)$,然后枚举这个数的倍数,令 $ans ...

  9. BZOJ 3971 Матрёшка 解题报告

    很自然想到区间 DP. 设 $Dp[i][j]$ 表示把区间 $[i, j]$ 内的套娃合并成一个所需要的代价,那么有: $Dp[i][i] = 0$ $Dp[i][j] = min\{Dp[i][k ...

随机推荐

  1. 上传至应用商店以及testflight相关。

    对于一个新的开发者账号来说,首先你需要创建一个新的发布证书.这个证书只要创建一次就行了,如果以后用的话,直接拿过来用就行了,当然发布证书是和配置文件一起使用的,还有就是关于p12,就是用创建证书的电脑 ...

  2. IOS开发: 为UIImageView添加点击事件

    转载于:http://www.pocketdigi.com/20140218/1276.html UIImageView并不像UIButton一样,点点鼠标就可以关联点击事件,也不像Android里有 ...

  3. CString使用

    1. 空间分配,如果不是它自己的空间分配方式,需要用函数来手动分配空间,否则大家指向同一块地址,取得内容一样 例子,读取文件到CString ,没有给CString 对象分配空间,而且不是他定义的开拓 ...

  4. 【风马一族_xml】xml的两种解析思想

    xml的解析思想 dom解析 将整个xml使用类似树的结构保存在内存中,再进行对其操作 是woc组织推荐的处理xml的一种方式 需要等到xml完全加载进内存才可以进行操作 耗费内存.当解析超大的xml ...

  5. 实验九--裸机LCD

    一.环境 系统:ubuntu12.04 开发板:jz2440 编译器:gcc 二.说明 有空补上 三.代码 Makefile: CC = arm-linux-gcc LD = arm-linux-ld ...

  6. CSS3 text-rendering属性

    这种非标准的属性目前不被推荐.我们一般会找一个可以替代的方法来完成相同的功能,不到外不得已,最好别用.   CSS的这个text-rendering属性通常被用在Windows和Linux系统中,用来 ...

  7. ZK framework on Java

    Quick start: https://www.zkoss.org/documentation Live demo: https://www.zkoss.org/zkdemo/file_handli ...

  8. 如何开启MYSQL远程连接权限

    开启MYSQL远程连接权限 //建议设置固定IP mysql> GRANT ALL PRIVILEGES ON *.* TO root@"8.8.8.8" IDENTIFIE ...

  9. C# 发邮件类可发送附件

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ne ...

  10. [JQuery]学习总结

    1. Jquery 选择多个class 如何精确匹配 $("div[class='class1 class2']").css({ "margin-bottom" ...