题目链接:https://codeforces.com/contest/1182
A:
一眼题。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int n; 21 22 int main() { 23 cin >> n; 24 if (n & 1) return cout << 0, 0; 25 cout << pow((ll)2, (ll)n / 2) << endl; 26 return 0; 27 }
B:
找到十字的中心点,然后往四周dfs,统计星号数量即可。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 510, px[4] = {1, -1, 0, 0}, py[4] = {0, 0, 1, -1}; 21 int h, w, cnt = 0, n = 0, m = 0, flag = 1, cnt2 = 0; 22 char s[maxn][maxn]; 23 24 void dfs(int x, int y, int i) { 25 if (s[x][y] == '*' && x >= 1 && x <= h && y >= 1 && y <= w) { 26 x += px[i]; y += py[i]; cnt2++; dfs(x, y, i); 27 } 28 } 29 30 int main() { 31 scanf("%d%d", &h, &w); 32 rep1(i, 1, h) scanf("%s", s[i] + 1); 33 rep1(i, 1, h) { 34 rep1(j, 1, w) 35 if (s[i][j] == '*') cnt++; 36 } 37 if (h < 3 || w < 3) return puts("NO"), 0; 38 rep1(i, 2, h - 1) { 39 rep1(j, 2, w - 1) { 40 if (s[i][j] == '*' && s[i - 1][j] == '*' && s[i][j - 1] == '*' && s[i + 1][j] == '*' && s[i][j + 1] == '*') 41 if (!n) n = i, m = j; 42 else flag = 0; 43 } 44 } 45 if (!flag || n == 0) return puts("NO"), 0; 46 rep0(i, 0, 4) dfs(n + px[i], m + py[i], i); 47 cnt2++; 48 if (cnt2 == cnt) puts("YES"); else puts("NO"); 49 return 0; 50 }
C:
数据结构大模拟。交了个学费:string.c_str()只能用在printf,不能用在scanf,因为返回的是一个const char*。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 1e5 + 10; 21 int n; 22 string s[maxn]; 23 map<pair<int, int>, vector<int> >m; 24 vector<pair<int, int> >fir, sec; 25 vector<pair<pair<int, char>, int> >in; 26 27 int isVowel(char c) { 28 if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') return 1; 29 return 0; 30 } 31 32 int main() { 33 scanf("%d", &n); 34 rep0(i, 0, n) { 35 cin >> s[i]; 36 pair<pair<int, char>, int> tmp = mp(mp(0, 'z'), i); 37 rep0(j, 0, s[i].size()) { 38 if (isVowel(s[i][j])) { 39 tmp.first.first++; 40 tmp.first.second = s[i][j]; 41 } 42 } 43 m[tmp.first].pb(i); 44 } 45 for (auto it : m) { 46 vector<int>r = it.second; 47 for (int j = 0; j < r.size(); j += 2) 48 if (j + 1 < r.size()) 49 sec.pb(mp(r[j], r[j + 1])); 50 else 51 in.pb(mp(it.first, r[j])); 52 } 53 sort(in.begin(), in.end()); 54 rep0(i, 0, (int)in.size()) { 55 pair<pair<int, char>, int>tmp = in[i]; 56 if (i + 1 < in.size()) { 57 if (in[i + 1].first.first == tmp.first.first) { 58 fir.pb(mp(in[i + 1].second, tmp.second)); 59 i++; 60 } else continue; 61 } else break; 62 } 63 int r = 0; 64 rep1(i, 1, sec.size()) { 65 int rem = sec.size() - i + fir.size(); 66 if (i <= rem) r = i; 67 } 68 rep0(i, r, sec.size()) fir.pb(sec[i]); 69 printf("%d ", r); 70 rep0(i, 0, r) { 71 printf("%s %s ", s[fir[i].first].c_str(), s[sec[i].first].c_str()); 72 printf("%s %s ", s[fir[i].second].c_str(), s[sec[i].second].c_str()); 73 } 74 return 0; 75 }
D:
不太会做的图论题。
E:
题目清晰易懂,一看就是个矩阵快速幂。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const ll mod = 1e9 + 7, MOD = 1000000006; 21 const int maxn = 3; 22 23 struct Matrix { 24 ll mat[8][8]; 25 }; 26 27 ll n, f1, f2, f3, c, ans = 1; 28 Matrix ma; 29 30 // matrix multiply 31 Matrix mat_mul(Matrix a, Matrix b) { 32 Matrix ret; 33 for ( int i = 1; i <= maxn; i++ ) 34 for ( int j = 1; j <= maxn; j++ ) 35 ret.mat[i][j] = 0; 36 for ( int i = 1; i <= maxn; i++ ) 37 for ( int j = 1; j <= maxn; j++ ) 38 for ( int k = 1; k <= maxn; k++ ) 39 ret.mat[i][j] = ( ret.mat[i][j] + a.mat[i][k] * b.mat[k][j] % MOD ) % MOD; 40 return ret; 41 } 42 43 // matrix quick pow 44 Matrix mat_pow(Matrix a, ll b) { 45 Matrix ret; 46 memset(ret.mat, 0, sizeof(ret.mat)); 47 for (int i = 1; i <= maxn; i++) 48 ret.mat[i][i] = 1; 49 while (b > 0) { 50 if (b & 1) 51 ret = mat_mul(ret, a); 52 a = mat_mul(a, a); 53 b >>= 1; 54 } 55 return ret; 56 } 57 58 // quick pow 59 ll pow_mod(ll x, ll b) { 60 ll ret = 1; 61 while (b > 0) { 62 if (b & 1) 63 ret = ret * x % mod; 64 x = x * x % mod; 65 b >>= 1; 66 } 67 return ret; 68 } 69 70 int main() { 71 cin >> n >> f1 >> f2 >> f3 >> c; 72 ll inv = pow_mod(c, mod - 2); 73 memset(ma.mat, 0, sizeof(ma.mat)); 74 ma.mat[1][1] = ma.mat[1][2] = ma.mat[1][3] = ma.mat[2][1] = ma.mat[3][2] = 1; 75 ma = mat_pow(ma, n - 3); 76 f1 = f1 * c % mod; 77 f2 = f2 * c % mod * c % mod; 78 f3 = f3 * c % mod * c % mod * c % mod; 79 ans = pow_mod(f1, ma.mat[1][3]) * pow_mod(f2, ma.mat[1][2]) % mod * pow_mod(f3, ma.mat[1][1]) % mod; 80 ans = ans * pow_mod(inv, n) % mod; 81 cout << ans << endl; 82 return 0; 83 }
F:
溜了溜了。