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][ ...
随机推荐
- frame和bounds
- frame 是一个以**父视图**为坐标系的位置- bounds 是一个以**自身**为坐标系的位置- 如果改变了bounds 那么会影响子控件的显示位置
- Dom元素的操作
getElementById(): 获取有指定惟一ID属性值文档中的元素 getElementsByName(name): 返回的是数组 getElementsByTagName(): 返回具有指定标 ...
- Https方式使用Git@OSC设置密码的方式
Https方式使用Git@OSC设置密码的方式 62561_silentboy Zoker3 years ago member https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密 ...
- js 中histroy.back()与history.go()的区别
样例: js6.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...
- PYTHON 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
def a4(arg): ret = {} for key,value in arg.items(): if len(value) > 2: ret[key] = value[0:2] else ...
- 码途有道----基于系统观的核心能力构建-by-韩宏老师
原文链接:http://blog.sina.com.cn/s/blog_7d5a09f90102v341.html 有感于同学们在大学中如何学习计算机技术有些感概,将我书(老码识途)中的序言整理了一下 ...
- Python全栈开发【re正则模块】
re正则模块 本节内容: 正则介绍 元字符及元字符集 元字符转义符 re模块下的常用方法 正则介绍(re) 正则表达式(或 RE)是一种小型的.高度专业化的编程语言. 在Python中,它内嵌在Pyt ...
- Servlet技术(使用myeclipse)
Servlet跟JavaBean本质上都是严格遵循规则的java包. Servlet基本结构: Public class Servlet 类名称 extends HttpServlet{ Pu ...
- java多线程中关于join方法的使用
Thread的非静态方法join()让一个线程B"加入"到另外一个线程A的尾部.在A执行完毕之前,B不能工作.例如: Thread t = new MyThread ...
- [Linux]I/O多路复用和epoll
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作,通过read ...