NOIP2017赛前模拟 纸袋(并查集)
2017-10-31 18:21
387 查看
题目描述:
给一个无限长的纸袋,上面被划分了许多个格子,现在进行N次操作,第i次操作是将[ Li , Ri ](注意这里的L,R是格子的左右端点,不是格子的编号),改为数字 i ,询问最后可以看到多少种数字。
题解:
显然我们应该倒着染色,我们可以维护一个 r[ i ]数组,表示 第 i 个格子,右边第一个没有被染过色的格子是那一个,凯爷说可以用并查集将同种颜色(数字)的格子连在一起,每次一起维护r[ i ],我是直接在扫的时候就维护每一个格子的r[i] ,路径压缩即可。
注意数据范围 Ri<=1e9,所以之前要离散化;
但要注意如上图情况,我们需要判断是否存在如上图3,5的情况,因为直接离散化4就没有了,所以我们最好每个的末尾都补一个数,判断是否存在这种情况。
给一个无限长的纸袋,上面被划分了许多个格子,现在进行N次操作,第i次操作是将[ Li , Ri ](注意这里的L,R是格子的左右端点,不是格子的编号),改为数字 i ,询问最后可以看到多少种数字。
题解:
显然我们应该倒着染色,我们可以维护一个 r[ i ]数组,表示 第 i 个格子,右边第一个没有被染过色的格子是那一个,凯爷说可以用并查集将同种颜色(数字)的格子连在一起,每次一起维护r[ i ],我是直接在扫的时候就维护每一个格子的r[i] ,路径压缩即可。
注意数据范围 Ri<=1e9,所以之前要离散化;
但要注意如上图情况,我们需要判断是否存在如上图3,5的情况,因为直接离散化4就没有了,所以我们最好每个的末尾都补一个数,判断是否存在这种情况。
#include<cstdio> #include<algorithm> #include<cmath> #include<ctime> #include<cstring> #include<string> #include<iomanip> #include<iostream> #include<cctype> using namespace std; const int N = 1000005; int n,num,rig,r[4*N]; int x[4*N]; bool a[4*N],use[4*N]; struct node{ int l,r; }c[4*N]; inline int Readint(){ int i=0,f=1;char c; for(c=getchar();!isdigit(c)&&c!='-';c=getchar()) ; if(c=='-') f=-1,c=getchar(); for(;isdigit(c);c=getchar()) i=(i<<1)+(i<<3)+c-'0'; return i*f; } inline int find(int x){ if(!a[x] || x==r[x]) return x; r[x]=find(r[x]); return r[x]; } int main(){ //freopen("ribbon.in","r",stdin); //freopen("ribbon.out","w",stdout); n=Readint(); for(int i=1;i<=n;i++){ c[n-i+1].l=Readint()+1; c[n-i+1].r=Readint(); x[i*2-1]=c[n-i+1].l; x[i*2]=c[n-i+1].r; } int tot=2*n; for(int i=1;i<=n;i++) x[++tot]=c[i].r+1; sort(x+1,x+1+tot); tot=unique(x+1,x+1+tot)-x; for(int i=1;i<=n;i++){ c[i].l=lower_bound(x+1,x+1+tot,c[i].l)-x; c[i].r=lower_bound(x+1,x+1+tot,c[i].r)-x; rig=max(rig,c[i].r); } for(int i=1;i<=rig;i++) r[i]=i+1; for(int i=1;i<=n;i++){ for(int j=c[i].l;j<=c[i].r;++j) { if(!a[j]){ a[j]=true; r[j-1]=j+1; if(!use[i]) use[i]=true,num++; } else{ r[j]=find(r[j]); j=r[j];j--; } } } cout<<num; }
相关文章推荐
- NOIP2017赛前模拟 分玩具
- NOIP2017赛前模拟(2017.10.31)考试总结
- 2017.7.13 NOIP2017赛前模拟考试总结
- NOIP2017赛前模拟 Graph (2017.10.24)
- NOIP2017赛前模拟 STAR (合理证明复杂度)
- NOIP2017赛前模拟(2017.10.19)
- NOIP2017赛前模拟 字符串(AC自动机)
- NOIP2017赛前模拟 (2017.10.17)考试总结
- NOIP2017赛前模拟(2017.10.23)
- NOIP2017 赛前模拟(2017.10.30)考试总结
- NOIP2017赛前模拟(2017.10.20)Matrix (类似轮廓线DP)
- NOIP2017赛前模拟(2017.10.20)
- NOIP2017赛前模拟 Table(双向链表)
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
- JZOJ.5315【NOIP2017模拟8.19】小串串
- 【NOIP2017提高A组模拟8.22】密码
- 2017蓝桥杯模拟 风险度量(并查集)
- 【NOIP2017提高A组模拟9.7】计数题
- 【JZOJ4910】【NOIP2017模拟12.3】子串
- 神炎皇【NOIP2017提高组模拟12.10】