还是很强的一个题 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]区间的更多相关文章

  1. BZOJ5259/洛谷P4747: [Cerc2017]区间

    BZOJ5259/洛谷P4747: [Cerc2017]区间 2019.8.5 [HZOI]NOIP模拟测试13 C.优美序列 思维好题,然而当成NOIP模拟题↑真的好吗... 洛谷和BZOJ都有,就 ...

  2. [CERC2017]Intrinsic Interval——扫描线+转化思想+线段树

    [CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. ...

  3. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  4. SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等

    在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...

  5. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. [LeetCode] Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  8. [LeetCode] Non-overlapping Intervals 非重叠区间

    Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...

  9. [LeetCode] Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

随机推荐

  1. java反射原理运用

    1.首先用Java反射机制的要做到的一个目的:我们都知道通过得到一个对象中的指定方法或者属性等,基于这个原理我们来做一个 通用的功能,让客户端可以通过传入的对象和一个标识去调用这个对象里自己想要的方法 ...

  2. Canvas的效果操作及save()和restore()方法应用

    平移.缩放.旋转等操作等于是,我在一个正的画布绘制好图,然后再把画布做旋转.平移.缩放等等的效果. 也就是说,我使用的X.Y坐标还是正常的坐标(没旋转.平移.缩放等之前的坐标). save()和res ...

  3. Java Unsafe类

    参考了这篇文章:http://blog.csdn.net/aesop_wubo/article/details/7537278 <JAVA并发编程学习笔记之Unsafe类> Unsafe开 ...

  4. libevent和libev的区别对比

    参考了这篇文章: http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese ...

  5. HDU 4403 A very hard Aoshu problem (DFS暴力)

    题意:给你一个数字字符串.问在字符串中间加'='.'+'使得'='左右两边相等. 1212  : 1+2=1+2,   12=12. 12345666 : 12+3+45+6=66.  1+2+3+4 ...

  6. asp .net 为图片添加文字水印(内包含有加图片水印的方法) .

    在项目中先创建一个Imag_writer 类库 在该类库下分别创建两个枚举类型WaterMarkType (水印的类型).WaterMarkPosition (水印的位置).代码如下: using S ...

  7. 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

    两个月之前准备软考时,简单的从理论上总结了最经常使用的数据结构和算法,比方:线性表,链表,图.在进行java开发时,jdk为我们提供了一系列对应的类来实现主要的数据结构.jdk所提供的容器API位于j ...

  8. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  9. 剖析CPU温度监控技术

    转载 :剖析CPU温度监控技术   标签: CPU 温度控制技术 1805 具体温度检测调整代码(转载)        迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的“芯”,往 ...

  10. HDU 3308 LCIS (线段树&#183;单点更新&#183;区间合并)

    题意  给你一个数组  有更新值和查询两种操作  对于每次查询  输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并  线段树维护三个值  相应区间的LCIS长度(lcis)  相应区间以左 ...