2017 浙工业院赛预赛 G 最优屏障【RMQ】
2017-12-20 10:14
239 查看
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
M国的地势高低不平,现给出一个数组代表此国家某纬度上均匀分布的N座山的海拔高度Hi,已知每座山的山顶上都有一座哨塔,若两个哨兵分别位于第i、j(i<j)座山上,当且仅当两人所在的山比两人之间所有的山都高时,这两个哨兵可以相互监视,M国的防守能力大小为相互监视的哨兵对数。H国早已对M国虎视眈眈,H国的皇帝希望黑魔法师们可以在M国的某两座山之间放置一块巨大的屏障,M国的哨兵不可通过该屏障互相监视。皇帝想让你告诉他最优的屏障放置位置,你是皇帝手下最信任的军师,现在需要你帮助皇帝计算最优的屏障放置位置和最大的防守力减少量。
输入描述:
第一行包含一个正整数T(T≤20)。
对于每组数据,第一行包含一个正整数n(2≤n≤50000)。
接下来n个不同的正整数,H1,H2,H3,…,Hn(0≤Hi≤109)分别代表横截面上每座山的海拔高度。
(读入数据比较大,建议使用scanf而不要使用cin读入)
对于60%的数据,n≤500
对于80%的数据,n≤5000
对于100%的数据,n≤50000
输出描述:
每组数据输出一行形如“Case #N: X C”,N代表当前是第N组数据(从1开始),X代表屏障放置在第X座山前可使M国的防守能力下降最多, 此时减少量为C。若有多种方案使得减少量为C,那么输出最小的X对应的方案。
示例1
输入
2
3
2 1 3
5
4 5 2 6 3
输出
Case #1: 2 2
Case #2: 3 2
分析:对于每一个山头来说,它对于前面所有的山有一个贡献,它对于后面的山有一个贡献。当且仅当满足题目中的最高条件,才有效。则可以通过栈来维护一个单调递减的序列,对于每一个山头,它仅对栈里比它小的所有元素生效,将这些元素清除。若栈不为空(栈里有元素高于这个山头)也生效+1。如此从前向后与从后向前都跑一次,便可以推导出每一个空隙的总贡献。
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
M国的地势高低不平,现给出一个数组代表此国家某纬度上均匀分布的N座山的海拔高度Hi,已知每座山的山顶上都有一座哨塔,若两个哨兵分别位于第i、j(i<j)座山上,当且仅当两人所在的山比两人之间所有的山都高时,这两个哨兵可以相互监视,M国的防守能力大小为相互监视的哨兵对数。H国早已对M国虎视眈眈,H国的皇帝希望黑魔法师们可以在M国的某两座山之间放置一块巨大的屏障,M国的哨兵不可通过该屏障互相监视。皇帝想让你告诉他最优的屏障放置位置,你是皇帝手下最信任的军师,现在需要你帮助皇帝计算最优的屏障放置位置和最大的防守力减少量。
输入描述:
第一行包含一个正整数T(T≤20)。
对于每组数据,第一行包含一个正整数n(2≤n≤50000)。
接下来n个不同的正整数,H1,H2,H3,…,Hn(0≤Hi≤109)分别代表横截面上每座山的海拔高度。
(读入数据比较大,建议使用scanf而不要使用cin读入)
对于60%的数据,n≤500
对于80%的数据,n≤5000
对于100%的数据,n≤50000
输出描述:
每组数据输出一行形如“Case #N: X C”,N代表当前是第N组数据(从1开始),X代表屏障放置在第X座山前可使M国的防守能力下降最多, 此时减少量为C。若有多种方案使得减少量为C,那么输出最小的X对应的方案。
示例1
输入
2
3
2 1 3
5
4 5 2 6 3
输出
Case #1: 2 2
Case #2: 3 2
分析:对于每一个山头来说,它对于前面所有的山有一个贡献,它对于后面的山有一个贡献。当且仅当满足题目中的最高条件,才有效。则可以通过栈来维护一个单调递减的序列,对于每一个山头,它仅对栈里比它小的所有元素生效,将这些元素清除。若栈不为空(栈里有元素高于这个山头)也生效+1。如此从前向后与从后向前都跑一次,便可以推导出每一个空隙的总贡献。
#include<iostream> #include<cstring> #include<cstdio> #include<stack> #include<algorithm> using namespace std; int a[50005]; int vis[50005]; int v[50005]; int main() { stack<int> q; int T, n, cs=0; int tmp; scanf("%d", &T); while (T--) { cs++; memset(vis, 0, sizeof vis); memset(v, 0, sizeof v); while (!q.empty()) { q.pop(); } scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i <= n; i++) { int tmp = 0; vis[i] = vis[i - 1]; while (!q.empty()&&q.top() < a[i]) { q.pop(); tmp++; } if (!q.empty()) { vis[i] += tmp + 1; } else { vis[i] += tmp; } q.push(a[i]); } while (!q.empty()) { q.pop(); } for (int i = n; i >= 1; i--) { v[i] = v[i + 1]; int tmp = 0; while (!q.empty()&&q.top() < a[i]) { q.pop(); tmp++; } if (!q.empty()) { v[i] += tmp + 1; } else { v[i] += tmp; } q.push(a[i]); } /*for (int i = 1; i <= n; i++) { cout << vis[i] << " "; }cout << endl; for (int j = 1; j <= n; j++) { cout << v[j] << " "; }cout << endl;*/ int max = -1, id = 0; for (int i = 1; i < n; i++) { if (vis - (vis[i] + v[i + 1]) > max) { max = vis - (vis[i] + v[i + 1]); id = i; } } printf("Case #%d: %d %d\n", cs, id+1, max); } return 0; }
相关文章推荐
- 2017 浙工业院赛预赛 E 小米买东西【二分+贪心】
- 2017图灵杯问题E 简单的RMQ(RMQ)
- 2017 icpc亚洲区预赛西安站 K Lover || (线段树)
- HDU6098 Inversion(RMQ,2017 HDU多校联赛 第6场)
- 2017 浙工业院赛预赛 C【推导+二分+逆元】
- [NW Pacific 2016-2017] GYM 101201J Shopping [rmq+二分]
- [置顶] 2017 CCCC预赛总结
- 2017 计蒜之道 初赛 第六场 微软大楼设计方案(中等)【思维+RMQ】
- 2017 计蒜之道 初赛 第六场 微软大楼设计方案(困难)(rmq+二分优化)@
- 2017浙工大院赛预赛 F 小妈妈找蝌蚪【dijkstra】
- 2017 icpc亚洲区预赛西安站 J LOL
- 2017 icpc亚洲区预赛西安站 H (线段树)
- 2017浙工大院赛预赛 A 栗酱的异或和 【NIM】
- 2017浙工大院赛预赛 D 简单的数据结构【双端队列||数组模拟】
- 2017浙工大院赛预赛 I 栗酱数数【water】
- 2017浙工大院赛预赛 J 裁缝大师【几何】
- 《欢聚时代2017校招笔试题目(PHP工程师类)---错题解析》
- 2017中国长春第八届连锁加盟创业项目展览会会刊(参展商名录)
- Visual Studio 2017 针对移动开发的新特性介绍
- IntelliJ Idea 2017 注册码 免费激活方法