傳送門
題目描述
有一條數字長鏈,這條鏈上有些數字是相同的,有些地方是不同的,這條數鏈有很多種不同的可能。求最多有多少種可能的方案?
為了簡化題目,數鏈沒有前導零。因為答案可能很大,所以你只需要輸出答案mod
109+
7\mod10^9+7
mod109
+7的結果。
輸入輸出格式
輸入格式
第一行:兩個正整數n(1
≤n
≤100000
)n(1\le n\le 100000)
n(1≤n≤
1000
00)和m(1
≤m
≤100000
)m(1\le m \le 100000)
m(1≤m≤
1000
00),表示這個數的長度為n
nn,提出了m
mm個要求。
接下來m
mm行:每行四個整數l1,
r1,l
2,r2
l_1,r_1,l_2,r_2
l1,r1
,l2
,r2
,表示該數鏈的[l1
,r1]
[l_1,r_1]
[l1,r
1]與[l2
,r2]
[l_2,r_2]
[l2,r
2]相同。
輸出格式
僅一行,乙個整數,有多少種可能的情況。
這兩個相同的、長度為len
lenle
n的區間,可以拆分為兩個區間分別相等。
是否在**看過這種乙個區間拆成兩個區間的、高效的,類似的呢?——rmq
\bbb
rmq!
這提示我們第二維j
jj表示區間長度為2
j2^j
2j。這樣,就可以用並查集來儲存每乙個相同的了!
具體來說:將有序數對(i,
j)
(i,j)
(i,j
)當做下標,儲存其並查集中的父節點。
而父節點與子節點的長度相同,只需儲存父節點的first
\text
first
。統計答案時,最終所有second
\text
second
不為0
00的(也就是長度不為20=
12^0=1
20=1
的),都要下傳成長度為1
11的(便於統計)。
那麼我們一開始就傳下去就好啦!有一種情況可以中途剪枝:想要固定相同的兩個區間本來就 因為各種不可描述的原因 相同。
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int lg =
18, max =
100000
, mod =
1e9+7;
int n, m, lg[max+5]
, f[max+5]
[lg]
;bool vis[max+5]
;int
findroot
(int x,
int t)
void
merge
(int a,
int b,
int t)
intmain()
ll ans =9;
// 去掉前導零
vis[
findroot(1
,0)]
=1;for
(int i=
1; i<=n;
++i)
} cout << ans;
return0;
}
6 14 查詢星期
6 14 查詢星期 15分 本題要求實現函式,可以根據下表查詢到星期,返回對應的序號。序號 星期 0 sunday 1 monday 2 tuesday 3 wednesday 4 thursday 5 friday 6 saturday 函式介面定義 int getindex char s 函式g...
usOJ5529 小奇探險
傳送門 to usoj 題目描述 小奇去遺跡探險,遺跡裡有 n nn 個寶箱,有的裝滿了珠寶,有的裝著廢品。小奇有地圖,所以它知道每乙個寶箱的價值,但是它不喜歡走回頭路,所以要按順序拿這 n nn 個寶箱中的若干個。拿寶箱很累的。一開始小奇的體力是 1 11 每得到乙個寶箱之後,小奇得到的價值是體力...
6 1 4 擊鍵和字元
摘錄於 windows程式 第5版,珍藏版 charles.petzold 著 p175 應用程式從 windows 接收的關於鍵盤事件的訊息可分為擊鍵和字元兩種。這與你看待鍵盤的兩種方式是一致的。首先,你可以認為鍵盤是鍵的集合。鍵盤上僅有乙個鍵表示為 a 按下此鍵是一次擊鍵,釋放此鍵也認為是一次擊...