模擬賽 刷漆(時間限制:1s;空間限制:128MB)

問題描述

Czy做完了所有的回答出了所有的詢問,結果是,他因爲腦力消耗過大而變得更虛了:)。幫助Czy恢復身材的艱鉅任務落到了你的肩上。
正巧,你的花園裏有一個由N塊排成一條直線的木板組成的柵欄,木板從左到右依次標號1到N。這N塊木板中,有M塊木板前面放着一桶油漆。油漆有不同的顏色,每種顏色可以由一個大寫字母表示(A到Z)。而你要求Czy用他的油漆刷子給柵欄刷上油漆。
已知Czy會選擇一個前方放有油漆桶的木板開始他的任務。刷子蘸上油漆後,他開始隨機地沿着柵欄走,他不會走出柵欄的範圍。隨機地走表示Czy會沿着他選擇的方向一直走,然後隨機在任何時候改變方向。沿着柵欄走只有兩個方向,向前和向後。
你發現Czy刷油漆的過程總是符合下列規則:
• 每個油漆桶裏裝着無限多的油漆;
• 刷子上每次只有一種顏色的油漆,每次蘸油漆都會完全替換刷子上的油漆顏色;
• 當Czy走到一個油漆桶前,他會首先用刷子蘸這個油漆桶裏的油漆;
• Czy每走過一個木板都會將這個木板刷成當前刷子上的油漆顏色。
已知木板可以被多次刷上油漆,每次都會完全覆蓋之前的顏色。當所有木板都被刷上了油漆的時候,Czy才能停下來(當然他也可以繼續刷到他想停下來爲止)。你看着Czy在柵欄前來回舞動,突然想知道Czy停下來的時候柵欄有多少種可能的不同油漆方案。定義當至少有一塊木板顏色不同時,兩種油漆方案被視爲是不同的。
請你輸出不同的油漆方案數對109+9取模的值。

輸入

輸入文件爲 paint.in。
輸入的第一行包含兩個整數N和M。
接下來M行,每行兩個整數x和y,表示第y塊木板前面有一個裝着顏色爲x的油漆的油漆桶。

輸出

輸出文件爲 paint.out。
輸出一行,包含一個整數,表示不同的油漆方案數對109 + 9取模的結果。

輸入輸出樣例

paint.in 

6 2

A 2

B 6

paint.out

4

數據範圍

對於30% 的數據,1 ≤ M ≤ N ≤ 100。
對於100% 的數據, 1 ≤ M ≤ N ≤ 100000。

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

題解

無腦dp。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define ll long long
#define mod 1000000009
using namespace std;
int n,m;
struct wu{int w,v;} a[100002];
ll f[100002];
bool kp(const wu &i,const wu &j) {return i.w<j.w;}
void init()
{
	scanf("%d%d",&n,&m);
	int i,x; char ch[5];
	for(i=1;i<=m;i++)
	   {scanf("%s %d",ch,&x);
	    a[i].w=x; a[i].v=ch[0]-'A';
	   }
	sort(a+1,a+m+1,kp);
}
void dp()
{
	int i;
	f[1]=1;
	for(i=2;i<=m;i++)
	   {if(a[i].v!=a[i-1].v)
	       f[i]=(f[i-1]*(a[i].w-a[i-1].w))%mod;
	    else f[i]=f[i-1];
	   }
	printf("%I64d\n",f[m]);
}
int main()
{
	freopen("paint.in","r",stdin);
	freopen("paint.out","w",stdout);
	init(); dp();
	return 0;
}

發佈了367 篇原創文章 · 獲贊 2 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章