bzoj5259: [Cerc2017]区间
还是很强的一个题 ORZ肉丝哥哥
对于两个相交区间,假如他们两个都是可行的,那么他们的交也可行,不然没可能两边都把它缺的补上
那么对于答案区间,向右找到第一个可行区间右端点覆盖询问区间,就是最优的
考虑扫描线,枚举右端点,对于当前还没有找到答案的询问,取左端点最大的去找答案
问题在于怎么快速判断一个区间是否可行
用max-min==R-L没有前途像我一样,要考虑其他性质
令i,i+1属于区间则对区间贡献1,假如[l,r]可行,那么它的权值就是r-l
那么开一棵线段树,表示每个位置到R的最大对数和+l,假如等于r说明是合法方案,求一下区间最大值和它的位置即可
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue> #define lc (now<<1)
#define rc (now<<1|1)
#define mid (ql+qr)/2
#define mx first
#define pos second
using namespace std;
typedef pair<int,int> pp;
const int _=1e2;
const int maxn=1e5+_;
const int fbin=(<<)+_; struct trnode{pp p;int la;}tr[*fbin];
void update(int now){tr[now].p=max(tr[lc].p,tr[rc].p);}
void pushdown(int now)
{
if(tr[now].la!=)
{
tr[lc].p.mx+=tr[now].la;tr[lc].la+=tr[now].la;
tr[rc].p.mx+=tr[now].la;tr[rc].la+=tr[now].la;
tr[now].la=;
}
}
void bt(int now,int ql,int qr)
{
tr[now].p.mx=qr;tr[now].p.pos=qr;
if(ql!=qr)
{
bt(lc,ql,mid);
bt(rc,mid+,qr);
}
}
void add(int now,int ql,int qr,int l,int r,int w)
{
if(ql==l&&qr==r){tr[now].p.mx++,tr[now].la++;return ;}
pushdown(now);
if(r<=mid) add(lc,ql,mid,l,r,w);
else if(mid+<=l)add(rc,mid+,qr,l,r,w);
else add(lc,ql,mid,l,mid,w),add(rc,mid+,qr,mid+,r,w);
update(now);
}
pp findmax(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r)return tr[now].p;
pushdown(now);
if(r<=mid) return findmax(lc,ql,mid,l,r);
else if(mid+<=l)return findmax(rc,mid+,qr,l,r);
else return max(findmax(lc,ql,mid,l,mid),findmax(rc,mid+,qr,mid+,r));
} int n,a[maxn],b[maxn];
struct query{int l,r,id;}q[maxn];int Q; pp as[maxn];
bool cmp(query q1,query q2){return q1.r<q2.r;}
struct cmq{bool operator()(query q1,query q2){return q1.l<q2.l;}};
priority_queue<query,vector<query>,cmq>p;
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),b[a[i]]=i; scanf("%d",&Q);
for(int i=;i<=Q;i++)
scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+,q+Q+,cmp); int tp=; bt(,,n);
int x;query tq;pp tt;
for(int i=;i<=n;i++)
{
if(a[i]!=)
{
x=b[a[i]-];
if(x<i)add(,,n,,x,i);
}
if(a[i]!=n)
{
x=b[a[i]+];
if(x<i)add(,,n,,x,i);
} while(tp<=n&&q[tp].r==i)p.push(q[tp]),tp++;
while(!p.empty())
{
tq=p.top();
tt=findmax(,,n,,tq.l);
if(tt.first==i)
{
as[tq.id]=make_pair(tt.pos,i);
p.pop();
}
else break;
}
} for(int i=;i<=Q;i++)printf("%d %d\n",as[i].mx,as[i].pos); return ;
}
bzoj5259: [Cerc2017]区间的更多相关文章
- BZOJ5259/洛谷P4747: [Cerc2017]区间
BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就 ...
- [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树
[CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等
在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- [LeetCode] Find Right Interval 找右区间
Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...
- [LeetCode] Non-overlapping Intervals 非重叠区间
Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...
- [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...
随机推荐
- IDEA连接linux服务器
idea连接linux(完成了xshell和xftp连接linux的功能,可以直接卸载这俩了..) File->settings->Deployment左侧加号添加 选择传输类型ftp或者 ...
- 作为使用者对qq拼音输入法和搜狗输入法的评价
我还记得在打字方面从一开始XP里面自带的中文输入法到QQ拼音输入法的过度,当时第一次使用qq拼音最大的感受就是这个输入法很智能,给人一种恍然一新的感觉,对于XP系统中自带的拼音输入法,QQ拼音最大的特 ...
- 补充==的使用和equals的区别
字节码的比较 Class 相等与否使用“==” 进行比较,形如 if (adapter == IContentOutlinePage.class) 进行比较,因为字节码在JVM中只有一份,地 ...
- vs code theme Seti monokai
http://www.jianshu.com/p/80e983201f86 Seti-UI主题是一款极具传奇色彩的主题
- 【spring data jpa】使用spring data jpa 的删除操作,需要加注解@Modifying @Transactional 否则报错如下: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
使用spring data jpa 的删除操作,需要加注解@Modifying @Transactional 否则报错如下: No EntityManager with actual tran ...
- Android 自定义录音、播放动画View,让你的录音浪起来
最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸. 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的 ...
- 2.【nuxt起步】-初始化创建nuxt项目
1. 脚手架初始化: vue init nuxt-community/starter-template NuxtMyms 2.输入项目相关信息 3.切换到项目目录下 安装依赖 Cd nuxtmyms ...
- 判断用户Input输入的事件来进行登陆
我们是通过键盘按的object.keyCode获取的 Html <input onkeydown="keydownMsg(event)" type="text&qu ...
- Quality control
定义测试 为测试添加测试项 测试项目按类型分2种 Qualitative 定性,描述类的,比如颜色,是,否 Quantitative 定量,有明确的衡量 定性 ...
- SASS入门之SASS安装
当然...凭借我这样的肤浅的智商,根本不能理解什么叫certificate verfiy fail... 所以找了一段时间的方法,最后最终在一个sass群里找到了... 发在这里纯属作为自己的一个学习 ...