【HDOJ】3727 Jewel
2016-02-15 01:30
381 查看
静态区间第K大值。主席树和划分树都可解。
数据发生器。
/* 3727 */ #include <iostream> #include <sstream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <climits> #include <cctype> #include <cassert> #include <functional> #include <iterator> #include <iomanip> using namespace std; //#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int> #define stpii set<pair<int, int> > #define mpii map<int,int> #define vi vector<int> #define pii pair<int,int> #define vpii vector<pair<int,int> > #define rep(i, a, n) for (int i=a;i<n;++i) #define per(i, a, n) for (int i=n-1;i>=a;--i) #define clr clear #define pb push_back #define mp make_pair #define fir first #define sec second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) // #define lson l, mid, rt<<1 // #define rson mid+1, r, rt<<1|1 typedef struct { int q; int l, r, k; } Ques_t; const int maxq = 210000; const int maxn = 1e5+5; const int maxm = maxn * 20; int a[maxn], m; Ques_t Q[maxq]; int T[maxn]; int lson[maxm], rson[maxm], c[maxm]; int tot, cur, q; void init() { tot = cur = m = 0; } int Build(int l, int r) { int rt = tot++; c[rt] = 0; if (l == r) return rt; int mid = (l + r) >> 1; lson[rt] = Build(l, mid); rson[rt] = Build(mid+1, r); return rt; } int Insert(int rt, int x, int delta) { int nrt = tot++, ret = nrt; int l = 0, r = m - 1, mid; c[nrt] = c[rt] + delta; while (l < r) { mid = (l + r) >> 1; if (x <= mid) { lson[nrt] = tot++; rson[nrt] = rson[rt]; nrt = lson[nrt]; rt = lson[rt]; r = mid; } else { lson[nrt] = lson[rt]; rson[nrt] = tot++; nrt = rson[nrt]; rt = rson[rt]; l = mid + 1; } c[nrt] = c[rt] + delta; } return ret; } int Query_kth(int lrt, int rrt, int k) { int l = 0, r = m - 1, mid; int tmp; while (l < r) { mid = (l + r) >> 1; tmp = c[lson[rrt]] - c[lson[lrt]]; if (tmp >= k) { lrt = lson[lrt]; rrt = lson[rrt]; r = mid; } else { k -= tmp; lrt = rson[lrt]; rrt = rson[rrt]; l = mid + 1; } } return l; } int Query_Rank(int rt, int L, int R, int l, int r) { if (L==l && R==r) return c[rt]; int mid = (l + r) >> 1; if (R <= mid) return Query_Rank(lson[rt], L, R, l, mid); else if (L > mid) return Query_Rank(rson[rt], L, R, mid+1, r); else return Query_Rank(lson[rt], L, mid, l, mid) + Query_Rank(rson[rt], mid+1, R, mid+1, r); } void solve() { __int64 ans1 = 0, ans2 = 0, ans3 = 0; int tmp, id; sort(a, a+m); m = unique(a, a+m) - a; T[cur] = Build(0, m-1); rep(i, 0, q) { if (Q[i].q == 0) { id = lower_bound(a, a+m, Q[i].k) - a; T[cur+1] = Insert(T[cur], id, 1); ++cur; continue; } if (Q[i].q == 1) { id = Query_kth(T[Q[i].l-1], T[Q[i].r], Q[i].k); tmp = a[id]; ans1 += tmp; } else if (Q[i].q == 2) { id = lower_bound(a, a+m, Q[i].k) - a; tmp = Query_Rank(T[cur], 0, id, 0, m-1); ans2 += tmp; } else { id = Query_kth(T[0], T[cur], Q[i].k); tmp = a[id]; ans3 += tmp; } #ifndef ONLINE_JUDGE // printf("tmp = %d\n", tmp); #endif } printf("%I64d\n%I64d\n%I64d\n", ans1, ans2, ans3); } int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int t = 0; char op[16]; while (scanf("%d", &q)!=EOF) { init(); rep(i, 0, q) { scanf("%s", op); if (op[0] == 'I') { scanf("%d", &Q[i].k); a[m++] = Q[i].k; Q[i].q = 0; } else if (op[6] == '1') { scanf("%d %d %d", &Q[i].l, &Q[i].r, &Q[i].k); Q[i].q = 1; } else if (op[6] == '2') { scanf("%d", &Q[i].k); Q[i].q = 2; } else { scanf("%d", &Q[i].k); Q[i].q = 3; } } printf("Case %d:\n", ++t); solve(); } #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
数据发生器。
from copy import deepcopy from random import randint, shuffle import shutil import string def GenDataIn(): with open("data.in", "w") as fout: t = 10 bound = 10**5 for tt in xrange(t): n = randint(200, 300) fout.write("%d\n" % (n)) L = range(1, n+1) shuffle(L) cur = 0 has = [] for i in xrange(n): op = randint(0, 3) if cur==0: op=0 if op==0: idx = randint(0, len(L)-1) x = L[idx] L.remove(x) has.append(x) cur += 1 fout.write("Insert %d\n" % x) elif op==1: l = randint(1, cur) r = randint(l, cur) k = randint(1, r-l+1) fout.write("Query_1 %d %d %d\n" % (l, r, k)) elif op==2: idx = randint(0, len(has)-1) x = has[idx] fout.write("Query_2 %d\n" % x) else: x = randint(1, cur) fout.write("Query_3 %d\n" % x) def MovDataIn(): desFileName = "F:\eclipse_prj\workspace\hdoj\data.in" shutil.copyfile("data.in", desFileName) if __name__ == "__main__": GenDataIn() MovDataIn()
相关文章推荐
- iOS开发之网络编程--使用NSURLConnection实现大文件下载
- AAC帧格式及编码介绍
- 关于解决Qt OpenGL编译/usr/bin/ld: cannot find -lGL 问题的方法
- 为什么不在spring容器管理controller
- HTTP与HTTPS的区别
- ubuntu snmp 配置
- htonl htons ntohs ntohl的区别
- 1051. Pop Sequence (25)
- oracle数据库实例,数据库的理解
- 解决phpMyAdmin最大限制
- Lingo中集与数据的设置
- POJ 2551 Dungeon Master
- IOS开发基础篇--CAShapeLayer的strokeStart和strokeEnd属性
- POJ 2739 Sum of Consecutive Prime Numbers(数学,素数打表)
- [算法]数组中未出现的最小正整数
- ps一些比较有用的要点
- [20160214]情人节,也要好好钻研学业!
- 消化
- Chromium网页Render Object Tree创建过程分析
- ruby on rails爬坑(三):图片上传及显示