[HEOI 2016] sort

解题报告

码线段树快调废我了= =

其实这题貌似暴力分很足,直接$STL$的$SORT$就能$80$

正解:

我们可以二分答案来做这道题

假设我们二分的答案为$a$,我们就可以将整个序列分为两个集合,一个是大于等于$a$的,一个是小于$a$的

那么我们就可以将大于等于$a$的赋值为$1$,小于$a$的赋值为$0$,那么对于排序,我们就变成了线段树区间覆盖,升序就将区间中所有的$0$覆盖到前面,$1$覆盖到后面,反之亦然。

最后我们查询询问位置的数,是$1$说明二分的答案小了,需要左边界右移,反之则右边界左移。

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
int n,m,q;
int op[],l[],r[];
int a[];
int sum[],add[];
inline void pushup(int i){
sum[i]=sum[i<<]+sum[i<<|];
}
inline void pushdown(int i,int len){
if(add[i]!=-){
add[i<<]=add[i];
add[i<<|]=add[i];
sum[i<<]=add[i]*(len-(len>>));
sum[i<<|]=add[i]*(len>>);
add[i]=-;
}
}
inline void build(int l,int r,int i,int x){
add[i]=-;
if(l==r){
if(a[l]>=x)
sum[i]=;
else
sum[i]=;
return;
}
int mid((l+r)>>);
build(l,mid,i<<,x);
build(mid+,r,i<<|,x);
pushup(i);
}
inline void update(int ll,int rr,int l,int r,int w,int i){//cout<<"update"<<ll<<' '<<rr<<' '<<l<<' '<<r<<' '<<w<<' '<<i<<endl;
if(ll>rr)
return;
if(ll<=l&&r<=rr){
sum[i]=w*(r-l+);
add[i]=w;
return;
}
pushdown(i,r-l+);
int mid((l+r)>>);
if(ll<=mid)
update(ll,rr,l,mid,w,i<<);
if(mid<rr)
update(ll,rr,mid+,r,w,i<<|);
pushup(i);
}
inline int query(int ll,int rr,int l,int r,int i){
if(ll<=l&&r<=rr)
return sum[i];
pushdown(i,r-l+);
int mid((l+r)>>),ret();
if(ll<=mid)
ret+=query(ll,rr,l,mid,i<<);
if(mid<rr)
ret+=query(ll,rr,mid+,r,i<<|);
return ret;
}
inline bool check(int x){
build(,n,,x);
for(int i=;i<=m;++i){//cout<<l[i]<<' '<<r[i]<<endl;
int tmp(query(l[i],r[i],,n,));//cout<<i<<' '<<op[i]<<' '<<l[i]<<' '<<r[i]<<endl;
if(op[i]==){//cout<<r[i]-tmp+1<<' '<<r[i]<<"devide"<<l[i]<<' '<<r[i]-tmp<<endl;
update(l[i],r[i]-tmp,,n,,);
if(tmp!=)
update(r[i]-tmp+,r[i],,n,,);
}
else{//cout<<l[i]<<' '<<l[i]+tmp-1<<"devide"<<l[i]+tmp<<' '<<r[i]<<endl;
update(l[i],l[i]+tmp-,,n,,);
if(tmp!=r[i]-l[i]+)
update(l[i]+tmp,r[i],,n,,);
}
}
return query(q,q,,n,);
}
inline void ef(int l,int r){
while(l+<r){
int mid((l+r)>>);
if(check(mid))
l=mid;
else
r=mid;
}
printf("%d",l);
}
inline int gg(){
freopen("heoi2016_sort.in","r",stdin);
freopen("heoi2016_sort.out","w",stdout);
n=read(),m=read();
for(int i=;i<=n;++i)
a[i]=read();
for(int i=;i<=m;++i)
op[i]=read(),l[i]=read(),r[i]=read();
q=read();
ef(,n);
// printf("%d",ans);
return ;
}
int K(gg());
int main(){;}

[HEOI 2016] sort的更多相关文章

  1. HEOI 2016 游记

    闲来无事,把这玩意儿补上. OI生涯中第一次正经的考试.挂的很惨. Day -1 不小心把机油(雾)sm惹毛了. 好像没啥别的事儿. Day 0 说好了上午直接去机房,然而临时说让我们上完前两节课再去 ...

  2. [TJOI 2016&HEOI 2016]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  3. [HEOI 2016] seq

    题解: 发现多决策且明显无后效性,果断dp,那么转移方程F[i]=F[j]+1 设R[I]为改变之后的最大值,L[i]为改变之后的最小值 由于只能改变一个元素 所以转移的条件是 (j<i &am ...

  4. 数据结构(并查集||树链剖分):HEOI 2016 tree

    [注意事项] 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对于35% 的数据,1<=N,Q ...

  5. 字符串[未AC](后缀自动机):HEOI 2016 str

    超级恶心,先后用set维护right,再用主席树维护,全部超时,本地测是AC的.放心,BZOJ上还是1S限制,貌似只有常数优化到一定境界的人才能AC吧. 总之我是精神胜利了哦耶QAQ #include ...

  6. [TJOI 2016&HEOI 2016]求和

    Description 题库链接 求 \[f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\times 2^j \times (j!)\] \(S(i, j)\) 表示第二类斯 ...

  7. 解题:HEOI 2016 求和

    题面 我们需要知道这样一个东西(大概叫 斯特林公式?) $S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^k C_j^k(j-k)^i$ 那么就是推啊 $=\ ...

  8. [ HEOI 2016 ] 树

    \(\\\) Description 给出一颗树,开始只有 \(1\) 号节点有标记. \(\ C\ x\) 对 \(x\) 号节点打标记 \(\ Q\ x\) 查询 \(x\) 号节点深度最深的有标 ...

  9. COGS 2274. [HEOI 2016] tree

    ★☆   输入文件:heoi2016_tree.in   输出文件:heoi2016_tree.out   简单对比时间限制:1 s   内存限制:128 MB 这道题数据弱到炸了 . 第一次做用树刨 ...

随机推荐

  1. bzoj 1036 树的统计Count

    题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...

  2. 特征选择--->卡方选择器

    特征选择(Feature Selection)指的是在特征向量中选择出那些“优秀”的特征,组成新的.更“精简”的特征向量的过程.它在高维数据分析中十分常用,可以剔除掉“冗余”和“无关”的特征,提升学习 ...

  3. BZOJ 4173 数论

    思路: $(m%k+n%k>=k) *phi(k)$ $我们不妨设n=q_1k+r_1 m=q_2k+r$2 $n+m=(q_1+q_2)k+r1+r2$ ${\lfloor}\frac{n+m ...

  4. 实现一个类似于收趣APP的功能

    近日想做一个类似于收趣APP软件的一个功能,将头条.微信等其他App的文章能够通过分享微信好友的方式分享到自己的平台软件中. 分享的方式有三种: 1.通过微信好友的方式,将文章分享给收趣. 2.复制文 ...

  5. C#中 分层 显示数据库中多表的数据信息

    如下图,要实现将三个表中的内容加载到同一个窗体中,该怎么来实现呢? 要实现上面的查询结果,我们就要从Student表中拿到学生姓名,从Subject表中拿到科目名称,从StudentResult表中拿 ...

  6. Laravel5.1学习笔记12 系统架构4 服务容器

    Service Container 介绍 绑定的用法  绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...

  7. [ NOIP 2014 ] TG

    \(\\\) \(Day\ 1\) \(\\\) \(\#\ A\) \(Rps\) 定义五种方案的石头剪刀布游戏,两人共进行\(N\)局游戏,已知两人各自的循环节和具体方案,胜者得\(1\)分,败者 ...

  8. c#——值类型与引用类型

    值类型传的是值 引用类型传的是地址

  9. [Windows Server 2008] 安装网站伪静态

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装IIS伪静 ...

  10. Centos 安装 Moosefs文件系统

    一.环境介绍Moosefs master:192.168.55.148Moosefs Metalogger:192.168.55.149Moosefs Chunk-01:192.168.55.150M ...