D
e
s
c
r
i
p
t
i
o
n
\mathscr{Description}
Description
S
o
l
u
t
i
o
n
\mathscr{Solution}
Solution
- 每行是否承接上行仅与此行状态有关,考虑DP
-
d
p
i
dp_{i}
dpi表示
1
−
i
行
最
多
合
法
行
数
1-i行最多合法行数
1−i行最多合法行数
- 用线段树区间修改,区间最大值
- 线段树中存储1.dp[i] 2.i值,方便最后输出
#include <bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
#define P pair<int,int>
#define F first
#define S second
#define mp make_pair
#define ll long long
using namespace std;
const int N=8e5+10;
struct Seg
{
int l,r;
P mx,tag;
void tmx(P x){mx=x>mx?x:mx;tag=x>tag?x:tag;}
}T[N<<2];
void up(int x){T[x].mx=max(T[ls].mx,T[rs].mx);}
void down(int x)
{
if(T[x].tag!=mp(0,0))
{
T[ls].tmx(T[x].tag),T[rs].tmx(T[x].tag);
T[x].tag=mp(0,0);
}
}
void build(int x,int l,int r)
{
T[x].l=l,T[x].r=r,T[x].mx=T[x].tag=mp(0,0);
if(l==r) return ;
int m=l+r>>1;
build(ls,l,m),build(rs,m+1,r);
}
void modify(int x,int l,int r,P val)
{
if(l<=T[x].l&&T[x].r<=r)
{
T[x].tmx(val);
return ;
}
down(x);
int m=T[x].l+T[x].r>>1;
if(r<=m) modify(ls,l,r,val);
else if(l>m) modify(rs,l,r,val);
else modify(ls,l,m,val),modify(rs,m+1,r,val);
up(x);
}
P query(int x,int l,int r)
{
if(l<=T[x].l&&T[x].r<=r) return T[x].mx;
down(x);
int m=T[x].l+T[x].r>>1;
if(r<=m) return query(ls,l,r);
else if(l>m) return query(rs,l,r);
return max(query(ls,l,m),query(rs,m+1,r));
}
int n,M,a[N],cnt,del[N];
vector<P> v[N];
P dp[N];
int main()
{
scanf("%d%d",&n,&M);
for(int i=1,x,y,z;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&z);
v[x].emplace_back(mp(y,z));
a[++cnt]=y,a[++cnt]=z;
}
sort(a+1,a+cnt+1);
cnt=unique(a+1,a+cnt+1)-a-1;
for(int i=1;i<=n;i++)
for(int j=0;j<v[i].size();j++)
{
v[i][j].F=lower_bound(a+1,a+cnt+1,v[i][j].F)-a;
v[i][j].S=lower_bound(a+1,a+cnt+1,v[i][j].S)-a;
}
build(1,1,cnt);
P ans=mp(0,0);
for(int i=1;i<=n;i++)
{
P t=mp(0,0);
for(int j=0;j<v[i].size();j++)
t=max(t,query(1,v[i][j].F,v[i][j].S));
dp[i]=t,dp[i].F++;
ans=max(ans,mp(dp[i].F,i));
for(int j=0;j<v[i].size();j++)
{
modify(1,v[i][j].F,v[i][j].S,mp(dp[i].F,i));
}
}
printf("%d\n",n-ans.F);
if(n==ans.F) return 0;
for(int i=ans.S;i;i=dp[i].S) del[i]=1;
for(int i=1;i<=n;i++) if(!del[i]) printf("%d ",i);
}