我是萌萌的传送门

我是另一个萌萌的传送门

脑残错误毁一下午……

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

还是讲讲大体思路吧,首先二分答案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. 故障排查-linux命令测试端口连通性

    方法一:telnet法 预置条件:安装telnet step 1.rpm -qa telnet-server(无输出表示telnet-server未安装,则执行step2:否则执行step3) ste ...

  2. 【Leetcode】Reorder List

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...

  3. 适配器模式-如何把usb插到插座上

    前言 下面所写的内容不是实际的业务场景, 也可能不符合正常的生活习惯, 或者不满足一些人的口味 所写的内容包括之前的帖子,只是为了方便大家更好的记住这个设计模式,实际生活中要灵活应用 设计模式重思想, ...

  4. head first

      1, insert 单引号时,使用/转义 2, 不要用NULL, 查找时使用isNull 来判断. 3, 用and / or 连接两个not 时,要写两个NOT 4,delete from tab ...

  5. 主库binlog被purge的情形

    1.演示实验环境 --主库版本: root@(none)>show variables like 'version'; +---------------+-------------------- ...

  6. mysql for mac 上的安装及用DataGrip连接

    ---恢复内容开始--- 1.首先下载MySQL的mac版本,地址百度就行了. 2.这个时候需要注意安装的时候,弹出来的一个类似窗口,上面有提示默认密码,但是我当时就忘记了这个默认密码,如果你记住了默 ...

  7. Android开发多媒体应用之SoundPool的使用的代码

    内容过程中,把写内容过程中比较好的内容段记录起来,下面的内容是关于Android开发多媒体应用之SoundPool的使用的内容,希望对各位也有用途. public class MainActivity ...

  8. CTF<密码学> writeup 传统知识+古典密码

    小明某一天收到一封密信,信中写了几个不同的年份          辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳. 信的背面还写有“+甲子”,请解出这段密文. key值:CTF{XXX} 百度可以查到 ...

  9. jmeter安装部署、maven路径配置

    jmeter下载地址: https://jmeter.apache.org/download_jmeter.cgi 解压文件 配置jmeter环境变量 (1)设置jmeter解压目录的JMETER_H ...

  10. docker volumes?

    我发现我无法mount东西出来.都是会被host的覆盖掉的.,