洛谷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小数. 输入输出格式 输入 ...
随机推荐
- C#~异步编程再续~你必须要知道的ThreadPool里的throw
问题依旧存在 之前写过相关文章异步编程的文章,本文主要还是一点补充,之前在IIS经常发w3wp进程无做挂了的情况,但一直没能找到真正的原因,而查找相关资料,找了一些相关的文章,如await和async ...
- Windows窗体应用布局详解
上回我们已经会用基本的控件创建Windows窗体应用,这才我们再来认识一些高级控件并使用ADO.NET技术连接数据库来创建功能更坚强大的窗体应用! 菜单栏控件MenuStrip .NET中提供了一个M ...
- 亿财道APP赚钱攻略,亿财道,一个看广告年入36万的APP
亿财道(http://etway.net/),一款看广告(传单)赚钱的软件,这是一项革新的广告产品,代替了以往的纸质传单.在商家节约成本的同时,还给阅读者佣金,推广也有相应提成比例. ...
- (转载)android 一些工具类汇总
android 一些工具类汇总 作者:曾田生z 字体:[增加 减小] 类型:转载 时间:2016-08-14我要评论 本文给大家汇总介绍了一些常用的Android工具类,非常的简单实用,有需要的小伙伴 ...
- Tomcat学习(一)——使用Eclipse绑定Tomcat并发布应用
1.下载Tomcat 官网地址:http://tomcat.apache.org/whichversion.html 2.目录结构 bin:脚本目录 启动脚本:startup.bat 停止脚本:shu ...
- java中三个类别加载器的关系以及各自加载的类的范围
Java在需要使用类别的时候,才会将类别加载,Java的类别载入是由类别载入器(Class loader)来达到的,预设上,在程序启动之后,主要会有三个类别加载器:Bootstrap Loader.E ...
- Codeforces Round #289 Div 2
A. Maximum in Table 题意:给定一个表格,它的第一行全为1,第一列全为1,另外的数满足a[i][j]=a[i-1][j]+a[i][j-1],求这个表格中的最大的数 a[n][n]即 ...
- split方法切割数组
指定的字符串按"o"截取 当一个base64需要剪去前面的部分的时候 var params={ "imgJustBase64":this.zheng.split ...
- GET,POST请求
get请求 post请求
- luogu P1375 小猫(卡特兰数)
题意 (n<=200000) 题解 把DP转移方程写出来,这不是卡特兰数吗?然后就解决了. 做完这题我发现 DP真是一个好东西. (公式连乘所以中间要加mod要不爆longlong了) #inc ...