usOJ6149 英語危機

2021-09-25 04:05:37 字數 2044 閱讀 7200

傳送門

題目描述

有一條數字長鏈,這條鏈上有些數字是相同的,有些地方是不同的,這條數鏈有很多種不同的可能。求最多有多少種可能的方案?

為了簡化題目,數鏈沒有前導零。因為答案可能很大,所以你只需要輸出答案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 按下此鍵是一次擊鍵,釋放此鍵也認為是一次擊...