3110: [Zjoi2013]K大数查询
来源:互联网 发布:你不知道的js pdf 编辑:程序博客网 时间:2024/05/16 05:29
3110: [Zjoi2013]K大数查询
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 5550 Solved: 1886
[Submit][Status][Discuss]
Description
有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
Input
第一行N,M
接下来M行,每行形如1 a b c或2 a b c
Output
输出每个询问的结果
Sample Input
2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
Sample Output
1
2
1
2
1
HINT
【样例说明】
第一个操作 后位置 1 的数只有 1 , 位置 2 的数也只有 1 。 第二个操作 后位置 1
的数有 1 、 2 ,位置 2 的数也有 1 、 2 。 第三次询问 位置 1 到位置 1 第 2 大的数 是
1 。 第四次询问 位置 1 到位置 1 第 1 大的数是 2 。 第五次询问 位置 1 到位置 2 第 3
大的数是 1 。
N,M<=50000,N,M<=50000
a<=b<=N
1操作中abs(c)<=N
2操作中c<=Maxlongint
Source
二维线段树或CDQ分治可做
CDQ的话,设Solve(l,r)为确定答案在[l,r]的修改和询问
按时间将[mid+1,r]的修改操作,每次区间加法
碰到询问时只需查询区间sum即可,,很好写
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<vector> #include<queue> #include<set> #include<map> #include<stack> #include<bitset> #include<ext/pb_ds/priority_queue.hpp> using namespace std; const int T = 4; const int maxn = 5E4 + 50; typedef long long LL; struct Query{ int typ,a,b,c; Query(){} Query(int typ,int a,int b,int c): typ(typ),a(a),b(b),c(c){} }Q[maxn]; int n,m,cur = 1,tot,A[maxn],Ans[maxn]; LL C[maxn*T],Add[maxn*T]; void pushdown(int o,int l,int r) { LL len = r - l + 1; C[o] += Add[o]*len; if (l == r) {Add[o] = 0; return;} Add[o<<1] += Add[o]; Add[o<<1|1] += Add[o]; Add[o] = 0; } LL query(int o,int l,int r,int ql,int qr) { pushdown(o,l,r); if (ql <= l && r <= qr) return C[o]; int mid = (l + r) >> 1; LL ret = 0; if (ql <= mid) ret += query(o<<1,l,mid,ql,qr); if (qr > mid) ret += query(o<<1|1,mid+1,r,ql,qr); return ret; } void Modify(int o,int l,int r,int ml,int mr,int k) { if (ml <= l && r <= mr) { Add[o] += 1LL*k; pushdown(o,l,r); return; } pushdown(o,l,r); int mid = (l + r) >> 1; if (ml <= mid) Modify(o<<1,l,mid,ml,mr,k); else pushdown(o<<1,l,mid); if (mr > mid) Modify(o<<1|1,mid+1,r,ml,mr,k); else pushdown(o<<1|1,mid+1,r); C[o] = C[o<<1] + C[o<<1|1]; } void Solve(int l,int r,vector <int> &v) { if (l == r) { for (int i = 0; i < v.size(); i++) if (Q[v[i]].typ == 2) Ans[v[i]] = A[l]; return; } vector <int> v1,v2; v1.clear(); v2.clear(); int mid = (l + r) >> 1; for (int i = 0; i < v.size(); i++) { Query &g = Q[v[i]]; if (g.typ == 1) { if (g.c > mid) Modify(1,1,n,g.a,g.b,1),v2.push_back(v[i]); else v1.push_back(v[i]); } else { LL ret = query(1,1,n,g.a,g.b); if (ret >= 1LL*g.c) v2.push_back(v[i]); else v1.push_back(v[i]),g.c -= ret; } } for (int i = 0; i < v.size(); i++) { Query g = Q[v[i]]; if (g.typ == 2 || g.c <= mid) continue; Modify(1,1,n,g.a,g.b,-1); } Solve(mid + 1,r,v2); Solve(l,mid,v1); } int main() { #ifdef DMC freopen("DMC.txt","r",stdin); #endif cin >> n >> m; for (int i = 1; i <= m; i++) { int typ,a,b,c; scanf("%d%d%d%d",&typ,&a,&b,&c); Q[i] = Query(typ,a,b,c); if (typ == 1) A[++tot] = c; } sort(A + 1,A + tot + 1); for (int i = 2; i <= tot; i++) if (A[i] != A[i-1]) A[++cur] = A[i]; for (int i = 1; i <= m; i++) if (Q[i].typ == 1) Q[i].c = lower_bound(A + 1,A + cur + 1,Q[i].c) - A; vector <int> v; v.clear(); for (int i = 1; i <= m; i++) v.push_back(i); Solve(1,cur,v); for (int i = 1; i <= m; i++) if (Q[i].typ == 2) printf("%d\n",Ans[i]); return 0; }
0 0
- 3110 [Zjoi2013]K大数查询
- 3110: [Zjoi2013]K大数查询
- 3110: [Zjoi2013]K大数查询
- 3110: [Zjoi2013]K大数查询
- 3110: [Zjoi2013]K大数查询
- 3110: [Zjoi2013]K大数查询
- [Zjoi2013]K大数查询
- BZOJ 3110 ZJOI2013 K大数查询 树套树
- BZOJ-3110-K大数查询-ZJOI2013-暴力
- bzoj 3110 [Zjoi2013]K大数查询
- BZOJ 3110 [Zjoi2013]K大数查询
- 【bzoj 3110】[Zjoi2013]K大数查询|树套树
- BZOJ 3110 [Zjoi2013]K大数查询
- 【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
- [BZOJ]3110: [Zjoi2013]K大数查询
- bzoj3110 k大数查询 zjoi2013
- 【ZJOI2013】【BZOJ3110】K大数查询
- [BZOJ3110][Zjoi2013]K大数查询
- 对拍模板
- HDU3394 Railway(点双连通分量)
- UNIX标准IO
- c++指针实现2数交换
- 启用init_level4_pgt
- 3110: [Zjoi2013]K大数查询
- 系统限流实践 - 接入层限流----上篇学习了分布式限流(传送门),接下来学习一下接入层限流的方法对于简单的web应用,我们一般直接通过容器例如Tomcat/Jetty直接把应用暴露给外部使用
- UNIX进程环境及关系
- [openjudge] 746:Elevator Stopping Plan
- React入门指引与实战----React是Facebook公司推出的前端组件化解决方案,目的在于解决前端开发中存在的各个痛点。目前,前端框架与库层出不穷,形成了异常繁荣的局面,那么Facebook为
- 从苏宁电器到卡巴斯基----从苏宁电器离职以后,我想要重新租个房子来备考,主要是希望能够有个良好的学习环境。思前想后,决定在长春理工大学周边租个房子住,然后每天去理工大学上自习。于是我在南湖小区找了个
- 【NOIP模拟题】【线段树】2016.11.10第三题题解
- 【树上差分】【小结】
- 【模板】LCA