CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence
#include<bits/stdc++.h>
#define RG register
#define IL inline
#define _ 100100
#define inf 1e9+7
using namespace std;
IL int gi(){
RG int data = 0 , m = 1; RG char ch = 0;
while(ch != '-' && (ch<'0' || ch > '9')) ch = getchar();
if(ch == '-'){m = 0; ch = getchar();}
while(ch>='0' && ch<='9'){data = (data<<1) + (data<<3) + ch - '0' ; ch = getchar();}
return (m) ? data : -data ;
}
struct Num{
int h,p;
bool operator < (const Num & B) const{
return h < B.h ;
}
}I[_] ;
int n,X[_],xox,L,R,ret,Q,rt[_],tot;
struct Result{
int lx,rx,Ex,sum; bool jd;
IL void Mem(int d){lx = rx = Ex = sum = d; jd = (d ^ 1) ; }
}; Result Ans ;
struct Node{int ls,rs; Result E; }t[20*_];
Result operator + (Result A,Result B){
RG Result C;
C.Ex = max(A.Ex ,B.Ex) ;
C.lx = A.lx; C.rx = B.rx ;
if(!A.jd)C.lx = A.sum + B.lx;
if(!B.jd)C.rx = B.sum + A.rx;
C.sum = A.sum + B.sum ;
C.jd = ( A.jd | B.jd );
C.Ex = max(A.rx + B.lx , C.Ex) ;
return C ;
}
void Build(int &o,int l,int r){
o = ++ tot;
if(l == r){t[o].E.Mem(0) ; return ; }
RG int mid = (l + r) >> 1;
Build(t[o].ls , l , mid) ; Build(t[o].rs , mid + 1 , r) ;
t[o].E = t[t[o].ls].E + t[t[o].rs].E ;
}
void Update(int &o,int l,int r,int p){
t[++tot] = t[o]; o = tot ;
if(l == r){t[o].E.Mem(1) ; return ; }
RG int mid = (l + r) >> 1;
if(p <= mid) Update(t[o].ls , l , mid , p) ;
else if(p > mid) Update(t[o].rs , mid + 1 , r , p) ;
t[o].E = t[t[o].ls].E + t[t[o].rs].E ;
}
Result Query(int o,int l,int r,int ql,int qr){
if(ql == l && r == qr)return t[o].E ;
RG int mid = (l + r) >> 1;
if(qr <= mid) return Query(t[o].ls,l,mid,ql,qr) ;
else if(ql > mid) return Query(t[o].rs,mid+1,r,ql,qr) ;
else return Query(t[o].ls,l,mid,ql,mid) + Query(t[o].rs,mid+1,r,mid+1,qr) ;
}
int main(){
n = gi() ;
for(RG int i = 1; i <= n; i ++) I[i].h = gi() , I[i].p = i ;
sort(I + 1 , I + n + 1) ;
for(RG int i = 1; i <= n; i ++) X[i] = I[i].h ;
xox = unique(X + 1, X + n + 1) - X - 1 ;
for(RG int i = 1; i <= n; i ++)
I[i].h = lower_bound(X + 1 , X + xox + 1 , I[i].h) - X ;
Build(rt[n+1] , 1 , n) ;
for(RG int i = n; i >= 1; i --)
rt[i] = rt[i+1] , Update(rt[i] , 1 , n , I[i].p) ;
Q = gi() ;
while(Q--){
RG int qL = gi() , qR = gi() , qK = gi() ;
//cout << "Query [" << qL << "," << qR << "] k="<<qK<<endl;
L = 1; R = n; ret = 0;
while(L <= R){
RG int mid = (L + R) >> 1;
Ans = Query(rt[mid] , 1 , n , qL , qR) ;
if(Ans.Ex >= qK){ret = mid; L = mid + 1;}
else R = mid - 1;
}
printf("%d\n" , X[I[ret].h]) ;
}return 0;
}
[国家集训队]middle
#include<bits/stdc++.h>
#define RG register
#define IL inline
#define _ 25005
#define inf 1e9+7
using namespace std;
IL int gi(){
RG int data = 0 , m = 1; RG char ch = 0;
while(ch != '-' && (ch<'0' || ch > '9')) ch = getchar();
if(ch == '-'){m = 0; ch = getchar();}
while(ch>='0' && ch<='9'){data = (data<<1) + (data<<3) + ch - '0' ; ch = getchar();}
return (m) ? data : -data ;
}
struct Result{int sum,ls,rs,lm,rm; }t[20*_] , Set ;
int n,m,a[_],X[_],xox,tot,ans,Q,A,B,C,D,rt[_]; struct Num{int d,p;}num[_] ;
IL void PushUp(int o){
RG int lc = t[o].ls , rc = t[o].rs ;
t[o].sum = t[lc].sum + t[rc].sum ;
t[o].lm = max(t[lc].lm , t[lc].sum + t[rc].lm) ;
t[o].rm = max(t[rc].rm , t[rc].sum + t[lc].rm) ;
}
void Mem(int &o,int l,int r){
o = ++ tot ;
if(l == r) { t[o].lm = t[o].rm = t[o].sum = 1; return ;}
RG int mid = (l + r) >> 1;
Mem(t[o].ls , l , mid) ; Mem(t[o].rs , mid + 1 , r) ;
PushUp(o) ;
}
void Build(int &o,int l,int r,int ps){
t[++tot] = t[o]; o = tot ;
if(l == r){ t[o].lm = t[o].rm = t[o].sum = -1; return ; }
RG int mid = (l + r) >> 1;
if(ps <= mid) Build(t[o].ls , l , mid , ps) ;
else if(ps > mid) Build(t[o].rs , mid + 1 , r , ps) ;
PushUp(o) ;
}
IL Result Merge(Result AA , Result BB){
Result CC ;
CC.sum = AA.sum + BB.sum ;
CC.lm = max(AA.lm , AA.sum + BB.lm) ;
CC.rm = max(BB.rm , BB.sum + AA.rm) ;
return CC ;
}
Result Query(int o,int l,int r,int ql,int qr){
if(ql <= l && r <= qr) {
Result Tmp = (Result){t[o].sum , 0 , 0 , t[o].lm , t[o].rm } ;
return Tmp ;
}
RG int mid = (l + r) >> 1;
if(qr <= mid) {return Query(t[o].ls , l , mid , ql , qr) ; }
else if(ql > mid) return Query(t[o].rs , mid + 1 , r , ql , qr) ;
else return
Merge(Query(t[o].ls , l , mid , ql , mid) , Query(t[o].rs , mid+1 , r , mid+1 , qr)) ;
}
IL bool cmp(Num AA,Num BB){return AA.d < BB.d ; }
int main(){
n = gi(); xox = 0;
for(RG int i = 1; i <= n; i ++)
X[++xox] = num[i].d = gi() , num[i].p = i;
sort(X + 1 , X + xox + 1) ;
xox = unique(X + 1 , X + xox + 1) - X - 1 ;
for(RG int i = 1; i <= n; i ++)
num[i].d = lower_bound(X + 1 , X + xox + 1 , num[i].d) - X;
sort(num + 1 , num + n + 1 , cmp) ;
Mem(rt[1] , 1 , n) ;
for(RG int i = 2; i <= n; i ++){
rt[i] = rt[i - 1] ;
Build(rt[i] , 1 , n , num[i-1].p) ;
}
ans = 0; Q = gi() ; RG int tmp[4] ;
while(Q --){
A = gi(); B = gi(); C = gi(); D = gi() ;
tmp[0] = (A + ans) % n + 1; tmp[1] = (B + ans) % n + 1;
tmp[2] = (C + ans) % n + 1; tmp[3] = (D + ans) % n + 1;
sort(tmp , tmp + 4) ;
A = tmp[0] ; B = tmp[1] ;
C = tmp[2] ; D = tmp[3] ;
//cout << " Query ["<<A<<","<<B<<"] && [" <<C<<","<<D<<"]"<<endl;
RG int ret = 0 , Data , L = 1 , R = n ;
while(L <= R){
RG int mid = (L + R) >> 1;
if(B+1 <= C-1)Data = ( Query(rt[mid] , 1 , n , B+1 , C-1).sum ) ;
else Data = 0;
Set = Query(rt[mid] , 1 , n , A , B) ;
Data += Set.rm ;
//cout <<"mid="<<mid<<" "<<" Set.rm = " <<Set.rm<<endl;
Set = Query(rt[mid] , 1 , n , C , D) ;
Data += Set.lm ;
if(Data >= 0){ret = num[mid].d; L = mid + 1; }
else R = mid - 1;
}
ans = X[ret] ;
printf("%d\n" , ans) ;
}return 0;
}
CF484E Sign on Fence && [国家集训队]middle的更多相关文章
- [国家集训队]middle 解题报告
[国家集训队]middle 主席树的想法感觉挺妙的,但是这题数据范围这么小,直接分块草过去不就好了吗 二分是要二分的,把\(<x\)置\(-1\),\(\ge x\)的置\(1\),于是我们需要 ...
- [国家集训队]middle
[国家集训队]middle 题目 解法 开\(n\)颗线段树,将第\(i\)颗线段树中大于等于第\(i\)小的数权值赋为1,其他的则为-1,对于每个区间维护一个区间和,最大前缀和,最大后缀和. 然后二 ...
- P2839 [国家集训队]middle
P2839 [国家集训队]middle 好妙的题啊,,,, 首先二分一个答案k,把数列里>=k的数置为1,=0就是k>=中位数,<0就是k<中位数 数列的最大和很好求哇 左边的 ...
- 【LG2839】[国家集训队]middle
[LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\( ...
- CF484E Sign on Fence
题意 给定一个长度为n的数列,有m次询问,询问形如l r k 要你在区间[l,r]内选一个长度为k的区间,求区间最小数的最大值 Sol 二分答案 怎么判定,每种数字开一棵线段树 某个位置上的数大于等于 ...
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
- luogu2839 [国家集训队]middle
题目链接:洛谷 题目大意:给定一个长度为$n$的序列,每次询问左端点在$[a,b]$,右端点在$[c,d]$的所有子区间的中位数的最大值.(强制在线) 这里的中位数定义为,对于一个长度为$n$的序列排 ...
- 解题:国家集训队 Middle
题面 求中位数的套路:二分,大于等于的设为1,小于的设为-1 于是可以从小到大排序后依次加入可持久化线段树,这样每次只会变化一个位置 那左右端点是区间怎么办? 先把中间的算上,然后维护每个区间左右两侧 ...
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
随机推荐
- 只需两步,rails支持CSV格式导出
一.Controller最上方添加 require 'csv' 二.方法里面添加 format.csv do csv_string = CSV.generate do |csv| csv <&l ...
- wireshark抓包分析——TCP/IP协议
本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...
- 关于DataTable.Select方法偶尔无法正确查到数据的处理方法
项目中经常用DataTable在内存中存储并操作数据,在进行报表开发的时候,报表的各种过滤功能用这个内存表可以大现身手,但最近在使用过程中却遇到一个奇怪的现象,现将该问题及处理方法记录一下.这是在做护 ...
- sqlserver 循环赋值变量
sql server 是可以用 @变量 +=值的: 第一:必须在循环里面, 第二: 必须在循环外面初始化变量的值 如: @变量=''; 这样才能循环给值
- 「日常训练&知识学习」树的直径(POJ-1849,Two)
题意 一个城市由节点和连接节点的街道组成,街道是双向的. 此刻大雪覆盖了这个城市,市长确定了一些街道要将它们清扫干净,这些街道保证所有的节点可以通过它们连通而且街道数目尽可能小. 现有两台相同的扫雪机 ...
- Python 更换国内pip源
pip国内的一些镜像: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/sim ...
- (Python爬虫02) 制定爬虫的学习计划了
公司清退是件很让人郁闷的事情,精,气,神 都会受到影响.焦虑的心态,涣散的眼神, 无所适从的若无其事,人周茶凉的快速交接,各种担忧....平静的面孔波涛汹涌的心.... 认识聊天中满满的套路...还有 ...
- UVa -1584 Circular Sequence 解题报告 - C语言
1.题目大意 输入长度为n$(2\le n\le 100)$的环状DNA串,找出该DNA串字典序最小的最小表示. 2.思路 这题特别简单,一一对比不同位置开始的字符串的字典序,更新result. 3. ...
- android课程第一节(TextView控件使用)
TextView控件使用 一.TextView基本使用(创建方式) 1.在程序中创建TextView对象 如下代码: @Override protected void onCreate(Bundle ...
- HADOOP docker(四):安装hive
1.hive简介2.安装hive2.1 环境准备2.1.1 下载安装包2.1.2 设置hive用户的环境变量2.1.3 hive服务端配置文件2.1.4 hive客户端配置文件2.1.4 分发hive ...