日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3295 [SCOI2016]萌萌哒(DP+倍增)

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3295 [SCOI2016]萌萌哒(DP+倍增) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P3295 [SCOI2016]萌萌噠

description

solution

強制部分區間相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)
只需要考慮那一個數據結構將其轉化成O(nlog?n)O(n\log n)O(nlogn)

樹之類的就不考慮了,一段一段的區間——倍增啊!
將點iii拆成logloglog個點
fi,j:f_{i,j}:fi,j?: 僅考慮[i,i+2j)[i,i+2^j)[i,i+2j)段內的數
最后進行fff并查集的標記下放合并
最后則是9?10cnt?1,cnt9*10^{cnt-1},cnt9?10cnt?1,cnt表示不同的并查集數量,首不能為000

code

#include <cstdio> #define mod 1000000007 #define int long long #define maxn 100005 int n, m, cnt; int f[maxn][20];int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans; }void make() {for( int i = 1;i <= n;i ++ )for( int j = 0;j < 20;j ++ )f[i][j] = i; }int find( int i, int j ) {return i == f[i][j] ? i : f[i][j] = find( f[i][j], j ); }void merge( int i, int k, int j ) {if( find( i, j ) == find( k, j ) ) return;else f[f[i][j]][j] = f[k][j]; }signed main() {scanf( "%lld %lld", &n, &m );make();for( int i = 1, l, r, L, R;i <= m;i ++ ) {scanf( "%lld %lld %lld %lld", &l, &r, &L, &R );for( int j = 19;~ j;j -- )if( l + ( 1 << j ) - 1 <= r ) {merge( l, L, j );//給一整段都打上標記l += ( 1 << j );L += ( 1 << j );}}for( int j = 19;j;j -- )for( int i = 1;i + ( 1 << j ) - 1 <= n;i ++ ) {//標記下放merge( i, find( i, j ), j - 1 );merge( i + ( 1 << j - 1 ), f[i][j] + ( 1 << j - 1 ), j - 1 );}int tot = 0;for( int i = 1;i <= n;i ++ )if( find( i, 0 ) == i ) tot ++;printf( "%lld\n", qkpow( 10, tot - 1 ) * 9 % mod );return 0; }

總結

以上是生活随笔為你收集整理的P3295 [SCOI2016]萌萌哒(DP+倍增)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。