POJ 2828 Buy Tickets

来源:互联网 发布:杨辉三角形的规律c语言 编辑:程序博客网 时间:2024/06/05 12:18
线段树实现 1547ms
#ifdef _DEBUG#pragma warning(disable : 4996)#endif#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <functional>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define CLOSE() ios::sync_with_stdio(false)#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define Mid(l, r) (l + r) >> 1#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define maxn 200005#define maxm 1000005#define mod  1000000007#define INF 10000000#define EPS 1e-6#define N 26using namespace std;//-------------------------CHC------------------------------//#define lson cur<<1, l, mid#define rson cur<<1|1, mid+1, rint x[maxn], v[maxn], sum[maxn<<2], ans[maxn];void PushUp(int cur) {sum[cur] = sum[cur << 1] + sum[cur << 1 | 1];}void build(int cur, int l, int r) {if (l == r) sum[cur] = 1;else {int mid = Mid(l, r);build(lson);build(rson);PushUp(cur);}}void update(int i, int val, int cur, int l, int r) {if (l == r) {sum[cur] = 0;ans[l] = val;}else {int mid = Mid(l, r);if (i <= sum[cur << 1]) update(i, val, lson);else update(i - sum[cur << 1], val, rson);PushUp(cur);}}int main() {int n;while (~scanf("%d", &n)) {CLEAR(ans, 0);FOR(i, 0, n) scanf("%d%d", &x[i], &v[i]);build(1, 1, n);for (int i = n - 1; i >= 0; --i) update(x[i] + 1, v[i], 1, 1, n);bool first = true;FOR(i, 1, n + 1) {if (first) first = false;else putchar(' ');printf("%d", ans[i]);}putchar('\n');}return 0;}
树状数组实现,别人写的findk没看懂,先用二分写了个。1829ms
#ifdef _DEBUG#pragma warning(disable : 4996)#endif#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <functional>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define CLOSE() ios::sync_with_stdio(false)#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define Mid(l, r) (l + r) >> 1#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define maxn 200005#define maxm 1000005#define mod  1000000007#define INF 10000000#define EPS 1e-6#define N 26using namespace std;//-------------------------CHC------------------------------//#define lowbit(i) i & -iint x[maxn], v[maxn], bit[maxn], ans[maxn];int n;void update(int i, int val) {while (i <= n) {bit[i] += val;i += lowbit(i);}}int sum(int i) {int ret = 0;while (i) {ret += bit[i];i -= lowbit(i);}return ret;}void debug() {FOR(i, 1, n + 1) printf("%d ", bit[i]); putchar('\n');}int find(int k) {int l = 0, r = n;while (r - l > 1) {int mid = Mid(l, r);if (sum(mid) < k) l = mid;else r = mid;//printf("l = %d, mid = %d, r = %d\n", l, mid, r);}update(r, -1);//debug();return r;}int main() {while (~scanf("%d", &n)) {CLEAR(bit, 0);FOR(i, 1, n + 1) update(i, 1);FOR(i, 0, n) scanf("%d%d", &x[i], &v[i]);for (int i = n - 1; i >= 0; --i) {ans[find(x[i] + 1)] = v[i];//printf("pos = %d\n", find(x[i] + 1));}bool first = true;FOR(i, 1, n + 1) {if (first) first = false;else putchar(' ');printf("%d", ans[i]);}putchar('\n');}return 0;}