首页 > BZOJ 3110

BZOJ 3110

http://www.lydsy.com/JudgeOnline/problem.php?id=3110

整体二分+区间修改树状数组维护

#include
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return atail)return;if(l==r){FOR(i,head,tail)if(p[i].k==2)ans[p[i].pos]=l;return ;}int mid=(l+r)>>1;FOR(i,head,tail){if(p[i].k==1&&p[i].c>mid)_add(p[i].a,p[i].b,1ll);if(p[i].k==2)tmp[i]=_query(p[i].a,p[i].b);}	int top=head,d;FOR(i,head,tail){if(p[i].k==1&&p[i].c>mid)t[top++]=p[i],_add(p[i].a,p[i].b,-1ll);if(p[i].k==2)if(p[i].c<=tmp[i])t[top++]=p[i];}d=top;FOR(i,head,tail){if(p[i].k==1&&p[i].c<=mid)t[top++]=p[i];if(p[i].k==2)if(p[i].c>tmp[i])p[i].c-=tmp[i],t[top++]=p[i];	}FOR(i,head,tail)p[i]=t[i];solve(mid+1,r,head,d-1);solve(l,mid,d,tail);}
}
using namespace divide;
int main(){scanf("%d%d",&n,&m);minn=inf,maxx=-inf;FOR(i,1,m){scanf("%d%d%d%d",&p[i].k,&p[i].a,&p[i].b,&p[i].c);if(p[i].k==2)p[i].pos=++ans[0];if(p[i].k==1)minn=min(minn,p[i].c),maxx=max(maxx,p[i].c);}solve(minn,maxx,1,m);FOR(i,1,ans[0])printf("%d
",ans[i]);return 0;
}

  

补一份树套树

树状数组套主席树

#include
#include
#define lson l,mid
#define rson (mid+1),r
using namespace std;
const int maxn=1e5,N=3000000;
int n,m,tot;
int root[maxn],ra[maxn],rb[maxn];
int a[maxn],b[maxn];
struct Query{char type;int l,r,k;
}q[maxn];
struct Chainman_Tree{int ls,rs,sum;
}tr[N];
namespace BIT_with_Chainman_Tree{inline void insert(int &rt,int p,int v,int l=1,int r=b[0]){tr[++tot]=tr[rt];tr[rt=tot].sum+=v;if(l==r)return;int mid=(l+r)>>1;p<=mid?insert(tr[rt].ls,p,v,lson):insert(tr[rt].rs,p,v,rson);}inline int ask(int k,int l=1,int r=b[0]){if(l==r)return l;register int sum=0;for(register int i=1;i<=ra[0];++i)sum-=tr[tr[ra[i]].ls].sum;for(register int i=1;i<=rb[0];++i)sum+=tr[tr[rb[i]].ls].sum;int mid=(l+r)>>1;if(k<=sum){for(register int i=1;i<=ra[0];++i)ra[i]=tr[ra[i]].ls;for(register int i=1;i<=rb[0];++i)rb[i]=tr[rb[i]].ls;return ask(k,lson);}for(register int i=1;i<=ra[0];++i)ra[i]=tr[ra[i]].rs;			for(register int i=1;i<=rb[0];++i)rb[i]=tr[rb[i]].rs;return ask(k-sum,rson);}inline int query(int l,int r,int k){ra[0]=rb[0]=0;for(register int i=l-1;i;i-=i&-i)ra[++ra[0]]=root[i];for(register int i=r;i;i-=i&-i)rb[++rb[0]]=root[i];return ask(k);}inline void modify(int pos,int val,int v){for(;pos<=n;pos+=pos&-pos)insert(root[pos],val,v);}
}
using namespace BIT_with_Chainman_Tree;
inline void disc_init(){sort(b+1,b+b[0]+1);b[0]=unique(b+1,b+b[0]+1)-b-1;for(register int i=1;i<=n;++i){a[i]=lower_bound(b+1,b+b[0]+1,a[i])-b;modify(i,a[i],1);		}
}
char s[6];
int main(){scanf("%d%d",&n,&m);for(register int i=1;i<=n;++i){scanf("%d",a+i);b[++b[0]]=a[i];}for(register int i=1;i<=m;++i){scanf("%s",s);q[i].type=s[0];if(q[i].type=='C'){scanf("%d%d",&q[i].l,&q[i].k);b[++b[0]]=q[i].k;}elsescanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);}disc_init();for(register int i=1;i<=m;++i){if(q[i].type=='C'){q[i].k=lower_bound(b+1,b+b[0]+1,q[i].k)-b;modify(q[i].l,a[q[i].l],-1);a[q[i].l]=q[i].k;modify(q[i].l,a[q[i].l],1);}elseprintf("%d
",b[query(q[i].l,q[i].r,q[i].k)]);}	return 0;
}

  

转载于:https://www.cnblogs.com/Stump/p/8012641.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • #include #include #include #include #include #include #include

  • 题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解题: 数值错误的形式有多种多样,但是正确的...

  • 加法伺候  //超过20位数值相加---------------------------------------- function bigNumAdd(a, b) {if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必...

  • 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程...

  • 简单record 一下 #include // 'struct sockaddr_in' #include #include // 'struct ifreq' and 'struct if_nameindex' #include #inc...

  • 用python编写乘法口诀表的方法 发布时间:2020-08-25 11:46:35 来源:亿速云 阅读:60 作者:小新 用python编写乘法口诀表的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧! 第一种:使用for遍历循环嵌套for x in...

  • //很长一段时间我都只使用以下方式做数组循环,具体原因看数据 var aa = for (var i = 0, l = aa.length; i < l; i++) { var a = aa[i];} 数据采集图片来源于网友 很明显,for循环第二种方式完胜!!! 至于for in、forEach什么的,不知道甩他们多少...

  • 目录 1. Scene Graph Generation with External Knowledge and Image Reconstruction 2. Knowledge Acquisition for Visual Question Answering via Iterative Querying Author...

  • 基础题1: 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等。输入输出示例如下: 输入: 3 1 2 3 4 5 6 7...

  • 程序流程控制 分支 顺序 循环 if switch&case 1 2 3 调整 break 1.6 前 switch(byte、short、char、int) 1.7 可放String 循环 while(次数不确定) do while for(确定次数) break(跳出本层循环) continue(跳出本次循环)     *   2...