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. opencv在图像显示中文

    在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...

  2. Openfiler配置RAC共享存储

    将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...

  3. 使用蓝灯后,IE浏览器以及内置IE浏览器的程序不能使用的解决方案

    使用完蓝灯后,每次使用IE浏览器都不能正常使用,于是有了下面的这个方案 1.通过Win+R 打开注册表编辑器(regedit) 进入目录 HKEY_CURRENT_USER \ Software \ ...

  4. SQL字符串函数

    LEN() :计算字符串长度(字符的个数.)datalength();//计算字符串所占用的字节数,不属于字符串函数.测试varchar变量与nvarchar变量存储字符串a的区别.见备注1.LOWE ...

  5. Kafka:主要参数详解(转)

    原文地址:http://kafka.apache.org/documentation.html ############################# System ############### ...

  6. GCC学习(1)之MinGW使用

    GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...

  7. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  8. mono for android学习过程系列教程(1)

    直接进入主题,关于mono for android的学习,首先配置好环境,如何配置环境,度娘谷歌一大堆,记得使用破解版. 我自己是百度“黑马四期”传智播客的视频,里面有破解版开发环境的软件. 今天直接 ...

  9. Visual Studio Code预览版Ver 0.3.0试用体验

    当你开始阅读这篇文章时,请先不要把Visual Studio Code和.net.Windows联想到一起,因为VS Code是一个跨平台,支持30多种语言的开箱代码编辑器.不管你是.Net.Java ...

  10. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...