【bzoj3110】 Zjoi2013—K大数查询
http://www.lydsy.com/JudgeOnline/problem.php?id=3110 (题目链接)
题意
有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c;如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
Solution
整体二分入门题。
对于一段操作,我们二分一个答案mid,将修改操作中加入的数c大于等于mid的操作执行(用树状数组维护一段区间中大于等于mid的数的个数)。然后对于询问判断c是否大于等于已经加入的大于等于mid的数的个数,然后不断递归下去。
细节
第K大的二分写的我心慌,整个都是反过来的。。
代码
// bzoj3110
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MOD 100000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=50010;
struct data {int t,l,r,k,id;}a[maxn],tr[maxn],tl[maxn];
LL c1[maxn],c2[maxn];
int ans[maxn],n,m; int lowbit(int x) {return x&-x;}
LL query(int x) {
LL res=0;
for (int i=x;i;i-=lowbit(i)) res+=(x+1)*c1[i]-c2[i];
return res;
}
void add(int x,int val) {
for (int i=x;i<=n;i+=lowbit(i)) c1[i]+=val,c2[i]+=(LL)x*val;
}
void solve(int L,int R,int l,int r) {
if (L>R) return;
if (l==r) {
for (int i=L;i<=R;i++) ans[a[i].id]=l;
return;
}
int mid=(l+r+1)>>1,ll=0,rr=0,fl=0,fr=0;
for (int i=L;i<=R;i++) {
if (a[i].t==1) {
if (a[i].k>=mid) add(a[i].l,1),add(a[i].r+1,-1),tr[++rr]=a[i];
else tl[++ll]=a[i];
}
else {
LL x=query(a[i].r)-query(a[i].l-1);
if (x>=a[i].k) tr[++rr]=a[i],fr=1;
else a[i].k-=x,tl[++ll]=a[i],fl=1;
}
}
for (int i=L;i<=R;i++) if (a[i].t==1 && a[i].k>=mid) add(a[i].l,-1),add(a[i].r+1,1);
for (int i=1;i<=ll;i++) a[L+i-1]=tl[i];
for (int i=1;i<=rr;i++) a[L+ll+i-1]=tr[i];
if (fl) solve(L,L+ll-1,l,mid-1);
if (fr) solve(L+ll,R,mid,r);
}
int main() {
scanf("%d%d",&n,&m);
int tot=0;
for (int i=1;i<=m;i++) {
scanf("%d%d%d%d",&a[i].t,&a[i].l,&a[i].r,&a[i].k);
if (a[i].t==2) a[i].id=++tot;
}
solve(1,m,1,n);
for (int i=1;i<=tot;i++) printf("%d\n",ans[i]);
return 0;
}
【bzoj3110】 Zjoi2013—K大数查询的更多相关文章
- BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)
3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...
- BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...
- BZOJ3110: [Zjoi2013]K大数查询
喜闻乐见的简单树套树= =第一维按权值建树状数组,第二维按下标建动态开点线段树,修改相当于第二维区间加,查询在树状数组上二分,比一般的线段树还短= =可惜并不能跑过整体二分= =另外bzoj上的数据有 ...
- [BZOJ3110][ZJOI2013]K大数查询(整体二分)
BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...
- BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- bzoj3110 [Zjoi2013]K大数查询——线段树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 外层权值线段树套内层区间线段树: 之所以外层权值内层区间,是因为区间线段树需要标记下传 ...
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- 【树套树】bzoj3110 [Zjoi2013]K大数查询
题解很多,实现起来以外地简洁.内层的区间线段树上用了标记永久化. #include<cstdio> using namespace std; #define N 50001 struct ...
随机推荐
- PAT 1017. A除以B (20)
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...
- 夯实基础之php学习-1基础篇
1,单引号和双引号的区别 单引号表示字符串,双引号能解析字符串中的变量,所以,如果没有变量,尽量用单引号,加快解析速度 当字符串需要单引号或者双引号的时候,可以用转义字符代替 2,类型转换 通过(bo ...
- C#将JSON字符串对象序列化与反序列化
C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...
- 如何迁移Alwayson AG
Windows cluster要求同一个cluster中的所有windows版本都是相同的,这样就出现一个问题,当我们要将对windows进行升级时,(例如从windows 2008 R2升级到win ...
- IIS中ASP.NET安全配置
1.禁止web中的DELETE.OPTIONS.PUT.HEAD和TRACE HTTP方法 请求方法是请求一定的Web页面的程序或用于特定的URL.可选用下列几种:GET: 请求指定的页面信息,并返回 ...
- QT 网络编程一
QT如果要进行网络编程首先需要在.pro中添加如下代码:QT += network 在头文件中包含相关头文件 #include <QHostInfo> #include <QNetw ...
- CoffeeScript的类继承的工具函数extends
__hasProp = {}.hasOwnProperty, __extends = function(child, parent) { // 派生类时,如果基类的类属性值是对象,那么子类的类属性只是 ...
- Ultra-QuickSort
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- jboss:在standalone.xml中设置系统属性(system-properties)
就象在.net的web应用中,可以在web.config中设置appSettings一样,jboss的standalone.xml中也可以由开发人员自行添加系统属性,用法如下: </extens ...
- CentOs中mysql的安装与配置
在linux中安装数据库首选MySQL,Mysql数据库的第一个版本就是发行在Linux系统上,其他选择还可以有postgreSQL,oracle等 在Linux上安装mysql数据库,我们可以去其官 ...