【UOJ 709】刷漆
【題目描述】:
Czy做完了所有的回答出了所有的詢問,結果是,他因為腦力消耗過大而變得更虛了:)。幫助Czy恢復身材的艱鉅任務落到了你的肩上。
正巧,你的花園裡有一個由N塊排成一條直線的木板組成的柵欄,木板從左到右依次標號1到N。這N塊木板中,有M塊木板前面放著一桶油漆。油漆有不同的顏色,每種顏色可以由一個大寫字母表示(A到Z)。而你要求Czy用他的油漆刷子給柵欄刷上油漆。
已知Czy會選擇一個前方放有油漆桶的木板開始他的任務。刷子蘸上油漆後,他開始隨機地沿著柵欄走,他不會走出柵欄的範圍。隨機地走表示Czy會沿著他選擇的方向一直走,然後隨機在任何時候改變方向。沿著柵欄走只有兩個方向,向前和向後。
你發現Czy刷油漆的過程總是符合下列規則:
-
每個油漆桶裡裝著無限多的油漆;
-
刷子上每次只有一種顏色的油漆,每次蘸油漆都會完全替換刷子上的油漆顏色;
-
當Czy走到一個油漆桶前,他會首先用刷子蘸這個油漆桶裡的油漆;
-
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; }