http://cogs.pro:8080/cogs/problem/problem.php?pid=1763

二分答案x

把区间内>=x的数设为1,<x的数设为-1

左端点在[a,b]之间,右端点在[c,d]之间的子序列中,若中位数>=x,

那么 [b+1,c-1]的区间和+[a,b]的最大右子段和+[c,d]的最大左子段和>=0

查询可以用线段树

多组询问,不能每一次二分都重设1和-1

所以用主席树

其中第i棵线段树表示<=i的都被设成了-1

因为主席树是线段树的前缀和,所以一次修改只需要改第i棵线段树,就可以得到<=i的都被设成-1的线段树

#include<cstdio>
#include<iostream>
#include<algorithm> #define N 20001 using namespace std; int n; pair<int,int>a[N]; int cnt;
int root[N],lc[N*],rc[N*]; int q[]; struct node
{
int sum,lmax,rmax; node operator + (node p)
{
node c;
c.sum=sum+p.sum;
c.lmax=max(lmax,sum+p.lmax);
c.rmax=max(p.rmax,rmax+p.sum);
return c;
} }e[N*],zero; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void build(int &k,int l,int r)
{
k=++cnt;
if(l==r)
{
e[k].sum=e[k].lmax=e[k].rmax=;
return;
}
int mid=l+r>>;
build(lc[k],l,mid);
build(rc[k],mid+,r);
e[k]=e[lc[k]]+e[rc[k]];
} void change(int pre,int &k,int l,int r,int pos)
{
k=++cnt;
if(l==r)
{
e[k].sum=e[k].lmax=e[k].rmax=-;
return;
}
int mid=l+r>>;
if(pos<=mid)
{
rc[k]=rc[pre];
change(lc[pre],lc[k],l,mid,pos);
}
else
{
lc[k]=lc[pre];
change(rc[pre],rc[k],mid+,r,pos);
}
e[k]=e[lc[k]]+e[rc[k]];
} node query(int k,int l,int r,int opl,int opr)
{
if(opl>opr) return zero;
if(l>=opl && r<=opr) return e[k];
int mid=l+r>>;
if(opr<=mid) return query(lc[k],l,mid,opl,opr);
if(opl>mid) return query(rc[k],mid+,r,opl,opr);
return query(lc[k],l,mid,opl,opr)+query(rc[k],mid+,r,opl,opr);
} bool check(int pos)
{
if(query(root[pos],,n,q[],q[]).rmax+query(root[pos],,n,q[]+,q[]-).sum+query(root[pos],,n,q[],q[]).lmax>=) return true;
return false;
} int main()
{
freopen("nt2012_middle.in","r",stdin);
freopen("nt2012_middle.out","w",stdout);
read(n);
for(int i=;i<=n;++i)
{
read(a[i].first);
a[i].second=i;
}
sort(a+,a+n+);
build(root[],,n);
for(int i=;i<=n;++i) change(root[i-],root[i],,n,a[i].second);
int m;
read(m);
int ans=;
int l,r,mid;
while(m--)
{
for(int i=;i<;++i)
{
read(q[i]);
q[i]+=ans;
q[i]%=n;
q[i]++;
}
sort(q,q+);
l=,r=n;
while(l<=r)
{
mid=l+r>>;
if(check(mid-)) ans=mid,l=mid+;
else r=mid-;
}
ans=a[ans].first;
cout<<ans<<'\n';
}
}

1763. [国家集训队2012]middle

★★★☆   输入文件:nt2012_middle.in   输出文件:nt2012_middle.out   简单对比
时间限制:3 s   内存限制:1024 MB

middle(陈立杰)
时间限制:3.0s   内存限制:1.0GB

【大意】

一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整。
给你一个长度为n的序列s。
回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数。
其中a<b<c<d。
位置也从0开始标号。
我会使用一些方式强制你在线。

【输入格式】

第一行序列长度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]。
输入保证满足条件。

【输出格式】

Q行依次给出询问的答案。

【数据规模和约定】

0:n,Q<=100
1,...,5:n<=2000
0,...,19:n<=20000,Q<=25000

【样例输入】

5
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0

【样例输出】

271451044
271451044
969056313

[国家集训队2012]middle的更多相关文章

  1. [国家集训队2012]middle(陈立杰)

    我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...

  2. [国家集训队2012]JZPFAR

    [国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...

  3. [国家集训队2012]tree(陈立杰)

    [国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...

  4. 「国家集训队」middle

    「国家集训队」middle 传送门 按照中位数题的套路,二分答案 \(mid\),序列中 \(\ge mid\) 记为 \(1\),\(< mid\) 的记为 \(-1\) 然后只要存在一个区间 ...

  5. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  6. 【国家集训队2012】tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:  + u v c:将u到v的路径上的点的权值都加上自然数c:  - u1 v1 u2 ...

  7. [COGS 1799][国家集训队2012]tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

  8. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  9. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

随机推荐

  1. 用C++实现一个Brainfuck解释器

    Brainfuck是一种极小化的计算机语言,只含有8种运算符,由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf**,甚至被简称为BF.正如它的名字所暗示,brainfuck ...

  2. okhttp3.4.1+retrofit2.1.0实现离线缓存

    关于Retrofit+OkHttp的强大这里就不多说了,还没了解的同学可以自行去百度.这篇文章主要讲如何利用Retrofit+OkHttp来实现一个较为简单的缓存策略:即有网环境下我们请求数据时,如果 ...

  3. 软件测试_测试工具_LoadRunner

    最近正在逐步学习软件测试工具的使用,此文章也是用来当做笔记以供记录之用.如有问题,还请多多指出. 安装LoadRunner基本步骤从网上搜索即可找到,特此提供部分链接参考(其中附带软件下载): 1.L ...

  4. 网站遭受大量CC攻击后的应对策略

    上周开始我网站遭受了一大波CC攻击,到目前为止仍在继续,作为一个建站小白,我感觉压力好大,又有新的问题要挑战了! 服务器架设在腾讯云,CC攻击很凶猛,带宽瞬间占满,于是在腾讯云后台配置安全组关闭了80 ...

  5. supervisor管理进程 superlance对进程状态报警

    supervisor介绍 首先,介绍一下supervisor.Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linu ...

  6. 小白之selenium+python关于cookies绕开登录2

    首先,由于新开始在博客园中写随笔,可能在内容的布局方面就不太懂,导致布局很丑,各位见谅,但是字还是原来的那字,内容还是原来的内容,少了点包装, 下面是对cookie的扩展知识 1.配置文件存储在哪里? ...

  7. Frida----安装

    介绍 它是本机应用程序的 Greasemonkey,或者更多技术术语,它是一个动态代码检测工具包.它允许您将JavaScript或您自己的库的片段注入Windows,macOS,GNU / Linux ...

  8. laravel从5.2到5.5从入门到精通视频教程共16套

    laravel从5.2到5.5从入门到精通视频教程共16套,大部分都是实战项目比如P2P.博客.短网址.知乎门户.app软件开发.微信商城实战等 课程目录: 01.Laravel框架从入门到精通02. ...

  9. JAVA笔试准备

    建立时间:2019.4.19 修改时间: 腾讯:选择题(30个,一小时内),简答(2道)和编程题(2道) 涉及内容:(也有可能全是算法)C++,JAVA,数据结构,网络,Linux,计算题 1. 磁盘 ...

  10. PHP学习 安装环境和语法学习

    要回归技术了,昨天下午专门去深圳大学城图书馆借书,甚是漂亮 禁不住搞了几张照片 在图书馆里面的书真多,图书馆环境真好,清华大学 北京大学研究生院的学生们有福了,最后一句深圳政府真尼玛有钱,下图是图书馆 ...