思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys
2015-07-27 15:43
330 查看
题目传送门
/* 题意:n个时刻点,m次时光穿梭,告诉的起点和终点,q次询问,每次询问t时刻t之前有多少时刻点是可以通过两种不同的路径到达 思维:对于当前p时间,从现在到未来穿越到过去的是有效的值,排个序,从大到小询问,那么之前添加的穿越点都是有效的, 用multiset保存。比赛时想到了排序,但是无法用线段树实现查询,stl大法好! */ #include <cstdio> #include <algorithm> #include <cstring> #include <set> #include <iostream> using namespace std; const int MAXN = 1e5 + 10; const int INF = 0x3f3f3f3f; struct Year { int u, v; bool operator < (const Year &r) const { return u > r.u; } }y[MAXN]; struct Query { int p, id; bool operator < (const Query &r) const { return p > r.p; } }q[MAXN]; int ans[MAXN]; int a[3]; int n, m, l; int main(void) { //ZOJ Monthly, July 2015 - H Twelves Monkeys //freopen ("H.in", "r", stdin); while (scanf ("%d%d%d", &n, &m, &l) == 3) { for (int i=1; i<=m; ++i) { scanf ("%d%d", &y[i].u, &y[i].v); } for (int i=1; i<=l; ++i) { scanf ("%d", &q[i].p); q[i].id = i; } sort (y+1, y+1+m); sort (q+1, q+1+l); multiset<int> S; int j = 1; for (int i=1; i<=l; ++i) { while (j <= m && y[j].u >= q[i].p) { S.insert (y[j].v); j++; } multiset<int>::iterator it; int cnt = 0; for (it=S.begin (); it!=S.end (); ++it) { a[++cnt] = *(it); if (cnt == 2) break; } if (cnt == 2 && a[2] <= q[i].p) ans[q[i].id] = q[i].p - a[2]; else ans[q[i].id] = 0; } for (int i=1; i<=l; ++i) printf ("%d\n", ans[i]); } return 0; }
相关文章推荐
- xml与json 介绍
- 一个C语言编写的坦克大战游戏
- 解决Windows无法访问默认共享问题
- 阿里巴巴sku算法实现
- Extjs方法的构造
- Extjs方法的构造
- 线段树_POJ_3264
- 【HDU】5290 Bombing plan 【树形DP】
- 输入一个n,输出2到n的具体素数值
- 深度解析:Android在Mms设置页面更改短信中心号码流程
- Eclipse中maven项目添加jar包
- opencv简介
- yum 安装mysql
- Static的作用
- JDK版本不兼容问题之:一台机器安装多个版本的JDK
- 第三种是经典著作阅读法
- 【DATAGUARD】物理dg的switchover切换(五)
- vb查找注册表键值
- android中打包含有Activity以及资源文件的jar包在工程中调用
- Spring事务配置