题目:

http://www.lydsy.com/JudgeOnline/problem.php?id=2653


题解:

设答案为ans,把大于等于ans的记为1,小于的记为-1,这样可以知道当前ans是大了还是小了

然后二分答案,就是求最大子段和的问题,根据网上的题解:[b,c]是必选的,然后选[a,b]和[c,d]的最大字段和就行了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 20010
using namespace std;
int sz,q,root[N],ls[N*],rs[N*],sum[N*],lm[N*],rm[N*],n,m,b[],lastans;
struct node
{
int p,v;
}a[N];
bool cmp(node a,node b)
{
return a.v<b.v;
}
void update(int k)
{
sum[k]=sum[ls[k]]+sum[rs[k]];
lm[k]=max(lm[ls[k]],sum[ls[k]]+lm[rs[k]]);
rm[k]=max(rm[rs[k]],sum[rs[k]]+rm[ls[k]]);
}
void build(int &rt,int l,int r)
{
rt=++sz;
int mid=l+r>>;
if (l==r)
{
sum[rt]=lm[rt]=rm[rt]=;
return;
}
build(ls[rt],l,mid);
build(rs[rt],mid+,r);
update(rt);
}
void insert(int x,int l,int r,int &y,int p,int v)
{
y=++sz;
ls[y]=ls[x];
rs[y]=rs[x];
if (l==r)
{
sum[y]=lm[y]=rm[y]=v;
return;
}
int mid=(l+r)>>;
if (p<=mid) insert(ls[x],l,mid,ls[y],p,v);
else insert(rs[x],mid+,r,rs[y],p,v);
update(y);
}
int que1(int k,int l,int r,int ll,int rr)
{
if (ll==l&&r==rr) return sum[k];
int mid=(l+r)>>;
if (rr<=mid) return que1(ls[k],l,mid,ll,rr);
else if (ll>mid) return que1(rs[k],mid+,r,ll,rr);
else return que1(ls[k],l,mid,ll,mid)+que1(rs[k],mid+,r,mid+,rr);
}
int que2(int k,int l,int r,int ll,int rr)
{
if (ll==l&&r==rr) return rm[k];
int mid=(l+r)>>;
if (rr<=mid) return que2(ls[k],l,mid,ll,rr);
else if (ll>mid) return que2(rs[k],mid+,r,ll,rr);
else return max(que2(rs[k],mid+,r,mid+,rr),que1(rs[k],mid+,r,mid+,rr)+que2(ls[k],l,mid,ll,mid));
}
int que3(int k,int l,int r,int ll,int rr)
{
if (ll==l&&r==rr) return lm[k];
int mid=(l+r)>>;
if (rr<=mid) return que3(ls[k],l,mid,ll,rr);
else if (ll>mid) return que3(rs[k],mid+,r,ll,rr);
else return max(que3(ls[k],l,mid,ll,mid),que1(ls[k],l,mid,ll,mid)+que3(rs[k],mid+,r,mid+,rr));
}
bool judge(int k,int a,int b,int c,int d)
{
int temp();
if (c->b) temp+=que1(root[k],,n-,b+,c-);
temp+=que2(root[k],,n-,a,b);
temp+=que3(root[k],,n-,c,d);
return temp>=;
}
int main()
{
scanf("%d",&n);
for (int i=; i<n; i++)
{
scanf("%d",&a[i].v);
a[i].p=i;
}
sort(a,a+n,cmp);
build(root[],,n-);
for (int i=; i<n; i++)insert(root[i-],,n-,root[i],a[i-].p,-);
scanf("%d",&q);
for (int i=; i<=q; i++)
{
scanf("%d%d%d%d",&b[],&b[],&b[],&b[]);
for (int j=; j<; j++) b[j]=(b[j]+lastans)%n;
sort(b,b+);
int l=,r=n-,x;
while (l<=r)
{
int mid=(l+r)>>;
if (judge(mid,b[],b[],b[],b[])) x=mid,l=mid+;
else r=mid-;
}
lastans=a[x].v;
printf("%d\n",lastans);
}
}

BZOJ 2653 middle | 主席树的更多相关文章

  1. bzoj 2653: middle (主席树+二分)

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2522  Solved: 1434[Submit][Status][Disc ...

  2. bzoj 2653 middle(主席树)

    题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...

  3. BZOJ 2653: middle(主席树+二分答案)

    传送门 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案.但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做 ...

  4. BZOJ 2653: middle 主席树 二分

    https://www.lydsy.com/JudgeOnline/problem.php?id=2653 因为是两个方向向外延伸所以不能对编号取前缀和(这里只有前缀和向后传递的性质,不是实际意义的和 ...

  5. BZOJ 2653: middle [主席树 中位数]

    传送门 题意: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右 ...

  6. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  7. bzoj 2653 middle 二分答案 主席树判定

    判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好 但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为 ...

  8. BZOJ 2653 middle 二分答案+可持久化线段树

    题目大意:有一个序列,包含多次询问.询问区间左右端点在规定区间里移动所得到的最大中位数的值. 考虑对于每个询问,如何得到最优区间?枚举显然是超时的,只能考虑二分. 中位数的定义是在一个序列中,比中位数 ...

  9. [BZOJ2653]middle 主席树+二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2042  Solved: 1123[Submit][Status][Disc ...

随机推荐

  1. HashMap的使用

    HashMap的使用 import java.util.HashMap; import java.util.Iterator; //HashMap<key, value>():键值对的形式 ...

  2. Spring Cloud 入门Eureka -Consumer服务消费(Ribbon)(二)

    前面一篇介绍了LoadBalancerClient来实现负载均衡, 这里介绍Spring cloud ribbon 1.ribbon Spring Cloud Ribbon 是一个基于Http和TCP ...

  3. Dnsmasq域名解析系统安装配置

    Dnsmasq使用上比bind要简便得多,可以做正向.反向dns解析,支持DHCP服务.也可以做内部dns服务器用. 默认下,dnsmasq使用系统的/etc/resolv.conf,并读取/etc/ ...

  4. mysql,oracle表数据相互导入

    mysql导入oracle: 例如mysql中有ts_user_info表,现在要导入到oracle中的user_info表 1:导出mysql表数据到data.txt文件 mysql> sel ...

  5. MySQL数据库 : 查询语句,连接查询及外键约束

    查询指定字段        select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行)             select distinct 字段1,字段2.. ...

  6. manjaro无法使用ifconfig查ip

    manjaro中自带的查看网络的命令是: ip addr 可以了解一下ip命令都有哪些功能 如果还是想要 ifconfig 需要安装net-tools 安装命令: sudo pacman -S net ...

  7. C++ 无符号整型和整型的区别

    在Win 7系统中,short 表示的范围为 - 32767到 32767,而无符号的short表示的范围为0 到 65535,其他类型的同理可推导出来,当然,仅当数字不为负的时候才使用无符号类型. ...

  8. 3771: Triple

    3771: Triple 链接 题意 n个斧头,每个斧头的价值都不同(开始时没注意到),可以取1个,2个,3个斧头组成不同的价值,求每种价值有多少种组成方案(顺序不同算一种) 分析: 生成函数 + 容 ...

  9. Android 布局错乱 Android花屏

    最近做项目,妈的,有个一个很难受的bug. 这个bug ,自己这里没有手机,没有办法复现,找到了手机之后.解决了. 我先给大家看下什么叫布局错乱,花屏: 来张正常的图片: 正常情况下是这样的.然后, ...

  10. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...