思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分。

因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的id

我讲的貌似不是很清楚。。

还有,蜜汁80分,打死也改不出来。。

 #include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
struct node{
int l,r,cnt,id;
}a[];
struct segment{
int l,r,v;
segment(){}
segment(int l0,int r0,int v0):l(l0),r(r0),v(v0){}
}t[];
struct treap{
int l,r,rnd,v;
}tt[];
int tag[],vis[],Tcase;
int len[],next[],before[],pos[],heap[];
int o[],p[],sz,Id[],pls[];
int c[],Cnt,sb,rt1[],rt2[],all[];
int tot,n,Len;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
bool cmp(node a,node b){
return a.r-a.l<b.r-b.l;
}
void push_up(int x){
while (x>){
if (len[x/]>len[x]||(len[x/]==len[x]&&heap[x/]>heap[x])) std::swap(len[x/],len[x]),std::swap(heap[x/],heap[x]),std::swap(pos[heap[x]],pos[heap[x/]]);
else break;
x/=;
}
}
void push_down(int x){
int j;
while (x*<=tot){
if (x*==tot) j=*x;
else if (len[*x]<len[*x+]||(len[*x]==len[*x+]&&heap[*x]<heap[*x+])) j=*x;
else j=*x+;
if (len[x]>len[j]||(len[x]==len[j]&&heap[j]<heap[x])){
std::swap(len[x],len[j]);
std::swap(heap[x],heap[j]);
std::swap(pos[heap[x]],pos[heap[j]]);
}
x=j;
}
}
void add_heap(int x,int v){
heap[++tot]=x;
len[tot]=v;
pos[x]=tot;
push_up(tot);
}
void delete_heap(int x){
int Pos=pos[x];
heap[Pos]=heap[tot];
len[Pos]=len[tot];
pos[heap[tot]]=Pos;
tot--;
push_down(Pos);
}
void modify_heap(int x,int y){
int Pos=pos[x];
len[Pos]=y;
push_up(Pos);
}
void build(int k,int l,int r){
if (l==r){
t[k].v=o[l];
t[k].l=t[k].r=l;
return;
}
int mid=(l+r)>>;
build(k*,l,mid);
build(k*+,mid+,r);
t[k].v=t[k*].v+t[k*+].v;
t[k].l=std::min(t[k*].l,t[k*+].l);
t[k].r=std::max(t[k*].r,t[k*+].r);
}
void pushdown(int k,int l,int r){
if (!tag[k]||l==r) return;
tag[k]=;
t[k*].v=t[k*+].v=;
tag[k*]=tag[k*+]=;
t[k*].l=t[k*+].l=Len+;
t[k*].r=t[k*+].r=;
}
void modify(int k,int l,int r,int x,int y){
if (l>r) return;
if (l>y||r<x) return;
pushdown(k,l,r);
if (l==x&&r==y){
tag[k]=;
t[k].l=Len+;
t[k].r=;
t[k].v=;
pushdown(k,l,r);
return;
}
int mid=(l+r)>>;
if (y<=mid) modify(k*,l,mid,x,y);
else
if (x>mid) modify(k*+,mid+,r,x,y);
else modify(k*,l,mid,x,mid),modify(k*+,mid+,r,mid+,y);
t[k].v=t[k*].v+t[k*+].v;
t[k].l=std::min(t[k*].l,t[k*+].l);
t[k].r=std::max(t[k*].r,t[k*+].r);
}
segment query(int k,int l,int r,int x,int y){
if (x>y) return segment(x,y,);
pushdown(k,l,r);
if (l==x&&r==y){
return segment(t[k].l,t[k].r,t[k].v);
}
int mid=(l+r)>>;
if (y<=mid) return query(k*,l,mid,x,y);
else
if (x>mid) return query(k*+,mid+,r,x,y);
else{
segment t1=query(k*,l,mid,x,mid);
segment t2=query(k*+,mid+,r,mid+,y);
return segment(std::min(t1.l,t2.l),std::max(t1.r,t2.r),t1.v+t2.v);
}
}
int find(int x){
int l=,r=p[];
while (l<=r){
int mid=(l+r)>>;
if (p[mid]==x) return Id[mid];
if (p[mid]<x) l=mid+;
else r=mid-;
}
}
void sbpianfen1(){
int T=n;
for (int i=;i<=n;i++)
a[i].l=read(),a[i].r=read(),a[i].id=i,a[i].cnt=a[i].r-a[i].l+,add_heap(i,a[i].r-a[i].l+),p[++p[]]=a[i].l,p[++p[]]=a[i].r;
std::sort(p+,p++p[]);int j=;
for (int i=;i<=p[];i++)
if (p[i]!=p[j]) p[++j]=p[i];p[]=j; for (int i=;i<=p[];i++)
if (p[i]!=p[i-]){
o[++sz]=p[i]-p[i-]-;
o[++sz]=;
Id[i]=sz;
}
Len=sz;
for (int i=;i<=n;i++)
a[i].l=find(a[i].l),a[i].r=find(a[i].r);
build(,,Len);
a[n+].cnt=0x7fffffff;
while (T--){
int mn=n+;
for (int i=n;i>=;i--)
if (a[i].cnt<=a[mn].cnt&&!vis[i]) mn=i;
printf("%d\n",mn);vis[mn]=;
modify(,,Len,a[mn].l,a[mn].r);
for (int i=;i<=n;i++){
segment t1=query(,,Len,a[i].l,a[i].r);
a[i].cnt=t1.v;
}
}
}
void lturn(int &k){
if (!k) return;
int TT=tt[k].r;tt[k].r=tt[TT].l;tt[TT].l=k;k=TT;
}
void rturn(int &k){
if (!k) return;
int TT=tt[k].l;tt[k].l=tt[TT].r;tt[TT].r=k;k=TT;
}
void insert(int &k,int v){
if (!k){
if (Cnt) k=c[Cnt--];else k=++sb;
tt[k].l=tt[k].r=;tt[k].rnd=rand();
tt[k].v=v;
all[v]++;
return;
}
if (tt[k].v==v) {all[v]++;return;}
if (tt[k].v<v){
insert(tt[k].r,v);
if (tt[tt[k].r].rnd<tt[k].rnd) lturn(k);
}else{
insert(tt[k].l,v);
if (tt[tt[k].l].rnd<tt[k].rnd) rturn(k);
}
}
void del(int &k,int v){
if (!k) return;
if (tt[k].v==v){
if (tt[k].l*tt[k].r==){
c[++Cnt]=k;
k=tt[k].l+tt[k].r;
all[v]--;
return;
}
if (tt[tt[k].l].rnd<tt[tt[k].r].rnd){
rturn(k);
del(k,v);
}else{
lturn(k);
del(k,v);
}
return;
}
if (tt[k].v<v) del(tt[k].r,v);
else del(tt[k].l,v);
}
int find_treap(int k){
while (tt[k].l!=) k=tt[k].l;
return tt[k].v;
}
bool findit(int k,int x){
if (!k) return ;
if (tt[k].v==x) return ;
else if (tt[k].v<x) return findit(tt[k].r,x);
else return findit(tt[k].l,x);
}
void Gwork(){
Tcase=Tcase;
}
void updata(int x,int id){
if (id==) x=pls[find_treap(rt1[a[x].l])];
else if (id==) x=pls[find_treap(rt2[a[x].r])];
if (a[x].l>a[x].r) return;
segment t1=query(,,Len,a[x].l,a[x].r);
a[x].cnt=t1.v;
if (a[x].id==&&(a[x].l==||a[x].r==)) Gwork();
del(rt1[a[x].l],a[x].id);
del(rt2[a[x].r],a[x].id);
a[x].l=t1.l;
a[x].r=t1.r;
insert(rt1[a[x].l],a[x].id);
insert(rt2[a[x].r],a[x].id);
modify_heap(a[x].id,a[x].cnt);
}
void sbpianfen3(){
for (int i=;i<=n;i++)
a[i].l=read(),a[i].r=read(),a[i].cnt=a[i].r-a[i].l+,a[i].id=i,add_heap(i,a[i].r-a[i].l+),p[++p[]]=a[i].l,p[++p[]]=a[i].r;
std::sort(p+,p++p[]);int j=;
for (int i=;i<=p[];i++)
if (p[i]!=p[j]) p[++j]=p[i];p[]=j;
for (int i=;i<=p[];i++)
if (p[i]!=p[i-]){
o[++sz]=p[i]-p[i-]-;
o[++sz]=;
Id[i]=sz;
}
Len=sz;
for (int i=;i<=n;i++)
a[i].l=find(a[i].l),a[i].r=find(a[i].r),insert(rt1[a[i].l],i),insert(rt2[a[i].r],i);
for (int i=;i<=n;i++)
pls[a[i].id]=i;
for (int i=;i<=n;i++) before[i]=i-;
for (int i=;i<n;i++) next[i]=i+;
int T=n;
build(,,Len);
while (T--){
Tcase++;
int x=heap[];printf("%d\n",x);
delete_heap(x);
if (a[x].l>a[x].r){
int t1=before[pls[x]],t2=next[pls[x]];
next[t1]=t2;
before[t2]=t1;
continue;
}
if (Tcase==) Gwork();
modify(,,Len,a[pls[x]].l,a[pls[x]].r);
if (before[pls[x]]) updata(before[pls[x]],);
if (next[pls[x]]) updata(next[pls[x]],);
int t1=before[pls[x]],t2=next[pls[x]];
next[t1]=t2;
before[t2]=t1;
}
}
int main(){
Len=read();n=read();
if (n<=) {sbpianfen1();fclose(stdin);fclose(stdout);return ;}
sbpianfen3();
fclose(stdin);fclose(stdout);
return ;
}

FJ省队集训DAY3 T1的更多相关文章

  1. FJ省队集训DAY5 T1

    思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...

  2. FJ省队集训DAY4 T1

    直接上题解 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...

  3. FJ省队集训DAY3 T2

    思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...

  4. FJ省队集训DAY2 T1

    思路:转换成n条三维空间的直线,求最大的集合使得两两有交点. 有两种情况:第一种是以某2条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了 还有一种是全部交于同一点,这个也只要判断就可 ...

  5. FJ省队集训DAY1 T1

    题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...

  6. 省队集训Day3 light

    [问题描述] “若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她一定也答不上来.” ...

  7. 省队集训Day3 tree

    [题目描述] RHL 有一天看到 lmc 在玩一个游戏. “愚蠢的人类哟,what are you doing”,RHL 说. “我在玩一个游戏.现在这里有一个有 n 个结点的有根树,其中有 m 个叶 ...

  8. bzoj4171 or 省队集训day3 chess: Rhl的游戏

    [题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少 ...

  9. FJ省队集训DAY4 T3

    #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #inclu ...

随机推荐

  1. 警惕P2B模式

    大家都知道P2P是什么,估计也有很多人了解P2B的意思,这里也不多做解释,但是为什么要警惕P2B,这里我要做详细说明,希望能给大家一个参考.      首先我们要把P2B分成两种,一种是针对大型企业, ...

  2. V$、GV$、X$、V_$、GV_$之间的关系

    V$.GV$.X$.V_$.GV_$之间的关系 GV$:全局视图,针对多个实例环境. V$:针对某个实例的视图. X$:是GV$视图的数据来源,oracle内部表. GV_$:是GV$的同义词. V_ ...

  3. socket编程2

    package tcp; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOExceptio ...

  4. 《Linux Device Drivers》第十二章 PCI司机——note

    一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...

  5. javaCV:爱之初体验

    最近实验室有了新任务,要求使用java进行模式识别,在具体点就是人脸识别.精确的边缘检测. 第一个问题便是环境配置,搭建工作台.(其实也不是什么难事,但是本人虽然从事较多的java开发,但很少接触模式 ...

  6. VCS仿真查看coverage

    VCS仿真查看coverage Design compiler & simulate #!/bin/csh -f setenv NOVAS_HOME /EDASynopsys/verdi3-I ...

  7. Ubunte 11.4 下安装 SSH遇到的问题

    第一次安装报了一堆错,主要是也http 404 not found之类的,搜索了一番怀疑是apt的source list的问题. 网上找到一份替换之,我用的是搜狐的服务器.网址如下: http://b ...

  8. gulp前端自动化构建工具新手入门篇

    很久没有更新博文了. 经过了一次年前吐血的赶项目,终于在年后回血了.趁着有空,新学到了一个前端自动化构建工具-gulp. 现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gul ...

  9. Quartz实现定时任务的配置方法

    1.   CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...

  10. Android -------- 序列化器生成xml文件