ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】
2016-05-09 21:59
417 查看
题目链接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112题意:
求动态区间第K大。分析:
把修改操作看成删除与增加,对所有操作进行整体二分。代码:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": " << x << endl; const int maxn = 50000 + 5, maxq = 20000 + 5, oo = 0x3f3f3f3f; int n, m, tot; int a[maxn]; struct Query{ int x, y, k; int id, type; }q[maxn + maxq], q1[maxn + maxq], q2[maxn + maxq]; int bit[maxn]; int ans[maxq]; void add(int i, int x) { while(i <= n){ bit[i] += x; i += i & -i; } } int sum(int i) { int ans = 0; while(i > 0){ ans += bit[i]; i -= i & -i; } return ans; } void solve(int ql, int qr, int l, int r) { if(ql > qr) return ; if(l == r){ for(int i = ql; i <= qr; i++){ if(q[i].type == 2) ans[q[i].id] = l; } return ; } int t1 = 0, t2 = 0; int mid = l + r >> 1; // pl(mid); for(int i = ql; i <= qr; i++){ if(q[i].type == 1){ if(q[i].x <= mid){ add(q[i].id, q[i].y); q1[t1++] = q[i]; }else q2[t2++] = q[i]; }else{ int tmp = sum(q[i].y) -sum(q[i].x - 1); if(tmp >= q[i].k) q1[t1++] = q[i]; else { q[i].k -= tmp; q2[t2++] = q[i]; } } } for(int i = 0; i < t1; i++){ if(q1[i].type == 1) add(q1[i].id, -q1[i].y); } for(int i = 0; i < t1; i++) q[ql + i] = q1[i]; for(int i = 0; i < t2; i++) q[t1 + i + ql] = q2[i]; solve(ql, ql + t1 - 1, l, mid); solve(ql + t1, qr, mid + 1, r); } int main (void) { int x;scanf("%d", &x); while(x--){ scanf("%d%d", &n, &m); tot = 0; memset(bit, 0, sizeof(bit)); for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); q[++tot] = (Query){a[i], 1, oo, i, 1}; } char s[2]; int x, y, k; int cnt = 0; for(int i = 1; i <= m; i++){ scanf("%s%d%d", s, &x, &y); if(s[0] == 'Q'){ scanf("%d", &k); q[++tot] = (Query){x, y, k, ++cnt, 2}; }else{ q[++tot] = (Query){a[x], -1, oo, x, 1}; q[++tot] = (Query){y, 1, oo, x, 1}; } } solve(1, tot, 0, oo); for(int i = 1; i <= cnt; i++){ printf("%d\n", ans[i]); } } return 0; }
相关文章推荐
- spring boot搭建多数据源,记录一下
- 面向对象(下)知识点
- SQL优化--发现问题
- 使用html2canvas截屏,利用itextpdf转为pdf保存到数据库
- pycharm运行脚本为何不生成测试报告?
- java.io.IOException: Type mismatch in key from map:解决方法
- ArchLinux安装VMware后网络无法连接
- POJ 1160 DP
- 集合接口Collection案例
- shell爬虫
- mybatis+struts2
- POJ 1160 DP
- 让Grub 2来拯救你的 bootloader
- HDU 4847 Wow! Such Doge! (注意输入格式!)
- 第九周总结
- 《剑指offer》-树的子结构
- 快速诊断Linux性能
- static静态代码块与非静态代码块与构造函数执行顺序
- 《疯狂java讲义》第4章思考
- Bootstrap中,模态框嵌套模态框时,关闭第二个模态框时,导致第一个模态框的滚动条消失