[洛谷2839/国家集训队]middle
Description
一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。给你一个长度为n的序列s。回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。
其中a<b<c<d。位置也从0开始标号。我会使用一些方式强制你在线。
Input
第一行序列长度n。接下来n行按顺序给出a中的数。
接下来一行Q。然后Q行每行a,b,c,d,我们令上个询问的答案是x(如果这是第一个询问则x=0)。
令数组q={(a+x)%n,(b+x)%n,(c+x)%n,(d+x)%n}。
将q从小到大排序之后,令真正的要询问的a=q[0],b=q[1],c=q[2],d=q[3]。
输入保证满足条件。
第一行所谓“排过序”指的是从小到大排序!
n<=20000,Q<=25000
Output
Q行依次给出询问的答案。
Sample Input
5
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0
Sample Output
271451044
271451044
969056313
首先这题是肯定具有可二分性的,那么我们按照权值大小顺序建立n棵主席树,对于每个权值下的主席树,其叶子节点表示位置l上的数是否小于自己,如果小于自己,则位置l的叶子节点点值为-1,大于等于则为1
这样子我们就可以在主席树的每个节点上记录前缀最大值和后缀最大值,每次二分答案的时候,判断[a,b]的后缀最大值+(b,c)的权值和+[c,d]的后缀最大值是否\(\geqslant 0\)
如果是,则l上移,否则r下移
/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int N=2e4,M=5e5;
int list[N+10],root[N+10],pos[N+10],n,T;
struct S1{
int v,ID;
void insert(int i){v=read(),ID=i;}
bool operator <(const S1 &tis)const{return v<tis.v;}
}val[N+10];
struct S2{
struct node{
int sum,Lf,Rg;
node(){sum=0,Lf=Rg=-inf;}
void insert(int x){sum=Lf=Rg=x;}
}tree[M+10];
int ls[M+10],rs[M+10],tot;
friend node operator +(const node &x,const node &y){
node z;
z.Lf=max(x.Lf,x.sum+y.Lf);
z.Rg=max(y.Rg,y.sum+x.Rg);
z.sum=x.sum+y.sum;
return z;
}
void build(int &p,int l,int r,int x){
p=++tot;
if (l==r){
tree[p].insert(l==x?1:-1);
return;
}
int mid=(l+r)>>1;
build(ls[p],l,mid,x);
build(rs[p],mid+1,r,x);
tree[p]=tree[ls[p]]+tree[rs[p]];
}
void insert(int &p,int k,int l,int r,int x){
tree[p=++tot]=tree[k];
ls[p]=ls[k],rs[p]=rs[k];
if (l==r){
tree[p].insert(1);
return;
}
int mid=(l+r)>>1;
if (x<=mid) insert(ls[p],ls[k],l,mid,x);
else insert(rs[p],rs[k],mid+1,r,x);
tree[p]=tree[ls[p]]+tree[rs[p]];
}
node Query(int p,int l,int r,int x,int y){
if (x<=l&&r<=y) return tree[p];
int mid=(l+r)>>1;
if (y<=mid) return Query(ls[p],l,mid,x,y);
if (x>mid) return Query(rs[p],mid+1,r,x,y);
return Query(ls[p],l,mid,x,y)+Query(rs[p],mid+1,r,x,y);
}
}CT;//Chairman Tree
int Q[5];
bool check(int limit){
int res=0;
if (Q[1]+1<=Q[2]-1) res+=CT.Query(root[limit],1,n,Q[1]+1,Q[2]-1).sum;
res+=CT.Query(root[limit],1,n,Q[0],Q[1]).Rg;
res+=CT.Query(root[limit],1,n,Q[2],Q[3]).Lf;
return res>=0;
}
int Binary_Search(){
int l=1,r=T;
while (l<=r){
int mid=(l+r)>>1;
if (check(mid)) l=mid+1;
else r=mid-1;
}
return r;
}
void init(int x){
Q[0]=(read()+x)%n,Q[1]=(read()+x)%n,Q[2]=(read()+x)%n,Q[3]=(read()+x)%n;
for (int i=0;i<4;i++) Q[i]++;
sort(Q,Q+4);
}
int main(){
n=read();
for (int i=1;i<=n;i++) val[i].insert(i);
sort(val+1,val+1+n);
for (int i=1;i<=n;i++) list[i]=val[i].v;
T=unique(list+1,list+1+n)-list-1;
for (int i=1;i<=n;i++) val[i].v=lower_bound(list+1,list+1+T,val[i].v)-list;
CT.build(root[val[n].v],1,n,val[n].ID);
for (int i=n-1;i;i--) CT.insert(root[val[i].v],root[val[i+1].v],1,n,val[i].ID);
int m=read(),lastans=0;
for (int i=1;i<=m;i++){
init(lastans);
printf("%d\n",lastans=list[Binary_Search()]);
}
return 0;
}
[洛谷2839/国家集训队]middle的更多相关文章
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
- 洛谷P2839 [国家集训队]middle 主席树_二分
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 【洛谷2839/BZOJ2653】middle(主席树)
题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- 洛谷P1501 [国家集训队]Tree II(LCT,Splay)
洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...
- 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...
- 洛谷 P1407 [国家集训队]稳定婚姻 解题报告
P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
随机推荐
- 最新---java多线程下载文件
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...
- Linux Grub系统加密、破密、修复
一.在重新启动系统时候按任意键进入 grub界面 Grub加密 一.title前的密码 修改grub.conf 这种加密只是在用户要进入grub界面的时候提示要输入密码,但是可以正常进入系统,有没有 ...
- web 界面设计---js设置txt值
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312&quo ...
- 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组
真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...
- 有关MAC、PHY和MII
这是一篇转载,原文链接:http://www.cppblog.com/totti1006/archive/2008/04/22/47829.html 以太网(Ethernet)是一种计算机局域网组网技 ...
- 异步编程错误处理 ERROR HANDLING
Chapter 16, "Errors and Exceptions," provides detailed coverage of errors and exception ha ...
- YTU 1098: The 3n + 1 problem
1098: The 3n + 1 problem 时间限制: 1 Sec 内存限制: 64 MB 提交: 368 解决: 148 题目描述 Consider the following algor ...
- 我的vim 配置——nerdtree、ack vim、vim sneak
set nu colorscheme darkblue syntax on " set term=xterm " 设置终端类型 set nonumber " 是否显示行号 ...
- Java总结基础知识
权限关键字: public:可以被所有其他类所访问,不同的包 protected:当前类的成员.同一个包中.不同包中对子类可见父类protected,继承类 default:同一包中的类可以访问,声明 ...
- [Usaco2009 MAR] Earthquake Damage 2
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1585 [算法] 一个最小割的经典模型 , 详见代码 时间复杂度 : O(dinic( ...