区间染色_浮水法_洛谷_P3740贴海报
题目链接:洛谷_P3740贴海报
题目描述
Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙。
张贴规则如下:
-
electoral墙是一个长度为N个单位的长方形,每个单位记为一个格子;
-
所有张贴的海报的高度必须与electoral墙的高度一致的;
-
每张海报以“A B”表示,即从第A个格子到第B个格子张贴海报;
-
后贴的海报可以覆盖前面已贴的海报或部分海报。
现在请你判断,张贴完所有海报后,在electoral墙上还可以看见多少张海报。
输入格式
第一行: N M 分别表示electoral墙的长度和海报个数
接下来M行: Ai Bi 表示每张海报张贴的位置
输出格式
输出贴完所有海报后,在electoral墙上还可以看见的海报数。
输入输出样例
输入
1 4
2 6
8 10
3 4
7 10
输出
4
说明/提示

【约束条件】
1 0<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000
所有的数据都是整数。数据之间有一个空格
题解(链接)
浮水法 dalao的题解_blog
还可以线段树做(本蒟蒻懒得打)
代码
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int n,m; int x[10000],y[10000],k,ans,f[10000]; void check(int xx,int yy,int nn,int mm) { if(f[mm]) return; while (nn<=n && (xx>=y[nn] || yy<=x[nn])) nn++; if(nn>n){ ans++; f[mm]=1; } if(x[nn]>xx && x[nn]<yy) check(xx,x[nn],nn+1,mm); if(y[nn]<yy && y[nn]>xx) check(y[nn],yy,nn+1,mm); } int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); y[i]++; } ans=1; for(int i=n-1;i>=1;i--) check(x[i],y[i],i+1,i); printf("%d",ans); }

浙公网安备 33010602011771号