我是萌萌的传送门

我是另一个萌萌的传送门

脑残错误毁一下午……

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

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

一点细节:

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

贴个bzoj的代码:

  1 /**************************************************************
  2     Problem: 2653
  3     User: hzoier
  4     Language: C++
  5     Result: Accepted
  6     Time:936 ms
  7     Memory:101108 kb
  8 ****************************************************************/
  9
 10 #include<cstdio>
 11 #include<cstring>
 12 #include<algorithm>
 13 using namespace std;
 14 const int maxn=20010;
 15 struct node{
 16     int sum,prefix,suffix;
 17     node *lc,*rc;
 18     void refresh(){
 19         sum=lc->sum+rc->sum;
 20         prefix=max(lc->prefix,lc->sum+rc->prefix);
 21         suffix=max(rc->suffix,rc->sum+lc->suffix);
 22     }
 23 }null[maxn<<8],*ptr=null;
 24 struct A{
 25     int d,id;
 26     bool operator<(const A &a)const{return d<a.d;}
 27 }a[maxn];
 28 void build(int,int,node*&);
 29 void modify(int,int,node*&,node*&);
 30 void qsum(int,int,node*);
 31 void qprefix(int,int,node*);
 32 void qsuffix(int,int,node*);
 33 node *root[maxn];
 34 int n,m,x,d,s,t,q[5],tmp,sum,ans,lastans=0,L,R,M;
 35 int main(){
 36     null->lc=null->rc=null;
 37     null->sum=null->prefix=null->suffix=0;
 38     scanf("%d",&n);
 39     fill(root,root+n+1,(node*)null);
 40     build(1,n,root[0]);
 41     for(int i=1;i<=n;i++){
 42         scanf("%d",&a[i].d);
 43         a[i].id=i;
 44     }
 45     sort(a+1,a+n+1);
 46     for(int i=1;i<=n;i++){
 47         x=a[i].id;
 48         modify(1,n,root[i],root[i-1]);
 49     }
 50     scanf("%d",&m);
 51     while(m--){
 52         for(int i=0;i<4;i++){
 53             scanf("%d",&q[i]);
 54             q[i]+=lastans;q[i]%=n;q[i]++;
 55         }
 56         sort(q,q+4);
 57         L=1;R=n;
 58         while(L<=R){
 59             M=(L+R)>>1;
 60             ans=0;
 61             s=q[1];t=q[2];
 62             qsum(1,n,root[M-1]);
 63             s=q[0];t=q[1]-1;
 64             sum=tmp=0;
 65             if(s<=t)qsuffix(1,n,root[M-1]);
 66             ans+=sum;
 67             s=q[2]+1;t=q[3];
 68             sum=tmp=0;
 69             if(s<=t)qprefix(1,n,root[M-1]);
 70             ans+=sum;
 71             if(ans>=0)L=M+1;
 72             else R=M-1;
 73         }
 74         printf("%d\n",lastans=a[R].d);
 75     }
 76     return 0;
 77 }
 78 void build(int l,int r,node *&rt){
 79     rt=++ptr;
 80     rt->sum=rt->prefix=rt->suffix=r-l+1;
 81     if(l==r){
 82         rt->lc=rt->rc=null;
 83         return;
 84     }
 85     int mid=(l+r)>>1;
 86     build(l,mid,rt->lc);
 87     build(mid+1,r,rt->rc);
 88 }
 89 void modify(int l,int r,node *&rt,node *&pr){
 90     *(rt=++ptr)=*pr;
 91     if(l==r){
 92         rt->sum=-1;
 93         rt->prefix=rt->suffix=0;
 94         return;
 95     }
 96     int mid=(l+r)>>1;
 97     if(x<=mid)modify(l,mid,rt->lc,pr->lc);
 98     else modify(mid+1,r,rt->rc,pr->rc);
 99     rt->refresh();
100 }
101 void qsum(int l,int r,node *rt){
102     if(s<=l&&t>=r){
103         ans+=rt->sum;
104         return;
105     }
106     int mid=(l+r)>>1;
107     if(s<=mid)qsum(l,mid,rt->lc);
108     if(t>mid)qsum(mid+1,r,rt->rc);
109 }
110 void qprefix(int l,int r,node *rt){
111     if(s<=l&&t>=r){
112         sum=max(sum,tmp+rt->prefix);
113         tmp+=rt->sum;
114         return;
115     }
116     int mid=(l+r)>>1;
117     if(s<=mid)qprefix(l,mid,rt->lc);
118     if(t>mid)qprefix(mid+1,r,rt->rc);
119 }
120 void qsuffix(int l,int r,node *rt){
121     if(s<=l&&t>=r){
122         sum=max(sum,tmp+rt->suffix);
123         tmp+=rt->sum;
124         return;
125     }
126     int mid=(l+r)>>1;
127     if(t>mid)qsuffix(mid+1,r,rt->rc);
128     if(s<=mid)qsuffix(l,mid,rt->lc);
129 }

View Code

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

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

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

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

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

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

转载于:https://www.cnblogs.com/hzoier/p/6266078.html

[国家集训队2012]middle(陈立杰)相关推荐

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

    1764. [国家集训队2012]tree(陈立杰) ★★★   输入文件: nt2012_tree.in   输出文件: nt2012_tree.out    简单对比 时间限制:3 s   内存限 ...

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

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

  3. [国家集训队2012]电子对撞机nbsp;解题…

    国家集训队2012 电子对撞机(刘洪轩)解题报告 题目: 见http://cogs.pro/cogs/problem/problem.php?pid=1784 Q国最近科学技术不断进步,经过不懈努力, ...

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

    时间限制:3.0s   内存限制:1.0GB [大意] 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. [输入格式] 第一行V,E,ne ...

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

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

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

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

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

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

  8. 【国家集训队】middle

    题意:给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c,d]之间的子序列中,最大的中位数. 强制在线. 思路:首先考虑二分答案,判断可行的方法则是看是否小于他的 ...

  9. bzoj 2653: middle(陈立杰)

    首先膜拜clj... 这道题初看没头绪,看了诸多题解后,发现时先二分,在把大于等于它的为1,小于它的为-1,一段区间最大连续和非负就行 然后想了N久都没想通,终于,在昨天在外拜年时想通了,就是以每个数 ...

最新文章

  1. IDEA提升研发效能—高效定位篇
  2. 阿里云助力重庆打造“亚洲最智能大型城市”
  3. 《编译原理》第一章知识点
  4. mysql客户端报错1366_mysql一些异常
  5. python learning1.py
  6. Enterprise Library:DAAB + OLEDB/ODBC操作Access数据库
  7. js 动态生成button 并设置click事件
  8. 石川:股票多因子模型的回归检验
  9. WMS仓储管理系统解决方案
  10. 计算机按键不灵怎么回事,电脑键盘失灵,教您电脑键盘失灵怎么办
  11. 关于如何连接网络打印机
  12. android 分享给好友,手机将安卓软件分享给好友的方法
  13. 【OFDM】OFDM正交频分复用---入门总结
  14. Linux--增加用户、添加用户组
  15. useImperativeHandle使用实例
  16. C语言位操作--判断整数的符号
  17. 让我们唠一唠:微信有哪些功能越来越不行了呢?
  18. 2022年全球市场脱脂小麦胚芽粉总体规模、主要生产商、主要地区、产品和应用细分研究报告
  19. 45.jump游戏第二弹
  20. Windows10+Ubuntu双系统安装[多图]

热门文章

  1. mysql数据库的常见命令行操作
  2. 一文带你读懂SDK测试
  3. 看见一个过目不忘的女生,怎么才能要到联系方式?千万别错过
  4. “快递出海”再升级 百世携手菜鸟开通中国-东南亚跨境直送服务
  5. 两个scanf只运行了一个
  6. 自己抽最便宜的香烟,别人会怎么看
  7. FTPClient笔记
  8. 怎么看陌陌新推出的陌陌现场呢?
  9. JavaScript 操作 XML 实例 (获取新闻标题并分页,并分页)
  10. 蚂蚁金服社招笔试——根据需求实现一个转账接口