打得巨差。题目链接:https://codeforces.com/contest/1203
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 q; 21 int a[300]; 22 23 int main() { 24 scanf("%d", &q); 25 while (q--) { 26 int n; scanf("%d", &n); 27 int p, k; 28 rep1(i, 1, n) { 29 scanf("%d", &a[i]); 30 if (a[i] == 1) k = p = i; 31 } 32 if (n == 1) { 33 puts("YES"); 34 continue; 35 } 36 int flag1 = 1, flag2 = 1, last = a[k]; 37 while (1) { 38 p++; 39 if (p > n) p = 1; 40 if (a[p] - last != 1) { 41 flag1 = 0; break; 42 } 43 last = a[p]; 44 if (a[p] == n) break; 45 } 46 last = a[k]; p = k; 47 while (1) { 48 p--; 49 if (!p) p = n; 50 if (a[p] - last != 1) { 51 flag2 = 0; break; 52 } 53 last = a[p]; 54 if (a[p] == n) break; 55 } 56 if (flag1 || flag2) puts("YES"); else puts("NO"); 57 } 58 return 0; 59 }
B:
因为面积要相等,显然对棍子排序之后最小匹配最大,次小匹配次大,以此类推。

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 = 500; 21 int n, a[maxn], t; 22 23 int main() { 24 scanf("%d", &t); 25 while (t--) { 26 scanf("%d", &n); n = n * 4; 27 for (int i = 1; i <= n; i++) scanf("%d", &a[i]); 28 sort(a + 1, a + 1 + n); 29 int p = 1, q = n, area = -1, flag = 1; 30 while (p < q) { 31 if (area == -1) area = a[p] * a[q]; 32 else if (a[p]*a[q] != area) { 33 flag = 0; break; 34 } 35 if (a[p] != a[p + 1] || a[q] != a[q - 1]) { 36 flag = 0; break; 37 } 38 p += 2, q -= 2; 39 } 40 if (flag) puts("YES"); else puts("NO"); 41 } 42 return 0; 43 }
C:
求一遍gcd,答案就是gcd的因数个数。

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 = 4e5 + 10; 21 int a[maxn], n; 22 23 int main() { 24 scanf("%d", &n); 25 ll gcd = 1, k; scanf("%lld", &k); 26 gcd = k; 27 for (int i = 1; i < n; i++) { 28 ll x; scanf("%lld", &x); 29 gcd = __gcd(gcd, x); 30 } 31 if (gcd == 1) return puts("1"), 0; 32 int cnt = 0; 33 for (ll i = 1; i < sqrt(gcd); i++) 34 if (gcd % i == 0) cnt += 2; 35 ll tmp = sqrt(gcd); 36 if (tmp * tmp == gcd) cnt++; 37 printf("%d ", cnt); 38 return 0; 39 }
D:

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 string s, t; 21 22 int main() { 23 cin >> s >> t; 24 int len1 = s.size(), len2 = t.size(); 25 vector<int>pre(len2), suf(len2); 26 int cur = 0; 27 // pre存放从前往后扫时字符串t中的字母在字符串s中出现的位置 28 for (int i = 0; cur < len2; i++) 29 if (s[i] == t[cur]) 30 pre[cur++] = i; 31 // suf存放从后往前扫时字符串t中字母在字符串s中出现的位置 32 cur = len2; 33 for (int i = len1; i--;) { 34 if (s[i] == t[cur - 1]) 35 suf[--cur] = i; 36 } 37 // 这样得到的pre数组是字符串t中的每个字母在字符串s中最早出现的下标 38 // suf数组同理,得到的是最晚出现的下标 39 int ans = max(len1 - 1 - pre.back(), suf[0]); 40 for (int i = 0; i + 1 < len2; i++) 41 ans = max(ans, suf[i + 1] - pre[i] - 1); 42 printf("%d ", ans); 43 return 0; 44 }
E:
给定n个数,每个数x只能变成x-1,x+1或不变。问经过若干次变化后,最多能选出多少个不同的数。
贪心。排序后检查每个数并与一个值last进行比较。若x-1>last,则ans++,last=x-1。其余情况同理。

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, ans = 0; 21 vector<int>a; 22 23 int main() { 24 scanf("%d", &n); 25 for (int i = 1; i <= n; i++) { 26 int x; scanf("%d", &x); 27 a.pb(x); 28 } 29 sort(a.begin(), a.end()); 30 int last = 0; 31 for (auto i : a) { 32 if (i - 1 > last) ans++, last = i - 1; 33 else if (i - 1 == last) ans++, last = i; 34 else if (i == last) ans++, last = i + 1; 35 } 36 printf("%d ", ans); 37 return 0; 38 }
F: