hdu4251The Famous ICPC Team Again【划分树入门题】
来源:互联网 发布:淘宝购物并发技术 编辑:程序博客网 时间:2024/06/05 23:56
水到不能再水……
/***************hdu42512016.1.281060MS 15816K 2320 B G++***************/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1000010;int sorted[MAXN]; //对原集合中元素排序后的值int val[30][MAXN]; //val记录第k层当前位置的值int toleft[30][MAXN]; //记录元素所在区间当前位置前的元素进入到左子树的个数int sum[30][MAXN]; //记录比当前元素小的元素的和int n;void build(int l, int r, int d) { if (l == r) return ; int mid = (l + r) >> 1; int same = mid - l + 1; for (int i=l; i<=r; i++) if (val[d][i] < sorted[mid]) same--; int lp = l, rp = mid+1; for (int i=l; i<=r; i++) { if (i == l) toleft[d][i] = 0; else toleft[d][i] = toleft[d][i-1]; if (val[d][i] < sorted[mid]) { toleft[d][i]++; val[d+1][lp++] = val[d][i]; } else if (val[d][i] > sorted[mid]) val[d+1][rp++] = val[d][i]; else { if (same) { same--; toleft[d][i]++; val[d+1][lp++] = val[d][i]; } else val[d+1][rp++] = val[d][i]; } } build(l, mid, d+1); build(mid+1, r, d+1);}int query(int a, int b, int k, int l, int r, int d) { if (a == b) return val[d][a]; int mid = (l + r) >> 1; int s, ss, sss; if (a == l) { s = toleft[d][b]; ss = 0; } else { s = toleft[d][b] - toleft[d][a-1]; ss = toleft[d][a-1]; } if (s >= k) { a = l + ss; b = l + ss + s - 1; return query(a, b, k, l, mid, d+1); } else { a = mid+1 + a - l - ss; b = mid+1 + b - l - toleft[d][b]; return query(a, b, k-s, mid+1, r, d+1); }}int main(){ //freopen("cin.txt","r",stdin); int n, m,tot=1; while(~scanf("%d", &n)) { printf("Case %d:\n",tot++); for (int i=1; i<=n; i++) { scanf("%d", &sorted[i]); val[0][i] = sorted[i]; } sort(sorted+1, sorted+1+n); build(1, n, 0); int a, b, k; scanf("%d",&m); while (m--) { scanf("%d%d", &a, &b); printf("%d\n", query(a, b, (b-a)/2+1, 1, n, 0)); } } return 0;}
0 0
- hdu4251The Famous ICPC Team Again【划分树入门题】
- HDU_4251_The Famous ICPC Team Again(划分树)
- hud--4251The Famous ICPC Team Again+划分树入门题
- hdu 4251 The Famous ICPC Team Again--划分树
- HDU4251-The Famous ICPC Team Again(划分树)
- HDU:4251 The Famous ICPC Team Again(划分树)
- hdu 4251 The Famous ICPC Team Again(划分树)
- hdu 4251 The Famous ICPC Team Again(划分树)
- HDU 4251 The Famous ICPC Team Again (划分树)
- HDU 4251The Famous ICPC Team Again 划分树
- HDU4251 The Famous ICPC Team Again(划分树裸)
- hdu 4251 The Famous ICPC Team Again(划分树)
- hdu 4251 The Famous ICPC Team Again (划分数)
- hdu 4251 The Famous ICPC Team Again(划分树裸题)
- HDOJ 题目4251The Famous ICPC Team Again(划分树)
- HDU 4251-The Famous ICPC Team Again(划分树-区间中位数)
- HDU 4251 The Famous ICPC Team Again 划分树 区间第K大
- hdoj_4251The Famous ICPC Team Again
- 如何删除AD RMS根认证的方法
- 【spring mvc (三)】spring 容器
- SQL Server 创建链接服务器
- 使用baksmali和smali反编译和编译apk
- [LeetCode] Odd Even Linked List
- hdu4251The Famous ICPC Team Again【划分树入门题】
- Android------Intent用法大全
- HDU 2147 kiki's game
- 实际项目中关于java常量宏替换的实际问题
- MSSQL和MYSQL数据交互
- Swift 基本知识点之七类与结构体
- XStream转换xml
- 98. Validate Binary Search Tree
- Golang Channel用法简编