BZOJ 4569: [Scoi2016]萌萌哒
2016-05-24 10:43
337 查看
(没有什么区间问题是线段树解决不了的,如果有,就上倍增)
对于这题一个显然的问题是线段树分解出来的区间大小不是一一对应的,合并起来很麻烦的
所以要用ST表,因为ST表对于两个长度相同的区间的分解是可以对应的
于是将每次限制的两个区间都分解,对应合并
最后总体pushdown就可以了
对于这题一个显然的问题是线段树分解出来的区间大小不是一一对应的,合并起来很麻烦的
所以要用ST表,因为ST表对于两个长度相同的区间的分解是可以对应的
于是将每次限制的两个区间都分解,对应合并
最后总体pushdown就可以了
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<algorithm> #include<map> #include<set> #include<stack> #define rep(i,l,r) for(int i=l;i<=r;i++) #define per(i,r,l) for(int i=r;i>=l;i--) #define mmt(a,v) memset(a,v,sizeof(a)) #define tra(i,u) for(int i=head[u];i;i=e[i].next) using namespace std; typedef long long ll; const int p=(1e9)+7; const int N=100000+5; ll qmul(ll a,ll b){ ll ans=1; for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p; return ans; } int fa[N*20],id [20],sz,s[N*20],t[N*20],bin[30]; int find(int x){return fa[x]?fa[x]=find(fa[x]):x;} void merge(int x,int y){x=find(x);y=find(y);if(x!=y)fa[y]=x;} int main(){ //freopen("a.in","r",stdin); int n,m;scanf("%d %d",&n,&m); if(n==1){puts("10");return 0;} rep(i,1,n) rep(j,0,18) id[i][j]=++sz,s[sz]=i,t[sz]=j; bin[0]=1;rep(i,1,20)bin[i]=bin[i-1]<<1; while(m--){ int l1,r1,l2,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2); per(i,18,0) if(l1+bin[i]-1<=r1){ merge(id[l1][i],id[l2][i]); l1+=bin[i];l2+=bin[i]; } } per(j,18,1) rep(i,1,n){ int k=find(id[i][j]); int p=s[k],q=t[k]; merge(id[i][j-1],id[p][q-1]); merge(id[i+bin[j-1]][j-1],id[p+bin[q-1]][q-1]); } int cnt=0; rep(i,1,n) cnt+=!fa[id[i][0]]; printf("%lld\n",9*qmul(10,cnt-1)%p); return 0; }
相关文章推荐
- 【补充习题七】积分不等式及定积分性质
- Reverse Linked List
- keil MDK启动文件分析---基于LPC2100系列
- 基于权重的随机数JS实现
- 关于MVVM
- COM的理解
- ASP.NET MVC图片上传前预览简单实现
- JMeter压力测试入门教程
- 利用上下文信息
- Android开发如何进阶?
- 双剑合并 XOR Trie.
- Meclipse jsp界面注释显示错误,解决方案
- Extjs中grid 的ColumnModel 属性配置
- MySQL数据库索引问题
- hog特征原理详解及matlab代码学习笔记
- AD采样
- Android SQLite 支持嵌套事务吗?
- 关于用mongodb java api 来实现在$project中使用$substr函数的方法
- [No000099]软件版本命名规范
- mongodb安装配置