2016北京集训测试赛(十六)Problem A: 任务安排
Solution
这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!!
这道题有两种思路. 比较容易想到的(也是我考场上想的)一种是: 把所有任务按照权值从大到小排序, 从权值大的开始安排, 将其安排在尽可能靠后的位置; 假如位置不够, 安排不下, 则可停止. 但这样非常难统计答案, 我想到的做法是用线段树的分裂与合并来维护整个区间. 但考虑到时间复杂度以及常数大小, 还是果断放弃了.
第二种做法是考虑每个时间点在做哪个任务. 我们把所有任务按照结束时间从大到小排序, 从大到小遍历两个任务之间的事件间隔, 用优先队列来决策当前一段做哪个任务; 同时记录每个任务的完成进度, 假如当前区间把这个任务做完了, 那么在优先队列中把这个任务弹出, 接着考虑下一个任务.
#include <cstdio>
#include <algorithm>
const int N = (int)5e6;
int n, d[N], cnt[N], val[N];
int flg[(int)1e7];
struct mission
{
int d, c, v;
inline int operator <(const mission a) const {return v > a.v;}
}a[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("schedule.in", "r", stdin);
freopen("schedule.out", "w", stdout);
#endif
fread(&n, 4, 1, stdin); fread(d, 4, n, stdin); fread(cnt, 4, n, stdin); fread(val, 4, n, stdin);
// scanf("%d", &n); for(int i = 0; i < n; ++ i) scanf("%d", d + i); for(int i = 0; i < n; ++ i) scanf("%d", cnt + i); for(int i = 0; i < n; ++ i) scanf("%d", val + i);
for(int i = 0; i < n; ++ i) a[i].d = d[i], a[i].c = cnt[i], a[i].v = val[i];
std::sort(a, a + n);
long long ans = 0;
for(int i = 0; i < n; ++ i)
{
int cnt = 0;
for(int j = a[i].d; cnt < a[i].c && j; -- j) if(! flg[j]) ++ cnt, flg[j] = 1;
ans += (long long)cnt * a[i].v;
}
printf("%lld\n", ans);
}
2016北京集训测试赛(十六)Problem A: 任务安排的更多相关文章
- 2016北京集训测试赛(六)Problem B: 矩阵
Solution 最小割. 参考BZOJ 3144切糕 在那道题的基础上将建图方法稍作变形: 我们对格子进行黑白染色, 对于两个格子之和\(\le k\)的限制, 就可以确定其中一个是白色格子, 一个 ...
- 2016北京集训测试赛(六)Problem A: 冒泡排序
Solution 观察冒泡排序的过程. 我们注意到, 每一轮的排序都会使得每个数后面比它小的数的个数减\(1\). 我们用\(f(n, m)\)表示对\(1\)到\(n\)的一个排列进行冒泡排序, 满 ...
- 2016北京集训测试赛(十六)Problem C: ball
Solution 这是一道好题. 考虑球体的体积是怎么计算的: 我们令\(f_k(r)\)表示\(x\)维单位球的体积, 则 \[ f_k(1) = \int_{-1}^1 f_{k - 1}(\sq ...
- 2016北京集训测试赛(十六)Problem B: river
Solution 这题实际上并不是构造题, 而是一道网络流. 我们考虑题目要求的一条路径应该是什么样子的: 它是一个环, 并且满足每个点有且仅有一条出边, 一条入边, 同时这两条边的权值还必须不一样. ...
- 【2016北京集训测试赛(十六)】 River (最大流)
Description Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...
- 2016北京集训测试赛(十四)Problem B: 股神小D
Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...
- 2016北京集训测试赛(十四)Problem A: 股神小L
Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...
- 2016北京集训测试赛(十)Problem A: azelso
Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...
- 【2016北京集训测试赛(十)】 Azelso (期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...
随机推荐
- codeforce GYM 100741 A Queries
A. Queries time limit per test:0.25 s memory limit per test:64 MB input:standard input output:standa ...
- IOS笔记049-UITabBarController
1.简单实现 效果:在视图底部显示一个工具栏 代码实现 // 创建窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScre ...
- git:多个sshkey配置
克隆项目: 使用git clone +项目.git地址 例如: 创建SSH Key: ssh-keygen -t rsa -C +邮箱地址 sshkey自定义保存:创建后在第二步(enter file ...
- C# 反射修改私有静态成员变量
//动态链接库中PvsApiIfCtrl.Cls.Cls_Public类有一变量 private static string key="abcd";//下面通过反射的技术修改和获取 ...
- [oldboy-django][2深入django]Form总结
1 form总结 # Form数据格式验证 - 原理: - 流程 a.写类LoginForm(Form): 字段名 = fields.xxFields() # 验证规则,本质是正则表达式(fields ...
- java 例子
1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一个重要的命令javac ...
- js深度复制
项目过程遇到需要对一个对象处理,然后独立出来用,结果怎么处理都会影响到原有变量,原来是引用导致,只有深度复制才行. 最终用下面的赋值方法才搞成功 var result=$.extend( true, ...
- linux 相关知识
在mac 终端中可以直接访问ssh 命令:ssh root@127.0.0.* 批量删除文件: 当前目录下所有 *.html文件,除了index.html [root@whr ...
- i++ 和++i 的理解 以防面试
根本原理: //模拟 a++ function afterAdd(){ var temp = a; a = a+1; return temp; } //模拟++a; function beforeAd ...
- hihoCoder #1763 道路摧毁
题目大意 A 国一共有 $n$ 个城市且有 $n-1$ 条双向道路,且任意两个城市都可以通过道路互相到达. 现在 B 国给出了两个城市的集合 $X,Y$,你需要摧毁若干条 A 国的道路,使得任意一个在 ...