UVa 12796 - Teletransport

Problem

目標從太空船 S 到太空船 T,每一個太空船上有 N 個按鈕,每一種按鈕可以傳送到指定的太空船上,請問 L 步從 S 到 T 的按法有幾種。

Sample Input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2 20
1 1
2 2 2 2
1 1 1 1
2 29
1 1
2 2 2 2
1 1 1 1
2 0
1 1
2 2 2 2
1 1 1 1
2 0
1 2
2 2 2 2
1 1 1 1
3 2
3 1
1 2 2 2
2 1 3 2
2 2 3 1

Sample Output

1
2
3
4
5
7776
0
1
0
4

Solution

既然按鈕都不同,那就可以轉換成一般的 Graph,然後轉化成 K 步內抵達的方法數。

直接利用矩陣相乘計算方法數!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <string.h>
const int mod = 10000;
struct Matrix {
int v[100][100];
int row, col; // row x col
Matrix(int n, int m, int a = 0) {
memset(v, 0, sizeof(v));
row = n, col = m;
for(int i = 0; i < row && i < col; i++)
v[i][i] = a;
}
Matrix operator*(const Matrix& x) const {
Matrix ret(row, x.col);
for(int i = 0; i < row; i++) {
for(int k = 0; k < col; k++) {
if (v[i][k])
for(int j = 0; j < x.col; j++) {
ret.v[i][j] += v[i][k] * x.v[k][j],
ret.v[i][j] %= mod;
}
}
}
return ret;
}
Matrix operator^(const int& n) const {
Matrix ret(row, col, 1), x = *this;
int y = n;
while(y) {
if(y&1) ret = ret * x;
y = y>>1, x = x * x;
}
return ret;
}
};
int main() {
int N, L, S, T;
int x, y;
while (scanf("%d %d", &N, &L) == 2) {
scanf("%d %d", &S, &T);
Matrix m(N, N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < 4; j++) {
scanf("%d", &x), x--;
m.v[i][x]++;
}
}
Matrix ret = m ^ L;
S--, T--;
printf("%d\n", ret.v[S][T]);
}
return 0;
}
/*
2 20
1 1
2 2 2 2
1 1 1 1
2 29
1 1
2 2 2 2
1 1 1 1
2 0
1 1
2 2 2 2
1 1 1 1
2 0
1 2
2 2 2 2
1 1 1 1
3 2
3 1
1 2 2 2
2 1 3 2
2 2 3 1
*/
Read More +

[轉] Latex ACM-ICPC template

要一下出題目規格,就有漂亮的 latex pdf!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
\documentclass[12pt,psfig,epsf]{article}
\setlength{\topmargin}{-1in}
\setlength{\textheight}{10in}
\setlength{\textwidth}{5.5in}
\usepackage{epsfig}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{graphicx}
\begin{document}
\begin{center}
{\Large\bfseries Problem test}\\ % Problem Number
{\large\bf Hello World}\\ % Problem Name
{\large Input File: {\em test.in}}\\ % Input file name
{\large Time Limit: {\em 1 Second}}\\ % Time limit in seconds
\end{center}
% Problem description here
Output hello world !
% Technical Specification and constraints
%\vspace*{.3in} \noindent {\large \bfseries Technical Specification}
%\begin{enumerate}
%\item The . . .
%\end{enumerate}
% Input File Format
\vspace*{.3in} \noindent {\large \bfseries Input File Format}\\
Input consists of several datasets. ...
% Output File Format
\vspace*{.3in} \noindent {\large \bfseries Output Format}\\
For each dataset, ....
% Sample Input
\vspace*{.3in} \noindent {\large \bfseries Sample Input}
\begin{verbatim}
morris
\end{verbatim}
% Sample Output
\vspace*{.3in} \noindent {\large \bfseries Output for the Sample Input}
\begin{verbatim}
hello morris !
\end{verbatim}
\end{document}
Read More +

[ACM 題目] 人格分裂

Problem

某 M 現在正在平面座標上的原點 (0, 0),現在四周被擺放了很多很多鏡子,某 M 可以藉由鏡子與他的人格小夥伴對話,請問那些鏡子可以見到小夥伴。

鏡子可以當作一個線段,之間不會交任何一點,只要能見到該鏡子中一小段區域就算可見到。

備註:不考慮反射看到。

Input

輸入有多組測資。

每組測資第一行將會有一個整數 n (n < 32767),表示總共有多少個鏡子。
接著會有 n 行,每一行上會有 4 個整數 sx, sy, ex, ey,表示鏡子所在的線段。

(-32767 < sx, sy, ex, ey < 32767)

Output

對於每組測資輸出一行,每一行將會有 n 個整數 (0/1),分別表示輸入中第 i 個鏡子是否可見到。

Sample Input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
5 -5 5 5
4
4 2 5 -2
2 4 6 1
5 5 8 1
3 -4 7 -1
7
-1 2 3 1
2 4 5 -1
-3 -1 1 -2
-1 -4 3 -2
-2 -4 1 -5
-4 1 -1 4
-3 4 -4 3
1
1 1 2 2
2
-1 3 -2 -2
-2 -1 -3 -1

Sample Output

1
2
3
4
5
1
1 1 0 1
1 1 1 1 0 1 0
0
1 0

More

sample 2

sample 3

Solution

1
Read More +

[ACM 題目] 河道分界

Problem

M 國開始藉由河道進行分裂,M 國土只會介於 y = 0 和 y = 1 之間,在 x 軸兩側無限延伸,保證河道彼此不會相交任何一點。

操作 A u v : 增加河道 (u, 1) 到 (v, 0),該河道編號為當前操作 A 的數量。

操作 Q x y : 詢問位置 (x, y) 在哪兩個河道之間。

Input

第一行將會有一個整數 N (N < 100, 000),表示接下來會有幾筆操作。

操作 A u v : u, v [-50000, 50000] 之間的實數。

操作 Q x y : x 屬於 [-50000, 50000], y 屬於 [0, 1]

Output

對於每個詢問,輸出在哪兩個河道之間,邊界為 [S, M],如果恰好在河道上輸出 [?, ?],詳細請參考範例輸出。

Sample Input

1
2
3
4
5
6
7
8
9
8
A 0 0
Q -1 0
Q 1 0
Q 0 0
A 1 2
Q 1 0.5
Q 3 0.5
Q 1.5 0.5

Sample Output

1
2
3
4
5
6
[S, 1]
[1, M]
[?, ?]
[1, 2]
[2, M]
[?, ?]

More

sample

Solution

1
Read More +

[ACM 題目] 樹形鎖頭

Problem

Background

正值大四的 Morris,面臨無法畢業的窘境,每天不是玩 PoE 遊戲就是在解題目,為了逃避現實解題目也越來越多,但對於未來目標仍然沒有任何進展,一個人在房間裡孤拎拎地打著 PoE,萬萬沒想到遊戲帳號被盜取,「密碼鎖什麼的果然太天真的,ACM 鎖才是未來的目標」打密碼登入有什麼了不起的,寫程式 AC 登入才有意思。

Problem

一張無向圖,給 N 個點、N - 1 條邊,任兩點之間只會有一條路徑。

操作 (u, v, k):將 u, v 之間經過的節點權重加上 k。

請問經過 M 次操作後,每個節點的權重值為何?

Input

輸入有多組測資。

每一組測資第一行 會有兩個正整數 N, M (0 < N, M < 32767),接下來會有 N - 1 行,每行上會有兩個整數 u, v (0 <= u, v < N) 表示 u 和 v 之間有一條邊。接著會有 M 行操作 (u, v, k) (0 < k < 32767)。

Output

每組測資輸出一行,分別將節點權重輸出。

Sample Input

1
2
3
4
5
6
7
8
9
10
11
7 4
0 1
0 2
1 3
1 4
2 5
2 6
2 3 1
3 4 2
0 5 4
6 6 8

Sample Output

1
5 3 5 3 2 4 8

Solution

1
Read More +

[通識] 文明的進程 Week 2

Front of the Class

電影《Front of the Class》(中譯:叫我第一名),是一部關於妥瑞症的一部電影。

問題

  • 男主角不想在什麼地點出現?這些地點有什麼共同特徵?

電影院、教會、音樂會、圖書館、體育場 … 等,這幾個地點都有著密集的人群,而且屬於室內環境,參與的人都有必須遵守的共同禮儀,因此無法容忍偶發性不正常的反應,這將會造成秩序上的不平衡。

  • 為什麼面試教師一直遭校方的反對?

首先,猜測幾點,先不管妥瑞症是否會對於男主角教學能力上的影響,既然捧著校方認可的同意書和成績,面試的基本門檻是過了。但是,哪個地方都不想要找一般的教師呢?一個突然會狗叫的教師將會給學校的門面帶來多少影響?是不是會有家長不讓學生進這個學校?即使校長願意讓男主在此教書,而家長的無知是否又會造成招生困難?

因此,害怕成為異類的校方,當然不想立刻收這位老師進來,不管後面的利益為何,有時候根本屬於未知的情況,因為根本沒有這種先例存在的話,只有極少數的人敢願意嘗試。

「害怕」和「不想」兩回事

  • 如果身邊有一個反應不太正常的人,你會怎麼做?

當然,妥瑞症所造成的肢體痙攣看來的確有點可怕,但是並非看起來就是鬼鬼祟祟、心術不正的長相,要恰好湊出這個組合的面貌,對於妥瑞症來說還真有點難度。反應不太正常的人其實也沒有好擔心的,高中同學也是常常在教室放屁,他自己也說忍不住,甚至有一天他特地跑到教室外面放屁,結果全部午睡的教室同學,全都被屁聲驚醒起來為他拍手叫好。

這麼三年過去,屁聲也是家常便飯了,想起來是相當特別,但誰沒有那麼一兩點特別之處呢?只是恰好沒有反應在外觀行為上!

而我,其實常常聽不懂別人說的任何一個詞,不管是中文還是英文,若沒有演講者般的口說,單純靠預測和推理得到「現在說了什麼」其實相當辛苦!有時候往往是無法預測,當沒有跟說話者很熟的時候。我姊也是因為這樣,常常把我抓去找耳科看有沒有耳朵問題,還是聽力退化,但是聽力似乎還算正常。「 聽得到,卻聽不懂 」的痛苦,一定會有人說是沒專心聽,請問「誰願意聽不清楚」,一堆人寧可聽不到一些雜語呢!

想到要跟人對談,就要有失敗的覺悟,拜託別人講第二次的勇氣越磨越光。

即使中文影片,有時還真希望有字幕 …

Read More +

影響我最深的十本書

上星期五六去台中一趟,也算是開學前的最後一趟玩樂。回程的路上,老妮可突然問我想一想 影響最深的十本書 ,這問題讓我在火車上困惑相當久。想說怎麼會突然問這問題,原來是有人模仿冰桶在點名玩這一套遊戲。嘛,肯定不會有人點我的。

至少目前過了快 48 小時,一點耳聞也沒有。

我討厭看書,說是影響最深的十本書

  1. 英漢辭典
  2. 英漢辭典
  3. 英漢辭典
  4. 英漢辭典
  5. 英漢辭典
  6. 英漢辭典
  7. 英漢辭典
  8. 英漢辭典
  9. 英漢辭典
  10. 英漢辭典

英漢辭典 真的很重要,所以要說十次!演算法、教科書、資訊相關書目 … 等,看過封面而沒讀盡,打開閱閱,沒讀完都是常態。這些書沒有讀完但仍然影響了我,教會了我放棄,於是就這麼颯爽地讀到一半了!既然偷偷跟我說叫我放棄,我就放下書來!能影響我的書到底在哪裡呢?

現在,剛得知畢業門檻只能考英文檢定,影響最深的絕對只有英漢辭典,可惜這個 小夥伴 一定會被在任何場所禁止、無用。真是給了人希望、也給了幻滅。

還記得動畫 《戰鬥司書》 ?如果人死的存在將成為一本書 … 那肯定是很有趣的世界,而我又能成為什麼樣的一本書呢。

影響我最深的到底是什麼書?以人構成的書嗎?看得動畫都比書多,該如何是好。

附錄

【點名-影響我最深的十本書】

1.《Introduction to Algorithms》,ISBN 0-262-03293-7,Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein,2nd ed,2001。
2.《Computational Complexity》,ISBN 0-201-53082-1,Papadimitriou, Christos,1st ed,Addison Wesley,1994。
3.《The Rise and Fall of the Great Powers: Economic Change and Military Conflict From 1500 to 2000》(《大國的興衰》、《大國崛起》),ISBN 0-394-54674-1,Paul Kennedy,1987。
4.《The complete Lojban language》,ISBN 0-9660283-0-9,John Woldemar Cowan。
5.《ヘタリア Axis Powers》(《義呆利 Axis Powers》),日丸屋秀和。
6.《百年流離》鴨子,2012。
7.《灼眼のシャナ》(《灼眼的夏娜》),高橋彌七郎。
8.《古詩十九首》
9.《詩經》
10.《算法艺术与信息学竞赛》,ISBN 978-7-302-07800-5,刘汝佳,清华大学出版社,2004。
11.《TIGER×DRAGON!》,竹宮ゆゆこ。
12.《中國文學史演義》,錢念孫,四版,2006。
13.《暗黑童話》,ISBN:978-9-866-95482-5,乙一,2007。

許胖大神
Read More +

UVa 12792 - Shuffled Deck

Problem

給定一種洗牌方式,請問重複多少次之後會復原到原本一開始的排列。

Sample Input

1
2
3
4
4
6
2
100002

Sample Output

1
2
3
4
4
3
2
100002

Solution

一道置換群的題目,將置換的方式找出,接著找一組一組循環置換集合,找到最小公倍數即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <algorithm>
using namespace std;
int A[1<<21], used[1<<21] = {};
int testcase = 0;
long long gcd(long long x, long long y) {
long long t;
while (x%y)
t = x, x = y, y = t%y;
return y;
}
int main() {
int n;
while (scanf("%d", &n) == 1) {
for (int i = 0; i < n; i++) {
if (i&1)
A[i] = i/2;
else
A[i] = i/2 + n/2;
}
testcase++;
long long lcm = 1;
for (int i = 0; i < n; i++) {
if (A[i] != i && used[i] != testcase) {
int ss = 0;
for (int j = i; used[j] != testcase; j = A[j])
used[j] = testcase, ss++;
lcm = lcm / gcd(lcm, ss) * ss;
}
}
printf("%d\n", lcm);
}
return 0;
}
/*
4
6
2
100002
*/
Read More +

UVa 12797 - Letters

Problem

找一條最短路徑從左上到右下,並且中間經過的字母不會有同時大小寫出現,也就是說 Aa 不能同時出現、Bb 不能同時出現 …

Sample Input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
6
DdaAaA
CBAcca
eEaeeE
bBbabB
DbDdDc
fFaAaC
7
aAaaaaa
aAaaaAa
aAaaaAA
aaAaAaa
AaAaaAa
aaAAaAa
aaaaaAa

Sample Output

1
2
13
-1

Solution

窮舉可使用的字符,對於每一種限定方式進行 bfs 搜索。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
int N, letter_cnt[128], letter_used[128];
int used[128][128] = {}, dist[128][128], testcase = 0, ret;
char g[128][128];
const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};
void dfs(int idx) {
if (idx == 10) {
queue<int> X, Y;
int tx, ty, x, y;
if (letter_used[g[0][0]] == 0)
return;
testcase++;
X.push(0), Y.push(0);
used[0][0] = testcase;
dist[0][0] = 1;
while (!X.empty()) {
x = X.front(), X.pop();
y = Y.front(), Y.pop();
if (x == N-1 && y == N-1) {
ret = min(ret, dist[x][y]);
return;
}
for (int i = 0; i < 4; i++) {
tx = x + dx[i], ty = y + dy[i];
if (tx < 0 || ty < 0 || tx >= N || ty >= N)
continue;
if (used[tx][ty] == testcase || letter_used[g[tx][ty]] == 0)
continue;
used[tx][ty] = testcase;
dist[tx][ty] = dist[x][y] + 1;
X.push(tx), Y.push(ty);
}
}
return ;
}
int c = 0;
if (letter_cnt[idx + 'a']) {
letter_used[idx + 'a'] = 1;
dfs(idx+1);
letter_used[idx + 'a'] = 0;
c++;
}
if (letter_cnt[idx + 'A']) {
letter_used[idx + 'A'] = 1;
dfs(idx+1);
letter_used[idx + 'A'] = 0;
c++;
}
if (c == 0)
dfs(idx+1);
}
int main() {
while (scanf("%d", &N) == 1) {
for (int i = 0; i < N; i++)
scanf("%s", g[i]);
memset(letter_cnt, 0, sizeof(letter_cnt));
memset(letter_used, 0, sizeof(letter_used));
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
letter_cnt[g[i][j]]++;
ret = 0x3f3f3f3f;
dfs(0);
printf("%d\n", ret == 0x3f3f3f3f ? -1 : ret);
}
return 0;
}
Read More +

UVa 12791 - Lap

Problem

在賽車運動中,常用 Lap 表示套一圈賽道所消耗的時間,現在有多名賽車手,給予最快一圈多久、最慢一圈多久,請問在最快車手第幾圈的時候,可以倒追最慢的車手。

Sample Input

1
2
3
4
1 10
4 8
5 7
6875 7109

Sample Output

1
2
3
4
2
2
4
31

Solution

懶得推導公式,二分倒追的時間,找到何時會產生倒追,再計算第幾圈即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <math.h>
int main() {
int X, Y;
while (scanf("%d %d", &X, &Y) == 2) {
double l = 0, r = 1e+30, mid;
int ret = 0;
#define eps 1e-8
while (fabs(l - r) > eps) {
mid = (l + r)/2;
if (mid * (1.0/X - 1.0/Y) >= 1)
r = mid;
else
l = mid;
}
printf("%.0lf\n", ceil(mid/X));
}
return 0;
}
Read More +