POJ 2104 K-th Number

时空隧道

题意:

给出一个序列,每次查询区间第k小

分析:

整体二分入门题?

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define inf 0x3f3f3f3f
using namespace std; const int maxn=+,maxm=+; int n,m,a[maxn],ans[maxm],tr[maxn]; struct M{
int x,y,k,id,flag;
M(int a=,int b=,int c=,int d=,int e=){
x=a,y=b,k=c,id=d,flag=e;
}
}q[maxm+maxn],q1[maxm+maxn],q2[maxm+maxn]; inline void add(int x,int y){
for(;x<=n;x+=x&(-x))
tr[x]+=y;
} inline int query(int x){
int res=;
for(;x;x-=x&(-x))
res+=tr[x];
return res;
} inline void solve(int L,int R,int l,int r){
if(L>R)
return;
if(l==r){
for(int i=L;i<=R;i++)
if(q[i].flag==)
ans[q[i].id]=l;
return;
}
int mid=(l+r)>>,l1=,l2=;
for(int i=L;i<=R;i++){
if(q[i].flag==){
if(q[i].x<=mid)
add(q[i].id,),q1[l1++]=q[i];
else
q2[l2++]=q[i];
}
else{
int lala=query(q[i].y)-query(q[i].x-);
if(lala>=q[i].k)
q1[l1++]=q[i];
else
q[i].k-=lala,q2[l2++]=q[i];
}
}
for(int i=;i<l1;i++)
if(q1[i].flag==)
add(q1[i].id,-);
memcpy(q+L,q1,sizeof(q[])*l1);
memcpy(q+L+l1,q2,sizeof(q[])*l2);
solve(L,L+l1-,l,mid);solve(L+l1,R,mid+,r);
} signed main(void){
while(scanf("%d%d",&n,&m)!=EOF){
memset(tr,,sizeof(tr));
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
q[i]=(M){a[i],,,i,};
}
for(int i=;i<=m;i++)
scanf("%d%d%d",&q[i+n].x,&q[i+n].y,&q[i+n].k),q[i+n].id=i,q[i+n].flag=;
solve(,n+m,-inf,inf);
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
}
return ;
}

BZOJ 1901: Zju2112 Dynamic Rankings

时空隧道

分析:

和上一题一样,就是把修改操作拆成删除和插入操作...

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define inf 0x3f3f3f3f
using namespace std; const int maxn=+; int n,m,cnt,tot,tr[maxn],pre[maxn],ans[maxn]; char ch[]; struct M{
int x,y,k,id,flag;
}q[maxn*],q1[maxn*],q2[maxn*]; inline int read(void){
char ch=getchar();int f=,x=;
while(!(ch>=''&&ch<='')){
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
x=x*+ch-'',ch=getchar();
return x;
} inline void insert(int x,int y){
for(;x<=n;x+=x&(-x))
tr[x]+=y;
} inline int query(int x){
int res=;
for(;x;x-=x&(-x))
res+=tr[x];
return res;
} inline void solve(int L,int R,int l,int r){
if(L>R)
return;
if(l==r){
for(int i=L;i<=R;i++)
if(q[i].flag==)
ans[q[i].id]=l;
return;
}
int mid=(l+r)>>,l1=,l2=;
for(int i=L;i<=R;i++){
if(q[i].flag==){
if(q[i].x<=mid)
insert(q[i].id,q[i].y),q1[l1++]=q[i];
else
q2[l2++]=q[i];
}
else{
int lala=query(q[i].y)-query(q[i].x-);
if(lala>=q[i].k)
q1[l1++]=q[i];
else
q[i].k-=lala,q2[l2++]=q[i];
}
}
for(int i=;i<l1;i++)
if(q1[i].flag==)
insert(q1[i].id,-q1[i].y);
memcpy(q+L,q1,sizeof(q[])*l1);
memcpy(q+L+l1,q2,sizeof(q[])*l2);
solve(L,L+l1-,l,mid);solve(L+l1,R,mid+,r);
} signed main(void){
n=read(),m=read();tot=n;
for(int i=;i<=n;i++)
pre[i]=read(),q[i].x=pre[i],q[i].y=,q[i].k=,q[i].id=i,q[i].flag=;
for(int i=,x,y;i<=m;i++){
scanf("%s",ch);tot++;
if(ch[]=='Q')
q[tot].x=read(),q[tot].y=read(),q[tot].k=read(),q[tot].id=++cnt,q[tot].flag=;
else
x=read(),y=read(),q[tot].x=pre[x],q[tot].y=-,q[tot].k=,q[tot].id=x,q[tot].flag=,
pre[x]=y,q[++tot].x=y,q[tot].y=,q[tot].k=,q[tot].id=x,q[tot].flag=;
}
solve(,tot,,inf);
for(int i=;i<=cnt;i++)
printf("%d\n",ans[i]);
return ;
}//Cap ou pas cap. Cap.

BZOJ 3110: [Zjoi2013]K大数查询

时空隧道

分析:

还是一样的...只是把树状数组改成了线段树...

然而...虽然题水...但是我WA了半页...快读写错了...没有读入负数

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define int long long
using namespace std; const int maxn=+; int n,m,cnt,ans[maxn]; struct M{
int x,y,id,flag;
long long k;
}q[maxn],q1[maxn],q2[maxn]; struct Tree{
int l,r;
long long sum,lazy;
}tree[maxn<<]; inline long long longread(void){
char ch=getchar();int f=;long long x=;
while(!(ch>=''&&ch<='')){
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
x=x*+ch-'',ch=getchar();
return f*x;
} inline int intread(void){
char ch=getchar();int f=,x=;
while(!(ch>=''&&ch<='')){
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
x=x*+ch-'',ch=getchar();
return f*x;
} inline void build(int l,int r,int tr){
tree[tr].l=l,tree[tr].r=r,tree[tr].sum=,tree[tr].lazy=;
if(l==r)
return;
int mid=(l+r)>>;
build(l,mid,tr<<),build(mid+,r,tr<<|);
} inline void change(int l,int r,int val,int tr){//cout<<l<<" "<<r<<" "<<tree[tr].l<<" "<<tree[tr].r<<" "<<tr<<" ";
if(tree[tr].l==l&&tree[tr].r==r){
tree[tr].sum+=val*(r-l+);
tree[tr].lazy+=val;return;
}
int mid=(tree[tr].l+tree[tr].r)>>;//cout<<mid<<endl;
if(tree[tr].lazy)
change(tree[tr].l,mid,tree[tr].lazy,tr<<),change(mid+,tree[tr].r,tree[tr].lazy,tr<<|),tree[tr].lazy=;
if(r<=mid)
change(l,r,val,tr<<);
else if(l>mid)
change(l,r,val,tr<<|);
else
change(l,mid,val,tr<<),change(mid+,r,val,tr<<|);
tree[tr].sum=tree[tr<<].sum+tree[tr<<|].sum;
} inline long long query(int l,int r,int tr){//cout<<l<<" "<<r<<" "<<tree[tr].l<<" "<<tree[tr].r<<" "<<tr<<" ";
if(tree[tr].l==l&&tree[tr].r==r)
return tree[tr].sum;
int mid=(tree[tr].l+tree[tr].r)>>;//cout<<mid<<endl;
if(tree[tr].lazy)
change(tree[tr].l,mid,tree[tr].lazy,tr<<),change(mid+,tree[tr].r,tree[tr].lazy,tr<<|),tree[tr].lazy=;
if(r<=mid)
return query(l,r,tr<<);
else if(l>mid)
return query(l,r,tr<<|);
else
return query(l,mid,tr<<)+query(mid+,r,tr<<|);
} inline void solve(int L,int R,int l,int r){//cout<<L<<" "<<R<<" "<<l<<" "<<r<<endl;
if(L>R)
return;
if(l==r){
for(int i=L;i<=R;i++)
if(q[i].flag==)
ans[q[i].id]=l;
return;
}
int mid=(l+r)>>,l1=,l2=;
for(int i=L;i<=R;i++){//cout<<i<<endl;
if(q[i].flag==){//cout<<"***"<<endl;
if(q[i].k<=mid)
change(q[i].x,q[i].y,,),q1[l1++]=q[i];
else
q2[l2++]=q[i];
}
else{//cout<<"&&&"<<endl;
int lala=query(q[i].x,q[i].y,);//cout<<q[i].x<<" "<<q[i].y<<" "<<lala<<" "<<tree[1].sum<<endl;
if(lala>=q[i].k)
q1[l1++]=q[i];
else
q[i].k-=lala,q2[l2++]=q[i];
}
}//cout<<"lala"<<endl;
for(int i=;i<l1;i++)
if(q1[i].flag==)
change(q1[i].x,q1[i].y,-,);
// memcpy(q+L,q1,sizeof(q[0])*l1);
// memcpy(q+L+l1,q2,sizeof(q[0])*l2);
for(int i=;i<l1;i++)
q[L+i]=q1[i];
for(int i=;i<l2;i++)
q[L+l1+i]=q2[i];
solve(L,L+l1-,l,mid),solve(L+l1,R,mid+,r);
} signed main(void){
// freopen("sequence10.in","r",stdin);
// freopen("out.out","w",stdout);
n=intread();m=intread();cnt=;
// scanf("%lld%lld",&n,&m);
for(int i=,l,s,x,y;i<=m;i++){
l=intread();
// scanf("%lld",&l);
if(l==)
q[i].x=intread(),q[i].y=intread(),q[i].k=longread(),q[i].k=n-q[i].k+,q[i].flag=;
else
q[i].x=intread(),q[i].y=intread(),q[i].k=longread(),q[i].id=++cnt,q[i].flag=;
}build(,n,);solve(,m,,n);
for(int i=;i<=cnt;i++)
printf("%lld\n",n-ans[i]+);
return ;
}//Cap ou pas cap. Cap.

BZOJ 2527: [Poi2011]Meteors

时空隧道

还是板子题...感觉我要废了TAT...

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
//by NeighThorn
using namespace std; const int maxn=+; int n,m,k,cnt,ans[maxn],need[maxn]; vector<int> v[maxn]; unsigned long long tr[maxn]; struct M{
int x,y,k,id,flag;
}q[maxn<<],q1[maxn<<],q2[maxn<<]; inline void insert(int x,int y){
for(;x<=m;x+=x&(-x))
tr[x]+=y;
} inline unsigned long long query(int x){
unsigned long long res=;
for(;x;x-=x&(-x))
res+=tr[x];
return res;
} inline void solve(int L,int R,int l,int r){
if(L>R)
return;
if(l==r){
for(int i=L;i<=R;i++)
if(q[i].flag==)
ans[q[i].id]=l;
return;
}
int mid=(l+r)>>,l1=,l2=;
for(int i=L;i<=R;i++){
if(q[i].flag==){
if(q[i].id<=mid)
insert(q[i].x,q[i].k),insert(q[i].y+,-q[i].k),q1[l1++]=q[i];
else
q2[l2++]=q[i];
}
else{
unsigned long long lala=;
for(int j=;j<v[q[i].id].size();j++)
lala+=query(v[q[i].id][j]);
if(lala>=q[i].k)
q1[l1++]=q[i];
else
q[i].k-=lala,q2[l2++]=q[i];
}
}
for(int i=;i<l1;i++)
if(q1[i].flag==)
insert(q1[i].x,-q1[i].k),insert(q1[i].y+,q1[i].k);
for(int i=;i<l1;i++)
q[L+i]=q1[i];
for(int i=;i<l2;i++)
q[L+l1+i]=q2[i];
solve(L,L+l1-,l,mid),solve(L+l1,R,mid+,r);
} signed main(void){
scanf("%d%d",&n,&m);
for(int i=,x;i<=m;i++)
scanf("%d",&x),v[x].push_back(i);
for(int i=;i<=n;i++)
scanf("%d",&need[i]);
scanf("%d",&k);
for(int i=,s,x,y;i<=k;i++){
scanf("%d%d%d",&x,&y,&s);
if(x<=y)
q[++cnt].x=x,q[cnt].y=y,q[cnt].k=s,q[cnt].flag=,q[cnt].id=i;
else
q[++cnt].x=x,q[cnt].y=m,q[cnt].k=s,q[cnt].flag=,q[cnt].id=i,
q[++cnt].x=,q[cnt].y=y,q[cnt].k=s,q[cnt].flag=,q[cnt].id=i;
}
for(int i=;i<=n;i++)
q[++cnt].k=need[i],q[cnt].id=i,q[cnt].flag=;
solve(,cnt,,k+);
for(int i=;i<=n;i++){
if(ans[i]==k+)
puts("NIE");
else
printf("%d\n",ans[i]);
}
return ;
}//Cap ou pas cap. Cap.

By NeighThorn

整体二分QAQ的更多相关文章

  1. BZOJ2527 [Poi2011]Meteors 整体二分 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686460.html 题目传送门 - BZOJ2527 题意 有$n$个国家. 太空里有$m$个太空站排成一个圆 ...

  2. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

  3. 一篇自己都看不懂的CDQ分治&整体二分学习笔记

    作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...

  4. 洛谷P3242 接水果 [HNOI2015] 整体二分

    正解:整体二分+树状数组 解题报告: 传送门! 题目还是大概解释下?虽然其实是看得懂的来着,,, 大概就是说给一棵树.给定一些询问,每个询问都是说在两个点之间的路径上的子路径的第k大是什么 然后看到这 ...

  5. 洛谷P3250 网络 [HNOI2016] 整体二分

    正解:整体二分+树状数组 解题报告: 传送门! 亲这里的建议是用整体二分呢 dbq最近看sd淘宝说话体看多了有点脑抽,,, 首先考虑如果是单组询问怎么做昂QAQ 考虑二分答案 对于所有比mid小的操作 ...

  6. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  7. [学习笔记] CDQ分治&整体二分

    突然诈尸.png 这两个东西好像都是离线骗分大法... 不过其实这两个东西并不是一样的... 虽然代码长得比较像 CDQ分治 基本思想 其实CDQ分治的基本思想挺简单的... 大概思路就是长这样的: ...

  8. BZOJ3110 K大数查询 【线段树 + 整体二分 或 树套树(非正解)】

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

  9. P5163 WD与地图(整体二分+权值线段树)

    传送门 细节要人命.jpg 这题思路太新奇了--首先不难发现可以倒着做变成加边,但是它还需要我们资瓷加边的同时维护强连通分量.显然加边之后暴力跑是不行的 然后有一个想法,对于一条边\((u,v)\), ...

随机推荐

  1. 如何利用ETW(Event Tracing for Windows)记录日志

    ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统.由于采用内核(Kernel)层面的缓冲和日志记录机制,所以ETW提供了一种非常高效的事 ...

  2. iOS微信里打开app,Universal Links

    这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...

  3. 内存映射文件MemoryMappedFile使用

    参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...

  4. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  5. 【夯实PHP基础】nginx php-fpm 输出php错误日志

    本文地址 原文地址 分享提纲: 1.概述 2.解决办法(解决nginx下php-fpm不记录php错误日志) 1. 概述 nginx是一个web服务器,因此nginx的access日志只有对访问页面的 ...

  6. jquery-treegrid树状表格的使用(.Net平台)

    上一篇介绍了DataTable,这一篇在DT的基础之上再使用jquery的一款插件:treegrid,官网地址:http://maxazan.github.io/jquery-treegrid/ 一. ...

  7. 中文 iOS/Mac 开发博客列表

    中文 iOS/Mac 开发博客列表 博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 一只魔法师的工坊 http://blog.ibireme.com ...

  8. “此网页上的某个 Web 部件或 Web 表单控件无法显示或导入。找不到该类型,或该类型未注册为安全类型。”

    自从vs装了Resharper,看见提示总是手贱的想去改掉它.于是乎手一抖,把一个 可视web部件的命名空间给改了. 喏,从LibrarySharePoint.WebPart.LibraryAddEd ...

  9. App 审核由于 IPv6 网络问题被拒

    昨天 提交App Store 的时候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS ...

  10. Spring异步功能

    使用 Spring 的异步功能时,实质是使用的 Servlet3 及以上版本的异步功能. Spring 的异步处理机制需要在 web.xml 中全部的 servlet 和 filter 处配置 < ...