首页 / 更多教程 / K大数查询 HYSBZ - 3110
K大数查询 HYSBZ - 3110
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了K大数查询 HYSBZ - 3110,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4984字,纯文字阅读大概需要8分钟。
内容图文
![K大数查询 HYSBZ - 3110](/upload/InfoBanner/zyjiaocheng/1227/84e08f8490ea42a0846607a603a6f62f.jpg)
K大数查询
本来是刷整体二分的,被这个sb题折腾了一下午,用cin就RE, 用scanf就过了=_=
收获就是偶然学到了树状数组区间修改区间查询的写法吧。。。
![技术分享图片](/img/jia.gif)
![技术分享图片](/img/jian.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4usingnamespace std; 5#define LL long long 6constint maxn = 1e5 + 10; 7constint maxq = 5e4 + 10; 8struct Qry{ 9int a, b; 10 LL c; 11int id; 12 Qry(int a = 0, int b = 0, LL c = 0, int id = 0): 13 a(a), b(b), c(c), id(id){} 14}q[maxq], q1[maxq], q2[maxq]; 15 16 17struct Seg{ 18 LL sum[maxn<<2], add[maxn<<2]; 19void init(){ 20 memset(add, 0, sizeof add); 21 memset(sum, 0, sizeof sum); 22 } 23void pushup(int rt){ 24 sum[rt] = sum[rt<<1] + sum[rt<<1|1]; 25 } 26void pushdown(int rt, int m){ 27if(add[rt]){ 28 sum[rt<<1] += (m - (m>>1)) * add[rt]; 29 sum[rt<<1|1] += (m >> 1) * add[rt]; 30 add[rt<<1] += add[rt]; 31 add[rt<<1|1] += add[rt]; 32 add[rt] = 0; 33 } 34 } 35 36void update(int L, int R, int v, int l, int r, int rt){ 37if(L <= l && r <= R){ 38 sum[rt] += v * (r - l + 1); 39 add[rt] += v; 40return; 41 } 42 pushdown(rt, r - l + 1); 43int m = (l + r) >> 1; 44if(L <= m) update(L, R, v, l, m, rt<<1); 45if(R > m) update(L, R, v, m + 1, r, rt<<1|1); 46 pushup(rt); 47 } 48 49 LL query(int L, int R, int l, int r, int rt){ 50if(L <= l && r <= R){ 51return sum[rt]; 52 } 53 pushdown(rt, r - l + 1); 54int m = (l + r) >> 1; 55 LL res = 0; 56if(L <= m) res += query(L, R, l, m, rt<<1); 57if(R > m) res += query(L, R, m + 1, r, rt<<1|1); 58return res; 59 } 60}seg; 61int ans[maxq]; 62int n; 63void solve(int L, int R, int l, int r){ 64if(L > R) return; 65if(l == r){ 66for(int i = L; i <= R; i++){ 67if(q[i].id > 0) ans[q[i].id] = l; 68 } 69return; 70 } 71int m = (l + r) >> 1; 72int f = 0, g = 0; 73for(int i = L; i <= R; i++){ 74if(q[i].id < 0){ 75if(q[i].c <= m){ 76 seg.update(q[i].a, q[i].b, 1, 1, n, 1); 77 q1[f++] = q[i]; 78 }else q2[g++] = q[i]; 79 }else{ 80 LL temp = seg.query(q[i].a, q[i].b, 1, n, 1); 81if(temp >= q[i].c) q1[f++] = q[i]; 82else{ 83 q[i].c -= temp; 84 q2[g++] = q[i]; 85 } 86 } 87 } 88for(int i = 0; i < f; i++) if(q1[i].id < 0) seg.update(q1[i].a, q1[i].b, -1, 1, n, 1); 89 memcpy(q + L, q1, f * sizeof(Qry)); 90 memcpy(q + L + f, q2, g * sizeof(Qry)); 91 solve(L, L + f - 1, l, m); 92 solve(L + f, R, m + 1, r); 93} 94 95int main(){ 96int m; 97while(scanf("%d %d", &n, &m) != EOF){ 98int op, a, b; 99 LL c; 100 seg.init(); 101int cnt = 0; 102for(int i = 1; i <= m; i++){ 103 cin>>op>>a>>b>>c; 104if(op == 1){ 105 q[i] = Qry(a, b, n + 1LL - c, -1); 106 }else{ 107 q[i] = Qry(a, b, c, ++cnt); 108 } 109 } 110 solve(1, m, 1, n * 2LL + 1); 111for(int i = 1; i <= cnt; i++) printf("%d\n", n - ans[i] + 1); 112 } 113 }
![技术分享图片](/img/jia.gif)
![技术分享图片](/img/jian.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4usingnamespace std; 5#define LL long long 6constint maxn = 1e5 + 10; 7constint maxq = 1e5 + 10; 8struct Qry{ 9int a, b; 10 LL c; 11int id; 12 Qry(int a = 0, int b = 0, LL c = 0, int id = 0): 13 a(a), b(b), c(c), id(id){} 14}q[maxq], q1[maxq], q2[maxq]; 15//树状数组区间修改区间求和 http://blog.csdn.net/blackjack_/article/details/7499747916struct Bit{ 17int n; 18 LL c1[maxn], c2[maxn]; 19void init(int _n){ 20 n = _n; 21 memset(c1, 0, sizeof(c1)); 22 memset(c2, 0, sizeof(c2)); 23 } 24void add(int x,LL add){ 25for(int i=x;i<=n;i+=i&(-i)){ 26 c1[i]+=add; 27 c2[i]+=x*add; 28 } 29 } 30 LL sum(int x){ 31 LL ans=0; 32for(int i=x;i>0;i-=i&(-i)){ 33 ans+=(x+1)*c1[i]-c2[i]; 34 } 35return ans; 36 } 37}bit; 38int ans[maxq]; 39int n; 40void solve(int L, int R, int l, int r){ 41if(L > R) return; 42if(l == r){ 43for(int i = L; i <= R; i++){ 44if(q[i].id > 0) ans[q[i].id] = l; 45 } 46return; 47 } 48int m = (l + r) >> 1; 49int f = 0, g = 0; 50for(int i = L; i <= R; i++){ 51if(q[i].id < 0){ 52if(q[i].c <= m){ 53 bit.add(q[i].a, 1LL); 54 bit.add(q[i].b+1, -1LL); 55 q1[f++] = q[i]; 56 }else q2[g++] = q[i]; 57 }else{ 58 LL temp = bit.sum(q[i].b) - bit.sum(q[i].a - 1); 59if(temp >= q[i].c) q1[f++] = q[i]; 60else{ 61 q[i].c -= temp; 62 q2[g++] = q[i]; 63 } 64 } 65 } 66for(int i = 0; i < f; i++) if(q1[i].id < 0 && q1[i].c <= m) { 67 bit.add(q1[i].a, -1); 68 bit.add(q1[i].b + 1, 1); 69 } 70 memcpy(q + L, q1, f * sizeof(Qry)); 71 memcpy(q + L + f, q2, g * sizeof(Qry)); 72 solve(L, L + f - 1, l, m); 73 solve(L + f, R, m + 1, r); 74} 7576int main(){ 77int m; 78while(scanf("%d %d", &n, &m)!= EOF){ 79int op, a, b; 80 LL c; 81 bit.init(n); 82int cnt = 0; 83for(int i = 1; i <= m; i++){ 84 cin>>op>>a>>b>>c; 85if(op == 1){ 86 q[i] = Qry(a, b, n + 1LL - c, -1); 87 }else{ 88 q[i] = Qry(a, b, c, ++cnt); 89 } 90 } 91 solve(1, m, 1, n * 2LL + 1); 92for(int i = 1; i <= cnt; i++) printf("%d\n", n - ans[i] + 1); 93 } 94 }
原文:https://www.cnblogs.com/yijiull/p/8324723.html
内容总结
以上是互联网集市为您收集整理的K大数查询 HYSBZ - 3110全部内容,希望文章能够帮你解决K大数查询 HYSBZ - 3110所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。