BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
【题目分析】
整体二分显而易见。
自己YY了一下用树状数组区间修改,区间查询的操作。
又因为一个字母调了一下午。
貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log
懒得写了。
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 50005
#define inf 0x3f3f3f3f
#define ll long long
ll n,m,cnt=0,tot=0;
struct Bit_Tree{
ll a[maxn],b[maxn];
void add(ll x,ll y,ll z)
{
// cout<<"Add "<<x<<" "<<y<<" "<<z<<endl;
for (ll i=x;i<=n;i+=i&(-i)) b[i]+=z;
for (ll i=y+1;i<=n;i+=i&(-i)) b[i]-=z;
for (ll i=x;i<=n;i+=i&(-i)) a[i]+=(n-x)*z;
for (ll i=y+1;i<=n;i+=i&(-i)) a[i]-=(n-y-1)*z;
}
void init()
{
memset(a,0,sizeof a);
memset(b,0,sizeof b);
}
ll getsum(ll x)
{
ll ret=0,tmp=0;
for (ll i=x;i;i-=i&(-i)) ret+=a[i],tmp+=b[i];
return ret-(n-x-1)*tmp;
}
ll get(ll x,ll y)
{
return getsum(y)-getsum(x-1);
}
}t;
struct data{
ll opt,id;
ll x,y,z;
}q[maxn<<1],q1[maxn<<1],q2[maxn<<1];
ll ans[maxn<<1],tag[maxn<<1];
void solve(ll ql,ll qr,ll l,ll r)
{
// cout<<"solve"<<ql<<" "<<qr<<" "<<l<<" "<<r<<endl;
// cout<<"In Que"<<endl;
if (ql>qr) return;
if (l==r)
{
for (ll i=ql;i<=qr;++i) ans[q[i].id]=l;
return ;
}
ll mid=l+r>>1,p1=0,p2=0,cnt=0;
// cout<<"Mid is "<<mid<<endl;
for (ll i=ql;i<=qr;++i)
{
// cout<<q[i].opt<<" "<<q[i].x<<" "<<q[i].y<<" "<<q[i].z<<" "<<endl;
if (q[i].opt==1)
{
if (q[i].z<=mid)
{
t.add(q[i].x,q[i].y,1);
cnt+=q[i].y-q[i].x+1;
q1[++p1]=q[i];
}
else q2[++p2]=q[i];
}
else
{
ll tmp=t.get(q[i].x,q[i].y);
// cout<<"Tmp is "<<tmp<<endl;
if (q[i].z<=tmp) q1[++p1]=q[i];
else q[i].z-=tmp,q2[++p2]=q[i];
}
}
for (ll i=1;i<=p1;++i)
{
if (q1[i].opt==1) t.add(q1[i].x,q1[i].y,-1);
q[ql+i-1]=q1[i];
}
for (ll i=1;i<=p2;++i) q[ql+p1+i-1]=q2[i];
solve(ql,ql+p1-1,l,mid);
solve(ql+p1,qr,mid+1,r);
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("wa.txt","w",stdout);
scanf("%lld",&n);
n=maxn-1;
scanf("%lld",&m);
cnt=m;
for (ll i=1;i<=m;++i)
{
scanf("%lld%lld%lld%lld",&q[i].opt,&q[i].x,&q[i].y,&q[i].z);
q[i].id=i;
if (q[i].opt==1) t.add(q[i].x,q[i].y,1);
if (q[i].opt==2)
{
tag[i]=1;
tot=t.get(q[i].x,q[i].y);
q[i].z=tot-q[i].z+1;
}
}
for (ll i=1;i<=m;++i)
if (q[i].opt==1)
t.add(q[i].x,q[i].y,-1);
solve(1,cnt,-inf,inf);
for (ll i=1;i<=m;++i)
if (tag[i])
printf("%lld\n",ans[i]);
}
BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分的更多相关文章
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)
和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- 树套树专题——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大数查询( 树状数组套主席树 )
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][ ...
随机推荐
- [Algorithm] 机器学习算法常用指标总结
考虑一个二分问题,即将实例分成正类(positive)或负类(negative).对一个二分问题来说,会出现四种情况.如果一个实例是正类并且也被 预测成正类,即为真正类(True positive), ...
- python 装饰器的理解
一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...
- 原生js封装ajax,实现跨域请求
描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...
- iOS 企业设备管理 补充中。。。
公司的设备都有一个统一的管理方法,以前不太明白,今天看了一下资料. 这里解释了什么是设备管理 Profile Manager creates and distributes configuration ...
- appium 九宫格解锁招商银行手机客户端app
之前研究了一段时间的appium for native app 相应的总结如下: appium测试环境搭建 :ht ...
- CI 扩展 Service
CI 扩展 Service 说明 CodeIgniter是一套典型的MVC框架,M负责数据,C负责交互,V负责视图,但是随着业务逻辑越来越复杂, 必然会涉及到一些列操作过程,例如用户下订单,就会存在校 ...
- Application package 'AndroidManifest.xml' must have a minimum of 2 segments.
看了源码就是packagename里面必须包含一个. 源码在: ./sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/id ...
- sh 测试网段在线主机
yum install nmap nmap -sP 192.168.21.1/24 查看网段在线主机 grep -vwf file1 file2 文件内容比较 #!/bin/bash # day=` ...
- centos7.0 下安装git(http方式)
之前弄了个ssh方式访问的git服务器,但是那种方式不太方便,而且网页也访问不了,所以这里又弄个http方式访问的git服务器. 安装过程还和之前一样,这里我再复制一遍,省的再去找了. 1. 安装依赖 ...
- Js 日期 多少分钟前,多少秒前
;(function(window){ /** * [dateDiff 算时间差] * @param {[type=Number]} hisTime [历史时间戳,必传] * @param {[typ ...