1. 程式人生 > 實用技巧 >【UOJ 709】刷漆

【UOJ 709】刷漆

【題目描述】:

Czy做完了所有的回答出了所有的詢問,結果是,他因為腦力消耗過大而變得更虛了:)。幫助Czy恢復身材的艱鉅任務落到了你的肩上。

正巧,你的花園裡有一個由N塊排成一條直線的木板組成的柵欄,木板從左到右依次標號1到N。這N塊木板中,有M塊木板前面放著一桶油漆。油漆有不同的顏色,每種顏色可以由一個大寫字母表示(A到Z)。而你要求Czy用他的油漆刷子給柵欄刷上油漆。

已知Czy會選擇一個前方放有油漆桶的木板開始他的任務。刷子蘸上油漆後,他開始隨機地沿著柵欄走,他不會走出柵欄的範圍。隨機地走表示Czy會沿著他選擇的方向一直走,然後隨機在任何時候改變方向。沿著柵欄走只有兩個方向,向前和向後。

你發現Czy刷油漆的過程總是符合下列規則:

  1. 每個油漆桶裡裝著無限多的油漆;

  2. 刷子上每次只有一種顏色的油漆,每次蘸油漆都會完全替換刷子上的油漆顏色;

  3. 當Czy走到一個油漆桶前,他會首先用刷子蘸這個油漆桶裡的油漆;

  4. Czy每走過一個木板都會將這個木板刷成當前刷子上的油漆顏色。

已知木板可以被多次刷上油漆,每次都會完全覆蓋之前的顏色。當所有木板都被刷上了油漆的時候,Czy才能停下來(當然他也可以繼續刷到他想停下來為止)。你看著Czy在柵欄前來回舞動,突然想知道Czy停下來的時候柵欄有多少種可能的不同油漆方案。定義當至少有一塊木板顏色不同時,兩種油漆方案被視為是不同的。

請你輸出不同的油漆方案數對10^9+9取模的值。

【輸入描述】:

輸入的第一行包含兩個整數N和M。

接下來M行,每行兩個整數x和y,表示第y塊木板前面有一個裝著顏色為x的油漆的油漆桶。

【輸出描述】:

輸出一行,包含一個整數,表示不同的油漆方案數對10^9 + 9取模的結果。

【樣例輸入】:

6 2
A 2
B 6

【樣例輸出】:

4

【時間限制、資料範圍及描述】:

時間:1s 空間:128M

對於30% 的資料,1 <= M <= N <= 100。

對於100% 的資料, 1 <= M <= N <= 100,000。

x是A到Z之間的大寫字母;1 <= y <= N。

題解:題目好長阿巴阿巴…但其實不難√

#include<cstdio>
#include
<iostream> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=100002; const ll mod=1000000009; ll ans=1; struct node{ char c; int x; }a[N]; int n,m; bool cmp(node p,node q) { return p.x<q.x; } int main(){ freopen("paint.in","r",stdin); freopen("paint.out","w",stdout); scanf("%d %d\n",&n,&m); for(int i=1;i<=m;i++) scanf("%c %d\n",&a[i].c,&a[i].x); sort(a+1,a+m+1,cmp); for(int i=1;i<m;i++){ if(a[i].c==a[i+1].c) continue; ans=(ans*(a[i+1].x-a[i].x))%mod; } cout<<ans%mod; return 0; }