FJ省队集训DAY3 T1
思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分。
因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的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的更多相关文章
- FJ省队集训DAY5 T1
思路:考试的时候打了LCT,自以为能过,没想到只能过80.. 考完一想:lct的做法点数是100W,就算是nlogn也会T. 讲一下lct的做法把:首先如果一条边连接的两个点都在同一个联通块内,那么这 ...
- FJ省队集训DAY4 T1
直接上题解 #include<cstdio> #include<iostream> #include<cmath> #include<cstring> ...
- FJ省队集训DAY3 T2
思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...
- FJ省队集训DAY2 T1
思路:转换成n条三维空间的直线,求最大的集合使得两两有交点. 有两种情况:第一种是以某2条直线为平面,这时候只要统计这个平面上有几条斜率不同的直线就可以了 还有一种是全部交于同一点,这个也只要判断就可 ...
- FJ省队集训DAY1 T1
题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...
- 省队集训Day3 light
[问题描述] “若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她一定也答不上来.” ...
- 省队集训Day3 tree
[题目描述] RHL 有一天看到 lmc 在玩一个游戏. “愚蠢的人类哟,what are you doing”,RHL 说. “我在玩一个游戏.现在这里有一个有 n 个结点的有根树,其中有 m 个叶 ...
- bzoj4171 or 省队集训day3 chess: Rhl的游戏
[题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少 ...
- FJ省队集训DAY4 T3
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #inclu ...
随机推荐
- COJ 0560 4015划分数
4015 划分数 难度级别:B: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 有n个无区别的物品,将他们划分成不超过m组,求出划分方法数模 ...
- MFC之按键消息(长按处理)
想要实现长按键的一些控制,查了查可以通过捕获键盘事件,然后处理按键时需要进行的操作.下面简单的实现左右按键界面更新数值加减. 1. 重载PreTranslateMessage(MSG* pMsg)函 ...
- HDU_2023——求平均成绩
Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. ...
- linux patch
作为程序员,了解diff&patch命 令是非常必要的.比如说我们发现某个项目有bug代码,而自己又没有svn的提交权限,那么此时最合适的解决方法就是用diff命令做一个补丁发给项目成 员.项 ...
- Spring-mvc junit单元测试中 如何回滚?
@RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration(value = "src/main/webapp") @C ...
- <WinForm_1>初识WinForm编程
暑假花了一个多月自学了Win32 SDK编程,不敢说成为了高手,但是还是颇具收获——windows的消息机制(著名的消息循环).一切控件均是窗口…… 曾经有一位网友(和我一个专业的)向我吐槽:Win3 ...
- java--字节数组输入、输出流
在java网络编程中,字节数组很重要,它可以传输任何资料(文本,音频,视频,图片等),因此掌握字节数组和其它数据类型的相互转化尤为重要. 示例代码: package com.lky.util; imp ...
- 如何使用深度学习破解验证码 keras 连续验证码
在实现网络爬虫的过程中,验证码的出现总是会阻碍爬虫的工作.本期介绍一种利用深度神经网络来实现的端到端的验证码识别方法.通过本方法,可以在不切割图片.不做模板匹配的情况下实现精度超过90%的识别结果. ...
- Gulp-livereload:实时刷新编码
实现功能 监听指定目录下的所有文件,实时动态刷新页面 安装(Install) 功能的实现是借助 gulp-connect 插件完成的;所以,首先通过下面命令完成插件安装: npm install -- ...
- J2EE (十) 简洁的JSTL、EL
简介 JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. 由四个定制标记库(core.format.xml 和 sql)和一对通 ...