[HEOI 2016] sort
[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的更多相关文章
- HEOI 2016 游记
闲来无事,把这玩意儿补上. OI生涯中第一次正经的考试.挂的很惨. Day -1 不小心把机油(雾)sm惹毛了. 好像没啥别的事儿. Day 0 说好了上午直接去机房,然而临时说让我们上完前两节课再去 ...
- [TJOI 2016&HEOI 2016]排序
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- [HEOI 2016] seq
题解: 发现多决策且明显无后效性,果断dp,那么转移方程F[i]=F[j]+1 设R[I]为改变之后的最大值,L[i]为改变之后的最小值 由于只能改变一个元素 所以转移的条件是 (j<i &am ...
- 数据结构(并查集||树链剖分):HEOI 2016 tree
[注意事项] 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对于35% 的数据,1<=N,Q ...
- 字符串[未AC](后缀自动机):HEOI 2016 str
超级恶心,先后用set维护right,再用主席树维护,全部超时,本地测是AC的.放心,BZOJ上还是1S限制,貌似只有常数优化到一定境界的人才能AC吧. 总之我是精神胜利了哦耶QAQ #include ...
- [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)\) 表示第二类斯 ...
- 解题:HEOI 2016 求和
题面 我们需要知道这样一个东西(大概叫 斯特林公式?) $S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^k C_j^k(j-k)^i$ 那么就是推啊 $=\ ...
- [ HEOI 2016 ] 树
\(\\\) Description 给出一颗树,开始只有 \(1\) 号节点有标记. \(\ C\ x\) 对 \(x\) 号节点打标记 \(\ Q\ x\) 查询 \(x\) 号节点深度最深的有标 ...
- COGS 2274. [HEOI 2016] tree
★☆ 输入文件:heoi2016_tree.in 输出文件:heoi2016_tree.out 简单对比时间限制:1 s 内存限制:128 MB 这道题数据弱到炸了 . 第一次做用树刨 ...
随机推荐
- [BZOJ 1698] 荷叶池塘
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1698 [算法] 最短路 [代码] #include<bits/stdc++.h ...
- Map类型介绍与遍历
声明:本文非原创: 在程序员开发过程中,Map有着利用率占比是非常高:很多时间我们只知其用,不知其理:写这个随笔的目的也是希望对伙伴们对Map的理解有一点帮助. 类型介绍 java自带各种Map类.统 ...
- php phppowerpoint
今天早上从订阅的 Zend DevZone 看到篇很有意思的文章. Creating PowerPoint 2007 files using PHP. 试了一下. 果然很又意思, 分享给大家吧. 程序 ...
- Expected one result (or null) to be returned by selectOne(), but found: 2 和 java.lang.UnsupportedOperationException异常
在学习MyBatis的时候,简简单单的MyBatis+MySql的增删改查操作,但是却出了问题. 刚开始数据库只有一条数据的时候,岁月静好,一切看起来都那么的OJBK.但是,当我往数据库插入第二条数据 ...
- celery定时执行ansible api返回为空的问题
有两种方法解决这个问题,就是关闭assert:1.在celery 的worker启动窗口设置export PYTHONOPTIMIZE=1或打开celery这个参数-O OPTIMIZATION2.注 ...
- ACM_情人节
情人节 Time Limit: 2000/1000ms (Java/Others) Problem Description: 某发每天都在各大群水啊水,然后认识了很多崇拜他的妹子,毕竟是数学专业.这不 ...
- Windows系统文件名的最大长度
1.文件名的最大长度 Windows 通常限定文件名最多包含 260 个字符.但实际的文件名必须少于这一数值,因为完整路径(如 C:\Program Files\filename.txt)都包含在此字 ...
- 常用MySQL语句整合
常用MySQL语句整合 1. MySQL服务的配置和使用 修改MySQL管理员的口令:mysqladmin –u root password 密码字符串 如:mysqldmin –u root pas ...
- Java_Web三大框架之Hibernate 入门(一)
一.Hibernate简介: Hibernate作者——Gavin King Hibernate创始人 < Hibernate in action >作者 EJB 3.0的Entity b ...
- Python语言之函数
1.函数的定义与调用 def function(x): print("function(%s)"%x) function("hello") #call the ...