题目链接: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

输出每个询问的结果

 
题目大意:略。
思路:分治答案。答案范围[-n, n],从前往后扫描,若是插入操作且c>mid,则把线段树中区间[a, b]加一,并置为为类别1;否则置为类别0。若是询问操作,若目前线段树中区间[a, b]的和小于等于c,则置为类别1;否则置为类别0,并把c减去区间[a, b]的和。然后分治处理,其中类别0中,答案范围为[-n, mid];类别1中,答案范围为[mid + 1, n]。按类别排序后,两个区间之间互不影响。时间复杂度为O(nlognlogn)。
 
代码(4940MS):
 #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)的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  3. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  4. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  5. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  6. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

  7. 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询

    [BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...

  8. BZOJ 3110 K大数查询 | 整体二分

    BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...

  9. BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)

    3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...

随机推荐

  1. spring环境的搭建及作用和定义<一>

    问题?spring的定义及作用.spring的环境搭建 一.spring的定义及作用 1.spring由Rod Johnson创建的一个开源框架,它是为了解决企业应用开发的复杂性而创建的.框架的主要优 ...

  2. docker kubernetes--

    http://kubernetes.io/docs/getting-started-guides/docker/ https://hub.docker.com/r/solsson/hyperkube- ...

  3. nusoap

    PHP SOAP服务器 用PHP和NuSoap来建立SOAP服务器非常容易.基本上,你只要写出你想要暴露给你的Web services的函数,然后用NuSoap去注册它们就可以了.OK,另外还需要两步 ...

  4. 树莓派如何便捷的使用pi4j

    问题的由来 pi4j用起来很方便,但是感觉pi4j库的命名太杂乱,啰嗦了,很容易弄混,而且好像没听说官方有自己的编译器.如果没有智能点的编辑器的话,写起来真要命,但是树莓派运行Eclipse不太现实, ...

  5. Visual Studio 2005安装qt-win-commercial-src-4.3.1,并设置环境变量

    虽然已经在Visual Studio 2005下安装Qt4已经n次了,还是打算在上写写安装方法. qt-win-commercial-src-4.3.1.zip.qt-vs-integration-1 ...

  6. angularJS中controller的通信

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. Spark Programming--Actions

    first def first(): T first返回RDD中的第一个元素,不排序. 例子: count def count(): Long count返回RDD中的元素数量 例子: reduce ...

  8. highchat中的category编程object问题

    设置highchart时的category时我是动态赋值的形式category=cat;cat是['title','title']是X轴的坐标显示但当单击chat的图例时X轴变成了object: ca ...

  9. ios copy/strong/weak..使用总结

    总结 关于属性的这些选项的学习,做一下总结: 所有的属性,都尽可能使用nonatomic,以提高效率,除非真的有必要考虑线程安全. NSString:通常都使用copy,以得到新的内存分配,而不只是原 ...

  10. visual studio2013 添加 dll库

    在visual studio2013中添加C#的dll库.记录如下: 在solution explorer处右键,选择reference--> add References 选择Browser. ...