我是萌萌的传送门

我是另一个萌萌的传送门

脑残错误毁一下午……

其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值排序之后依次插入序列,用主席树维护连续和……(我菜爆了……= =)

还是讲讲大体思路吧,首先二分答案M,把>=M的元素标为1,<M的标为-1,然后判定满足条件的最大子串和是否>=0,是则说明判定标准可行,否则不可行,调整下一次二分即可。但是直接暴力标记肯定会T,所以尝试对所有判定标准维护线段树来求最大子串和,然而内存开不下……考虑到如果把元素依次插入的话每次只会修改一个值,那么就把元素排序后依次插入线段树中,可持久化压内存即可。

一点细节:

鉴于子序列中间那段是肯定会用到的,所以直接拆成三段,前一段求最大后缀和,中间直接求和,后一段求最大前缀和,合并即可。因为最大前缀/后缀和是非严格最大(可以一个都不选),所以需要把b和c归到中间那段(保证一定会用上)。

贴个bzoj的代码:

 /**************************************************************
Problem: 2653
User: hzoier
Language: C++
Result: Accepted
Time:936 ms
Memory:101108 kb
****************************************************************/ #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
struct node{
int sum,prefix,suffix;
node *lc,*rc;
void refresh(){
sum=lc->sum+rc->sum;
prefix=max(lc->prefix,lc->sum+rc->prefix);
suffix=max(rc->suffix,rc->sum+lc->suffix);
}
}null[maxn<<],*ptr=null;
struct A{
int d,id;
bool operator<(const A &a)const{return d<a.d;}
}a[maxn];
void build(int,int,node*&);
void modify(int,int,node*&,node*&);
void qsum(int,int,node*);
void qprefix(int,int,node*);
void qsuffix(int,int,node*);
node *root[maxn];
int n,m,x,d,s,t,q[],tmp,sum,ans,lastans=,L,R,M;
int main(){
null->lc=null->rc=null;
null->sum=null->prefix=null->suffix=;
scanf("%d",&n);
fill(root,root+n+,(node*)null);
build(,n,root[]);
for(int i=;i<=n;i++){
scanf("%d",&a[i].d);
a[i].id=i;
}
sort(a+,a+n+);
for(int i=;i<=n;i++){
x=a[i].id;
modify(,n,root[i],root[i-]);
}
scanf("%d",&m);
while(m--){
for(int i=;i<;i++){
scanf("%d",&q[i]);
q[i]+=lastans;q[i]%=n;q[i]++;
}
sort(q,q+);
L=;R=n;
while(L<=R){
M=(L+R)>>;
ans=;
s=q[];t=q[];
qsum(,n,root[M-]);
s=q[];t=q[]-;
sum=tmp=;
if(s<=t)qsuffix(,n,root[M-]);
ans+=sum;
s=q[]+;t=q[];
sum=tmp=;
if(s<=t)qprefix(,n,root[M-]);
ans+=sum;
if(ans>=)L=M+;
else R=M-;
}
printf("%d\n",lastans=a[R].d);
}
return ;
}
void build(int l,int r,node *&rt){
rt=++ptr;
rt->sum=rt->prefix=rt->suffix=r-l+;
if(l==r){
rt->lc=rt->rc=null;
return;
}
int mid=(l+r)>>;
build(l,mid,rt->lc);
build(mid+,r,rt->rc);
}
void modify(int l,int r,node *&rt,node *&pr){
*(rt=++ptr)=*pr;
if(l==r){
rt->sum=-;
rt->prefix=rt->suffix=;
return;
}
int mid=(l+r)>>;
if(x<=mid)modify(l,mid,rt->lc,pr->lc);
else modify(mid+,r,rt->rc,pr->rc);
rt->refresh();
}
void qsum(int l,int r,node *rt){
if(s<=l&&t>=r){
ans+=rt->sum;
return;
}
int mid=(l+r)>>;
if(s<=mid)qsum(l,mid,rt->lc);
if(t>mid)qsum(mid+,r,rt->rc);
}
void qprefix(int l,int r,node *rt){
if(s<=l&&t>=r){
sum=max(sum,tmp+rt->prefix);
tmp+=rt->sum;
return;
}
int mid=(l+r)>>;
if(s<=mid)qprefix(l,mid,rt->lc);
if(t>mid)qprefix(mid+,r,rt->rc);
}
void qsuffix(int l,int r,node *rt){
if(s<=l&&t>=r){
sum=max(sum,tmp+rt->suffix);
tmp+=rt->sum;
return;
}
int mid=(l+r)>>;
if(t>mid)qsuffix(mid+,r,rt->rc);
if(s<=mid)qsuffix(l,mid,rt->lc);
}

话说这份代码跑得还挺快,哈哈……

写题过程中出了两个脑残错误,两个多小时就这么搭进去了……

1.如果序列长度为偶数,按题意中位数应为中间的两个数中较大的那个,然而我一开始读成了较小的那个,然后就死活弄不清脑子一片混乱……

2.注意到求最大后缀和最后一句if(s<=mid)了没……一开始写成了if(t<=mid),然后澄清完了题意还各种跟暴力拍不上,我特么都快崩溃了……后来发现是这个脑残错误,我只想说: $%*&$^%&#$%!@&#@^&*!%$^#@%*……

看看这惨烈的提交记录……

下次写题一定要先澄清题意……脑残怎么治啊……

[国家集训队2012]middle(陈立杰)的更多相关文章

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

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

  2. [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)

    tree 时间限制: 3 Sec  内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...

  3. [国家集训队2012]middle

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...

  4. BZOJ2654/COGS1764 [2012国家集训队]tree(陈立杰) [生成树,二分]

    BZOJ传送门,COGS传送门 tree Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V, ...

  5. [国家集训队2012]JZPFAR

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

  6. 「国家集训队」middle

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

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

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

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

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

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

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

随机推荐

  1. orange

    选型:使用orange系统 orange与kong的比较1.kong整体代码上较凌乱, orange相对较有条理2.kong本身不支持后台管理页面,只能通过api方式增,删,改plugin, oran ...

  2. js的事件机制二

    js的事件机制二 1.给合适的HTML标签添加合适的事件 onchange-----select下拉框 onload-----body标签 单双击-----用户会进行点击动作的HTML元素 鼠标事件 ...

  3. SyntaxError: Non-UTF-8 code starting with '\xb6' in file XX.py

    导致出错的根源就是编码问题. 解决方案是: 在程序最上面加上: # coding=gbk

  4. KVC 原理及自定义实现

    一.  setValue: forKey: 赋值过程 1.首先寻找setter方法(两个) - setName: -setIsName: 2.然后再寻找成员变量 默认 + (BOOL)accessIn ...

  5. yum安装pip命令

    pip命令是python里的命令,类似于linux系统里的yum命令 我们只需要安装python-pip这个包即可. yum -y install  python-pip 在linux下还有一个命令: ...

  6. python之小记with open...as..上下文管理器

    之前在学习file文件对象是说过,open文件操作结束后要关闭文件,否则会一直占用资源.但是当出现异常,如读取过程中文件不存在或异常,则直接出现错误,close方法无法执行,文件无法关闭 with o ...

  7. Angular material mat-icon 资源参考_Av

    ul,li>ol { margin-bottom: 0 } dt { font-weight: 700 } dd { margin: 0 1.5em 1.5em } img { height: ...

  8. SpringBoot中使用Jackson导致Long型数据精度丢失问题

    数据库中有一个bigint类型数据,对应java后台类型为Long型,在某个查询页面中碰到了问题:页面上显示的数据和数据库中的数据不一致.例如数据库中存储的是:1475797674679549851, ...

  9. PIXI FlappyBird详解(9)

    本文为了学习及使用pixi参考该文,使用pixi实现 这个实方式跟玉兔太空类似, 这里介绍下实现步骤 1.创建舞台及应用大小根据实际去定义 2.创建背景素材,可以采取纹理图集,在前边有提过或是看官网了 ...

  10. Dubbo---初识

    1.概述 1.1 Dubbo是一款高性能.轻量级的java RPC框架: 1.2 Dubbo提供的功能: 面向接口的远程调用: 智能容错.负载均衡: 服务注册.发现: 1.3 Dubbo架构 Prov ...