A. Alien Communication Masterclass
【題目】
給定序列A、B,構造一個等式,使得對於任意的A[i]進制都滿足,對於任意的B[i]都
不滿足
【分析i】
同一個式子,不同進制的結果如果不相同,一般是在進位上,首先我們可以想到如
果對於A序列的進制都滿足呢,可以寫成x1 * x2 * x3 *x4 = 0這種,每種進制可以構
造一個等於0的式子,對於A[i],可以構造(10 - 1 - 1 - 1…. - 1)共減去a[i]個1
B .Flowery Trails
【問題】
給定一無向圖,詢問由s至t的所有最短路徑的邊的並
【分析】
從s開始跑一遍最短路,從t開始跑一遍最短路,然後一次枚舉每條邊,判斷是否是最
短路徑上的邊
C. Commuting Functions
【問題】
已知兩函數f、g滿足f[g[x]] = g[f[x]],函數f的定義域、值域都爲1~n的整數,且f爲雙
射函數,詢問函數g的值(字典序儘可能的小)
【分析】
顯然f的值域是由若干循環節組成的,對於一個循環節來說,g中對應位置也爲循環
節,且只要此循環節的一個數值確定,那麼整個循環節便確定下來了,爲了保證字
典序儘可能的小,我們應該讓此循環節的最靠左的位置對應的數儘可能的小。
首先,對於f的一個長度爲k的循環節,假如之前沒有出現過長度爲k的因子的循環
節,那麼對於此 ,g[i]= i是顯然可行的一個方案,並且是字典序最小的方案,那麼
長度爲2* k也可以使用此方案,3* k也可以使用此方案。
因此對於f的每個值,判斷他的循環節長度k,找出最靠左的位置應該填充的數值,依
次填取即可
D.Book Club
【題目】
給定一有向圖,詢問是否存在若干環,使得這些環把每個頂點包含一次,其實說白
了就是二分圖最大匹配
【分析】
直接用匈牙利算法搞一下就可以了,說一下匈牙利的原理吧,對於每個小哥哥,都
會儘可能的找到一個小姐姐與之對應,如果給某個小哥哥A找的過程中,發現他想找
的小姐姐A已經被小哥哥B搶了,這時候判斷一下能否給小哥哥B換一個小姐姐,這
樣豈不是兩全其美,判斷的時候對小姐姐A做一個標記,發表已經試圖從小姐姐A這
騰一個位置,這樣以後就不需要再次在小姐姐A上考慮了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N = 10000 + 500;
vector<int > s[N];
int tmp[N];
bool f[N];
bool dfs(int x)
{
for(int i = 0; i < s[x].size(); i++)
{
int y = s[x][i];
if (!f[y])
{
f[y] = true;
if (tmp[y] == -1 || dfs(tmp[y]))
{
tmp[y] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
s[x].push_back(y);
}
memset(tmp, -1, sizeof(tmp));
for(int i = 0; i < n; i++)
{
memset(f, 0, sizeof(f));
dfs(i);
}
bool delta = true;
for(int i = 0; i < n; i++)
if(tmp[i] == -1)
{
delta = false;
break;
}
if (delta)
printf("YES\n"); else
printf("NO\n");
return 0;
}