[贪心]ARC080 E
来源:互联网 发布:ubuntu视频下载软件 编辑:程序博客网 时间:2024/06/02 04:28
Description
给一个排列
要求最小化字典序
Solution
这不就是贪心啊。。
跟超级钢琴一样的做法。
因为这两个数在原排列中的奇偶性不同,开两颗线段树(好吧,是不想打ST表)存一下最小值的位置就好了。。
#include <bits/stdc++.h>using namespace std;const int N = 202020;inline char get(void) { static char buf[100000], *S = buf, *T = buf; if (S == T) { T = (S = buf) + fread(buf, 1, 100000, stdin); if (S == T) return EOF; } return *S++;}template<typename T>inline void read(T &x) { static char c; x = 0; int sgn = 0; for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1; for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0'; if (sgn) x = -x;}int a[N];int n, l, r;struct Seg { int c[N]; int mn[N << 2]; inline int MinPos(int a, int b) { return c[a] < c[b] ? a : b; } inline void Build(int o, int l, int r) { if (l == r) return (void)(mn[o] = l); int mid = (l + r) >> 1; Build(o << 1, l, mid); Build(o << 1 | 1, mid + 1, r); mn[o] = MinPos(mn[o << 1], mn[o << 1 | 1]); } inline void Init(int fl) { for (int i = 0; i <= n; i++) c[i] = N; for (int i = fl; i <= n; i += 2) c[i] = a[i]; Build(1, 1, n); } inline int MinPos(int o, int l, int r, int L, int R) { if (l >= L && r <= R) return mn[o]; int mid = (l + r) >> 1, res = 0; if (L <= mid) res = MinPos(res, MinPos(o << 1, l, mid, L, R)); if (R > mid) res = MinPos(res, MinPos(o << 1 | 1, mid + 1, r, L, R)); return res; }};Seg S[2];struct cpp { int l, r, s, t, fl; cpp(void) {} cpp(int _l, int _r, int f) { l = _l; r = _r; fl = f; s = S[fl].MinPos(1, 1, n, l, r); t = S[fl ^ 1].MinPos(1, 1, n, s, r); } inline bool operator <(const cpp &x) const{ return a[s] > a[x.s]; }};cpp x;priority_queue<cpp> Q;int main(void) { read(n); for (int i = 1; i <= n; i++) read(a[i]); S[1].Init(1); S[0].Init(2); Q.push(cpp(1, n, 1)); while (!Q.empty()) { x = Q.top(); Q.pop(); printf("%d %d ", a[x.s], a[x.t]); if (x.l < x.s) Q.push(cpp(x.l, x.s - 1, x.fl)); if (x.t < x.r) Q.push(cpp(x.t + 1, x.r, x.fl)); if (x.s + 1 < x.t) Q.push(cpp(x.s + 1, x.t - 1, x.fl ^ 1)); } return 0;}
阅读全文
2 0
- [贪心]ARC080 E
- ARC080 E
- ARC080 F
- 518E (贪心)
- E-Moving Tables|贪心
- codeforces 732E (贪心)
- 二分贪心专题E
- Codeforces 777E 贪心
- codeforces 777E 贪心
- 二分贪心 E
- 二分贪心 E
- 二分贪心 E题
- 二分贪心—E
- 二分贪心-E
- 二分贪心e
- Gym 100712E 贪心
- 508B、C、E(贪心)
- 【贪心】Codeforces 353E Antichain
- pyspark-Spark Streaming编程指南
- Android悬浮窗原理解析[源码]
- Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】
- ros笔记:(5)使用 rqt_console 和 roslaunch
- JS &&和||返回值
- [贪心]ARC080 E
- 驾培终端项目总结
- 【codevs 1039】数的划分
- 前端进阶之路:如何高质量完成产品需求开发
- VMware Vsphere 6.0安装部署 (四) vCenter Server的配置与管理
- set和map的使用
- SQL补充【间歇性更新】
- windows内核驱动之环境搭建-双机调试 wdk7600+win7/xp+windbg
- 《阿里巴巴Java开发规约》IDEA插件下载与安装使用