洛谷P2839 [国家集训队]middle 主席树_二分
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
using namespace std; void setIO(string a)
{
string in=a+".in",out=a+".out";
freopen(in.c_str(),"r",stdin);
//freopen(out.c_str(),"w",stdout);
} #define maxn 210000
int arr[maxn],A[maxn],root[maxn],n;
vector<int>position[maxn];
struct Segment_Tree
{
#define max_Tree 21000*100
int lson[max_Tree],rson[max_Tree],cnt;
int sumv[max_Tree],lmax[max_Tree],rmax[max_Tree];
void pushup(int o)
{
sumv[o]=sumv[lson[o]]+sumv[rson[o]];
lmax[o]=max(lmax[lson[o]],sumv[lson[o]]+lmax[rson[o]]);
rmax[o]=max(rmax[rson[o]],sumv[rson[o]]+rmax[lson[o]]);
}
void build(int l,int r,int &o)
{
if(l>r)return;
o=++cnt;
if(l==r)
{
sumv[o]=lmax[o]=rmax[o]=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson[o]);
build(mid+1,r,rson[o]);
pushup(o);
}
int update(int l,int r,int o,int pos) //modify val[pos] from 1 to -1
{
int oo=++cnt;
int mid=(l+r)>>1;
sumv[oo]=sumv[o];
lson[oo]=lson[o];
rson[oo]=rson[o];
if(l==r)
{
sumv[oo]=-1;
lmax[oo]=rmax[oo]=0;
return oo;
}
if(pos<=mid) lson[oo]=update(l,mid,lson[o],pos);
else rson[oo]=update(mid+1,r,rson[o],pos);
pushup(oo);
return oo;
}
int query_sum(int l,int r,int o,int L,int R)
{
if(l>r||r<L||l>R)return 0;
if(l>=L&&r<=R) return sumv[o];
int mid=(l+r)>>1;
return query_sum(l,mid,lson[o],L,R)+query_sum(mid+1,r,rson[o],L,R);
}
int query_left(int l,int r,int o,int L,int R)
{
if(l>r||r<L||l>R)return 0;
if(l>=L&&r<=R) return lmax[o];
int mid=(l+r)>>1;
return max(query_left(l,mid,lson[o],L,R),query_sum(l,mid,lson[o],L,R)+query_left(mid+1,r,rson[o],L,R));
}
int query_right(int l,int r,int o,int L,int R)
{
if(l>r||r<L||l>R)return 0;
if(l>=L&&r<=R) return rmax[o];
int mid=(l+r)>>1;
return max(query_right(mid+1,r,rson[o],L,R),query_sum(mid+1,r,rson[o],L,R)+query_right(l,mid,lson[o],L,R));
}
bool check(int a,int b,int c,int d,int tps)
{
int sum1=query_sum(1,n,root[tps],b,c);
int sum2=query_right(1,n,root[tps],a,b-1);
int sum3=query_left(1,n,root[tps],c+1,d);
if(sum1+sum2+sum3>=0)
return true;
return false;
}
}tree;
int main()
{
//setIO("input");
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&arr[i]);
for(int i=1;i<=n;++i) A[i]=arr[i];
sort(A+1,A+1+n);
for(int i=1;i<=n;++i) arr[i]=lower_bound(A+1,A+1+n,arr[i])-A; //离散编号
for(int i=1;i<=n;++i) position[arr[i]].push_back(i);
sort(arr+1,arr+1+n); int pre=arr[1];
tree.build(1,n,root[pre]); for(int i=2;i<=arr[n];++i)
{
int a=root[i-1];
for(int v=0;v<position[i-1].size();++v) a=tree.update(1,n,a,position[i-1][v]);
root[i]=a;
} int q,a,b,c,d,lastans=0,que[10];
scanf("%d",&q);
while(q--)
{
for(int i=1;i<=4;++i) scanf("%d",&que[i]),que[i]=(que[i]+lastans)%n+1;
sort(que+1,que+1+4);
a=que[1],b=que[2],c=que[3],d=que[4]; int l=1,r=n,mid,ans=1;
while(l<=r)
{
mid=(l+r)>>1;
if(tree.check(a,b,c,d,mid)) l=mid+1,ans=mid;
else r=mid-1;
}
lastans=A[ans];
printf("%d\n",lastans);
}
return 0;
}
洛谷P2839 [国家集训队]middle 主席树_二分的更多相关文章
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
- [洛谷2839/国家集训队]middle
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之 ...
- 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)
旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...
- 洛谷P1505 [国家集训队]旅游(树剖+线段树)
传送门 这该死的码农题…… 把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了 这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然 ...
- P2839 [国家集训队]middle
P2839 [国家集训队]middle 好妙的题啊,,,, 首先二分一个答案k,把数列里>=k的数置为1,=0就是k>=中位数,<0就是k<中位数 数列的最大和很好求哇 左边的 ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- 洛谷 P1505 [国家集训队]旅游 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
随机推荐
- m_Orchestrate learning system---五、学的越多,做的越快
m_Orchestrate learning system---五.学的越多,做的越快 一.总结 一句话总结: 1.上传的图像文件用input('post.')方法取不到是为什么? 图片不来就这样取不 ...
- 87.node.js操作mongoDB数据库示例分享
转自:https://www.cnblogs.com/mracale/p/5845148.html 连接数据库 var mongo=require("mongodb"); va ...
- [Codeforces 1051F] The Shortest Statement 解题报告(树+最短路)
题目链接: https://codeforces.com/contest/1051/problem/F 题目大意: 给出一张$n$个点,$m$条边的带权无向图,多次询问,每次给出$u,v$,要求输出$ ...
- Ubuntu16.04+GTX 1080Ti+CUDA 8.0+cuDNN+Tesnorflow1.0深度学习服务器安装之路
0.安装背景 系统:ubuntu 16.04 内核:4.4.0-140-generic GPU:GTX 1080Ti nvidia驱动版本: 384.111 cuda: CUDA 8.0 深度学习库c ...
- APACHE KYLIN™ 概览(分布式分析引擎)
Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区.它能 ...
- Java文件(io)编程——文件字节流的使用
案例1: 演示FileInputStream类的使用(用FileInputStream的对象把文件读入到内存) 首先要在E盘新建一个文本文件,命名为test.txt,输入若干字符 public cla ...
- 3ds Max制作客厅场景实例教程
附件系列 (图01) 让我们回顾一下场景:一个房间包括下列一件件家具, 在中间的一张小桌子,在房间的角落的一个小桌子,有一个垃圾桶和一个带镜子的边桌,有一个烛台.还有一个挂钟,窗帘,沙发和带手臂的椅子 ...
- BZOJ 2119 股市的预测(后缀数组)
首先要差分+离散化. 然后就是求形如ABA的串有多少,其中B的长度确定为k. 我们用到了设置关键点的思想.我们枚举A的长度L.然后在\(1,1+L,1+L*2,1+L*3...\)设置关键点.然后我们 ...
- luogu P1869 愚蠢的组合数(质因数+瞎搞)
题意 n<=105 题解 一个数是不是偶数就是看有没有二这个质因子. 所以我们先预处理每个数的阶乘的二这个质因子的数量 然后按公式判断就行了. #include<iostream> ...
- 2015 Multi-University Training Contest 4 hdu 5336 XYZ and Drops
XYZ and Drops Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...