本来可以很欢乐的,结果由于参与人数众多,服务器过于土豆,硬是把手速场变成网速场。难度cf div3左右。
赛后中了抽奖23333然而只能选T恤,不能选日系短裙,不然就送hry裙子好了 (此处呲牙笑
大模拟我就不补了,该歇了(
题目链接:https://cometoj.com/contest/42
A:
求1+2+...+n+(n-1)+...+1,答案就是n^2。
太水,代码就不贴了。记得开long long即可。
B:
给n个数(n<=14),问最多选出多少个数,使得两两互质。
因为n非常小,二进制枚举,O(n^2)验证秒杀。

1 1 /* basic header */ 2 2 #include <bits/stdc++.h> 3 3 /* define */ 4 4 #define ll long long 5 5 #define dou double 6 6 #define pb emplace_back 7 7 #define mp make_pair 8 8 #define sot(a,b) sort(a+1,a+1+b) 9 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 1010 #define rep0(i,a,b) for(int i=a;i<b;++i) 1111 #define eps 1e-8 1212 #define int_inf 0x3f3f3f3f 1313 #define ll_inf 0x7f7f7f7f7f7f7f7f 1414 #define lson curPos<<1 1515 #define rson curPos<<1|1 1616 /* namespace */ 1717 using namespace std; 1818 /* header end */ 1919 2020 const int maxn = 15; 2121 int t, a[maxn]; 2222 2323 int check(set<int> &s) { 2424 int b[maxn],p=0; 2525 for (auto i:s) b[++p]=i; 2626 for (int i=1;i<=p;i++) 2727 for (int j=i+1;j<=p;j++) 2828 if (__gcd(b[i],b[j])>1) return 0; 2929 return 1; 3030 } 3131 3232 int main() { 3333 cin >> t; 3434 while (t--) { 3535 int n, ans = 1; 3636 cin >> n; 3737 rep1(i, 1, n) cin >> a[i]; 3838 for (int cnt = 1; cnt < (1 << n); cnt++) { 3939 int tmp = cnt; 4040 set<int>s; s.clear(); 4141 rep1(i, 1, n) { 4242 if (tmp & 1) s.insert(a[i]); 4343 tmp >>= 1; 4444 } 4545 if (check(s)) ans = max(ans, (int)s.size()); 4646 } 4747 cout << ans << endl; 4848 } 4949 return 0; 5050 }
View Code
C:
给定字符串s,t,问t是否为s刚好删去两个字符的结果。
注意s为两个字符的情况就好了(也就是t为空串)。

1 1 /* basic header */ 2 2 #include <bits/stdc++.h> 3 3 /* define */ 4 4 #define ll long long 5 5 #define dou double 6 6 #define pb emplace_back 7 7 #define mp make_pair 8 8 #define sot(a,b) sort(a+1,a+1+b) 9 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 1010 #define rep0(i,a,b) for(int i=a;i<b;++i) 1111 #define eps 1e-8 1212 #define int_inf 0x3f3f3f3f 1313 #define ll_inf 0x7f7f7f7f7f7f7f7f 1414 #define lson curPos<<1 1515 #define rson curPos<<1|1 1616 /* namespace */ 1717 using namespace std; 1818 /* header end */ 1919 2020 int main() { 2121 int t; cin >> t; cin.get(); 2222 while (t--) { 2323 // string s, t; cin >> s >> t; 2424 string s, t; 2525 getline(cin, s); 2626 getline(cin, t); 2727 int len1 = s.size(), len2 = t.size(), cnt = 0; 2828 if (len1 - len2 != 2) { 2929 puts("0"); continue; 3030 } 3131 if (len2 == 0 && len1 == 2) { 3232 puts("1"); continue; 3333 } 3434 for (int p1 = 0, p2 = 0; p1 < len1; p1++) { 3535 if (p2>=len2 || s[p1] != t[p2]) { 3636 cnt++; 3737 } else ++p2; 3838 } 3939 if (cnt != 2) puts("0"); else puts("1"); 4040 } 4141 return 0; 4242 }
View Code
D:
给定18个数字,数字的范围是[0,13],数字可能重复但重复度不超过4。对于每个重复的数字可以做如下操作(只能对[1,13]之间的数字操作):若该数字重复度为2或4,则可以把该数字全部删去;若该数字重复度为3,则可以删去两个该数字。问最后最少剩下多少数字。
没什么可说的,模拟就完事了。

1 1 /* basic header */ 2 2 #include <bits/stdc++.h> 3 3 /* define */ 4 4 #define ll long long 5 5 #define dou double 6 6 #define pb emplace_back 7 7 #define mp make_pair 8 8 #define sot(a,b) sort(a+1,a+1+b) 9 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 1010 #define rep0(i,a,b) for(int i=a;i<b;++i) 1111 #define eps 1e-8 1212 #define int_inf 0x3f3f3f3f 1313 #define ll_inf 0x7f7f7f7f7f7f7f7f 1414 #define lson curPos<<1 1515 #define rson curPos<<1|1 1616 /* namespace */ 1717 using namespace std; 1818 /* header end */ 1919 2020 const int maxn = 20; 2121 int a[maxn]; 2222 2323 int main() { 2424 rep0(i, 0, maxn) a[i] = 0; 2525 rep1(i, 1, 18) { 2626 int x; cin >> x; 2727 a[x]++; 2828 } 2929 rep0(i, 1, maxn) { 3030 if (a[i] == 2 || a[i] == 4) a[i] = 0; 3131 if (a[i] == 3) a[i] -= 2; 3232 } 3333 int ans = 0; 3434 rep0(i, 0, maxn) ans += a[i]; 3535 cout << ans << endl; 3636 return 0; 3737 }
View Code
E:
给定一个n*n的迷宫,迷宫里的格子只有路和墙。给定起点和终点,起点下方必定有墙。规定要用右手贴着地图中起点下方的墙壁一直沿着墙壁往前走(保证能走到终点)。要求把路程中右手贴的每一面墙在地图里的方向记录下来并按顺序输出。地图是不会旋转的。
很无聊的大模拟……
F:
给定一个n*m的矩阵,每个2*2子矩阵可以种一棵树,接下来给定q次变化,每次变化会ban掉一个格子。含有被ban掉的格子的子矩阵不可以种树。对于每次给定的变化,给出当前矩阵最多可以种多少棵树。
这很明显是个数学题。对于一个被ban掉的格子,它可以影响二、三、四个子矩阵。计算初始矩阵最多种多少棵树,然后对于每次查询计算影响即可。
(然而我那晚读错题了,以为是对于每次查询,给出当前状态的矩阵最多可以种多少棵树,题目一下子变得很烦

1 1 /* basic header */ 2 2 #include <bits/stdc++.h> 3 3 /* define */ 4 4 #define ll long long 5 5 #define dou double 6 6 #define pb emplace_back 7 7 #define mp make_pair 8 8 #define sot(a,b) sort(a+1,a+1+b) 9 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 1010 #define rep0(i,a,b) for(int i=a;i<b;++i) 1111 #define eps 1e-8 1212 #define int_inf 0x3f3f3f3f 1313 #define ll_inf 0x7f7f7f7f7f7f7f7f 1414 #define lson curPos<<1 1515 #define rson curPos<<1|1 1616 /* namespace */ 1717 using namespace std; 1818 /* header end */ 1919 2020 const int maxn = 1e3 + 10; 2121 int n, m, q, a[maxn][maxn], curr = 0; 2222 2323 int main() { 2424 cin >> n >> m >> q; 2525 rep0(i, 1, n) { 2626 rep0(j, 1, m) { 2727 a[i][j] = 1; 2828 curr++; 2929 } 3030 } 3131 while (q--) { 3232 int x, y; cin >> x >> y; 3333 rep0(i, 0, 2) { 3434 rep0(j, 0, 2) { 3535 if (a[x - i][y - j]) a[x - i][y - j] = 0, curr--; 3636 } 3737 } 3838 printf("%d\n", curr); 3939 } 4040 return 0; 4141 }
View Code
G:
黑白棋相关的题目。又是个大模拟。
H:
有个皮球从高处掉落,根据物理知识,它会弹起。现在按照时间顺序给定n个球的不同高度(>0),问球至少落地几次。
贪心。不妨设球一开始向下运动,每读入一个新的高度,判断球是否必须转向才可达到新的高度。
无论是问至少还是至多,这题都很好做。

1 1 /* basic header */ 2 2 #include <bits/stdc++.h> 3 3 /* define */ 4 4 #define ll long long 5 5 #define dou double 6 6 #define pb emplace_back 7 7 #define mp make_pair 8 8 #define sot(a,b) sort(a+1,a+1+b) 9 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 1010 #define rep0(i,a,b) for(int i=a;i<b;++i) 1111 #define eps 1e-8 1212 #define int_inf 0x3f3f3f3f 1313 #define ll_inf 0x7f7f7f7f7f7f7f7f 1414 #define lson curpos<<1 1515 #define rson curpos<<1|1 1616 /* namespace */ 1717 using namespace std; 1818 /* header end */ 1919 2020 int last = int_inf, dire = 1, n, ans = 0; //1 is down and 0 is up 2121 2222 int main() { 2323 cin >> n; 2424 while (n--) { 2525 int x; cin >> x; 2626 if (dire) { 2727 if (x >= last) { 2828 dire = 0; 2929 ans++; 3030 } 3131 } else if (x <= last) 3232 dire = 1; 3333 last = x; 3434 } 3535 printf("%d\n", ans); 3636 return 0; 3737 }
View Code