BZOJ K大数查询(分治)(Zjoi2013)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3110
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
输出每个询问的结果
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL; const int MAXN = ;
const int MAXT = MAXN << ; int sum[MAXT];
int add[MAXT];
bool clr[MAXT]; #define ll (x << 1)
#define rr (ll | 1)
#define mid ((l + r) >> 1)
void initTree() {
sum[] = add[] = ;
clr[] = true;
} void pushdown(int x, int l, int r) {
if(clr[x]) {
clr[ll] = clr[rr] = true;
sum[ll] = sum[rr] = add[ll] = add[rr] = ;
clr[x] = false;
}
if(add[x]) {
sum[ll] += (mid - l + ) * add[x];
add[ll] += add[x];
sum[rr] += (r - mid) * add[x];
add[rr] += add[x];
add[x] = ;
}
} void maintain(int x) {
sum[x] = sum[ll] + sum[rr];
} void modify(int x, int l, int r, int a, int b) {
if(a <= l && r <= b) {
add[x]++;
sum[x] += (r - l + );
} else {
pushdown(x, l, r);
if(a <= mid) modify(ll, l, mid, a, b);
if(mid < b) modify(rr, mid + , r, a, b);
maintain(x);
}
} int query(int x, int l, int r, int a, int b) {
if(a <= l && r <= b) {
return sum[x];
} else {
pushdown(x, l, r);
int res = ;
if(a <= mid) res += query(ll, l, mid, a, b);
if(mid < b) res += query(rr, mid + , r, a, b);
return res;
}
}
#undef mid struct Node {
int op, id, a, b, c, v;
void read(int i) {
id = i;
scanf("%d%d%d%d", &op, &a, &b, &c);
}
bool operator < (const Node &rhs) const {
if(v != rhs.v) return v < rhs.v;
return id < rhs.id;
}
} p[MAXN];
int ans[MAXN];
int n, m; void work(int a, int b, int l, int r) {
if(l > r) return ;
if(a == b) {
for(int i = l; i <= r; ++i)
if(p[i].op == ) ans[p[i].id] = a;
return ;
}
initTree();
int mid = a + ((b - a) >> ), t = l - ;
for(int i = l; i <= r; ++i) {
if(p[i].op == ) {
if(p[i].c > mid) modify(, , n, p[i].a, p[i].b), p[i].v = ;
else p[i].v = ;
} else {
int s = query(, , n, p[i].a, p[i].b);
if(p[i].c <= s) p[i].v = ;
else p[i].v = , p[i].c -= s;
}
t += !p[i].v;
}
sort(p + l, p + r + );
work(a, mid, l, t);
work(mid + , b, t + , r);
} int main() {
scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i) p[i].read(i);
memset(ans + , 0x80, m * sizeof(int));
work(-n, n, , m);
for(int i = ; i <= m; ++i)
if(ans[i] >= -n) printf("%d\n", ans[i]);
}
BZOJ K大数查询(分治)(Zjoi2013)的更多相关文章
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )
BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
- 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询
[BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)
3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...
随机推荐
- [Virtualization][SDN] 讲的很好的SDN软件定义网络视频课程
51CTO的免费课程,开始以为是扯蛋的,后来看了一下,讲的很好.注册一下,免费的. 只看了导论,挺好的. http://edu.51cto.com/course/course_id-4466.html
- 超简单的处理JSON格式和JSON数组格式的String
现在网站上有不少处理JSON格式的工具类,但是我找了一天,发现大都是需要编写相应对象类来进行处理,比较麻烦,比如:Gson,json-lib.Gson,json-lib这些处理那些接口之类的参数名字和 ...
- php--无限极分类
效果图:
- mysql基本sql语句大全(基础用语篇)
1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...
- NuGet的几个小技巧
因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接有时候会失效,所以 ...
- Gym 101102A Coins -- 2016 ACM Amman Collegiate Programming Contest(01背包变形)
A - Coins Time Limit:3000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Descript ...
- apache httpclient 4.5 兼容 http https
String responseContent = ""; try { SSLContextBuilder contextBuilder = new SSLContextBuilde ...
- [代码片段]YEAH!连通域标记和计数
//标记的连通域存储在buff[]里 //返回值为连通域个数 int LinkBlob(unsigned char **imagedata,unsigned char buff[], int heig ...
- 热门WEB前端职业你只需要掌握这些
在知名的互联网企业里工作是一件很美好的事情,有很多的工作机会,而且企业们通过高薪以及令人羡慕的福利来争夺最优秀的人才.但是如果你花了大量的时间在招聘网站上和公司的帖子上,你可能会注意到在网页设计这个工 ...
- JavaScript:通过id来进行元素的取得
每一个HTML元素都使用id来进行一个标注,随后可以通过document.getElementById(“ID名称”)取得指定的ID元素对象,取得元素对象之后就可以对其进行操作. 但是document ...