题目链接: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. Python的安装

    篇幅主要是别人的分享,我这里主要是添加注意点.我当初就是按照下面的图片开始安装python,安装的是python3.5,pyDev也是使用的博主的(还花了1资源分下载).但是运行程序时,一直显示 Er ...

  2. IOS应用程序生命周期的AppDelegate详解

    IOS 中的 AppDelegate.m/h 文件是很重要的呢,因为它是对 Application 的整个生命周期进行管理的. 先明白,每个iPhone应用程序都有一个UIApplication,UI ...

  3. Magento: How to reset admin pssword

    Magento: How to reset admin pssword If you forget your admin password for Magento and you can’t reme ...

  4. How to Move Magento to a New Server or Domain

    Magento is one of the fastest growing eCommerce platforms on the internet and with its recent acquis ...

  5. Windows Server 2008标准证书使用记录

    Windows Server 2008标准证书使用记录   近期准备将单位的服务器全部升级到Windows Server 2008,但有一些“遗留”问题需要解决: (1)现在单位还有一台Windows ...

  6. js的语句

    1.语句类型总结 var box = 100;//单行语句 { //用花括号包含的语句集合,叫做复合语句,单位一个 //一对花括号,表示一个复合语句,处理时,可以单做一条单行语句, //复合语句,我们 ...

  7. cp 命令(转)

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...

  8. Shell 小技巧

    Shell 小技巧 ${} 的使用 截断变量 去掉左边 使用 # (最短匹配)或 ## (最长匹配)方法为 ${var#<模式>} var=DUMMY echo ${var#*M} # M ...

  9. Android --Search界面样式

    Lay_Weight 权重属性的使用 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  10. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...