放假啦
3272 Problem A Cow Traffic
由于題目是TOPO有序圖 直接DP一次拿到每個點的到達路徑條數 dp[i]
然后將所有有向邊反向 再做一次DP即得從BARN到每個點的路徑條數 rdp[i]
枚舉所有邊(u,v) 記錄dp[u] * rdp[i]的最大值即可
3273 Problem B Monthly Expense
二分枚舉答案
3274 Problem C Gold Balanced Lineup
HASH來做 我用排序做超時了.. Hash AC
由于中間把Node的大小定義operator<()中最后一行寫成了return true 一直拿不到正確答案... 原來自己定義map元素大小的時候相等情況應該定義為false 我的理解是屬于大于等于的范疇
Code follows:
1

#include <iostream>
2

#include <map>
3

#include <vector>
4

using namespace std;
5

6

struct Node { int s[30]; };
7

8

const int N = 100010;
9

int n, K;
10

Node a[N];
11

map<Node, int> mym;
12

vector<int> l[N];
13

14

bool operator<(const Node& a, const Node& b) {
15

int i;
16

for(i = 0; i < K; ++i)
17

if(a.s[i] != b.s[i])
18

return a.s[i] < b.s[i];
19

return false;
20

}
21

22

int main() {
23

scanf("%d %d", &n, &K);
24

int i, t, j, k;
25

for(j = 0; j < K; ++j)
26

a[0].s[j] = 0;
27

for(i = 1; i <= n; ++i) {
28

scanf("%d", &t);
29

for(j = 0; j < K; ++j, t >>= 1)
30

a[i].s[j] = a[i-1].s[j] + (t % 2);
31

for(j = 1; j < K; ++j)
32

a[i].s[j] -= a[i].s[0];
33

a[i].s[0] = 0;
34

}
35

36

j = 0;
37

for(i = 0; i <= n; ++i) {
38

if(mym.find(a[i]) == mym.end())
39

mym[a[i]] = j++;
40

l[mym[a[i]]].push_back(i);
41

}
42

43

int res = 0;
44

for(i = 0; i < j; ++i) {
45

int min = 123456789, max = -1;
46

for(k = 0; k < l[i].size(); ++k) {
47

if(l[i][k] > max) max = l[i][k];
48

if(l[i][k] < min) min = l[i][k];
49

}
50

if(max - min > res) res = max - min;
51

}
52

53

printf("%d\n", res);
54

55

return 0;
56

}
57

3275 Problem D Ranking the Cows
首先可以看出詢問的上界是所有的不連通的節點數 因為只要全部query一次就可以全部得到順序
然后我們可以證明其下界也是這個 因為事實上只要這兩個節點在大小序列中相鄰 那么他們必須被詢問一次
所以我們只要做DFS就可以找出不連通的節點對數
3277 Problem F City Horizon
首先對Y方向做離散化(注意不要用map 容易超時-_-||| 我就超了)
接著構建線段數(區間為0-Y方向點的個數)
然后從左到右掃描 每碰到一個矩形的左豎線就添加到線段數 右豎線則刪除 面積 += 掃描間距 * 線段數的測度
3278 Problem G Catch That Cow
BFS
3279 Problem H Fliptile
枚舉第一行狀態2^m
可以遞推出下面所有行的狀態
時間復雜度o(2^m * n)
注意用位運算壓縮
3280 Cheapest Palindrome
觀察可知 其實插入一個字符串在最優插入情況下可以看作是刪除一個字符(想想為什么?)
這樣就可以得到每個字符的刪除耗費
然后可以得到一個和LCS有些像的方程
dp[i, j] = Min( dp[i+1, j] + cost[word[j]], dp[i, j-1] + cost[word[i]], dp[i+1, j-1]->(if(word[i] == word[j]));
找出最開始的那個結論就可以了
3281 Problem J Dining
最大流
從題目描述中比較容易看出網絡流可能出解 剩下的就是構造圖
我們看到對于一個Cow來說 其必須在滿足Food和Drink皆滿意的情況下才能算做滿意 因此比較好的構圖方法是將Food和Drink分別與源點和匯點相連 將cow放在中間 并把點權換成邊權(即將每一個cow節點一分為2 將點權放到2點的連邊上) 所有權全部設成1 RUN一次最大流 這種圖有時候也叫做三分圖