打完省赛回来写了总结,有点累,就没想着打这场了 (竟然有wxh出题,wxh天下第一 !)
题目链接:https://codeforces.com/contest/1159
A:
非常弱智的一道题,像单调栈一样处理就完事了。
1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 int n, cnt = 0; 41 string s; 42 43 int main() 44 { 45 cin >> n >> s; 46 for (auto i : s) 47 if (i == '+') cnt++; 48 else if (cnt) cnt--; 49 if (cnt <= 0) puts("0"); else printf("%d ", cnt); 50 return 0; 51 }
B:
题目说什么K-expansion根本不需要看懂,有不等式就够了。
看似要O(n^2)其实根本不需要,把abs(i-j)移项并拆开之后发现这题其实就是要求最小的a[i]/abs(i-j),显然j是1和n二选一,于是变成a[i]/max(n-i,i-1)。时间复杂度O(n),正确性显然。
1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 const int maxn = 3e5 + 10; 41 int n, x, ans = int_inf; 42 43 int main() 44 { 45 scanf("%d", &n); 46 rep1(i, 1, n) 47 { 48 scanf("%d", &x); 49 ans = min(ans, x / max(n - i, i - 1)); 50 } 51 printf("%d ", ans); 52 return 0; 53 }
C:
有n个男生和m个女生。对于任意一对男女生,男生有可能送任意多的礼物给女生(也可能不送)。定义a[i][j]为第i个男生送给第j个女生礼物的数量。
给定n个数,b[i]=min(a[i][1]……a[i][m]);给定m个数,c[i]=max(a[1][i]……a[n][i])。问所有男生最少送了多少礼物,无解输出-1。
读完题就知道这很显然是个贪心。-1的情况很明显:如果max(b[i])>min(c[i]),不可能存在这种情况,必然无解。
而且很显然,答案必定是sum(c[i])再加些什么东西上去。为了要ans最小,当然是加上(sum(b[i])-max(b[i]))*m:所有的女生除了收到最多的礼物之外,还收到了剩下(n-1)个男生送出的最少分量的礼物。
问题来了,如果max(b[i])==min(c[i]),上面的答案不会有问题。如果max(b[i])<min(c[i])呢?ans+=最大b[i]-次大b[i],补上去就完事了。
1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 int n, m; 41 ll firLar = 0, secLar = 0, ans, minn = ll_inf, sum1 = 0, sum2 = 0; 42 43 int main() 44 { 45 scanf("%d%d", &n, &m); 46 rep1(i, 1, n) 47 { 48 ll x; scanf("%lld", &x); 49 if (firLar <= x) 50 { 51 secLar = firLar; 52 firLar = x; 53 } 54 else if (secLar <= x) secLar = x; 55 sum1 += x; 56 } 57 rep1(i, 1, m) 58 { 59 ll x; scanf("%d", &x); 60 minn = min(minn, x); 61 sum2 += x; 62 } 63 if (firLar > minn) return puts("-1"), 0; 64 ans = sum2 + (sum1 - firLar) * m; 65 printf("%lld ", (firLar < minn) ? ans + firLar - secLar : ans); 66 return 0; 67 }
D:
定义unique string t是在原字符串s里只出现过一次的子串t,这里说的子串要连续。原字符串s只包含0和1两个数字。
现在题目给定s串和t串的长度,要求构造合法的s串,使得它最短的unique string长度恰好为k。
非常有趣的一道题目。Description后面谈到的(n mod 2)=(k mod 2),n和k奇偶性相同,仿佛在暗示什么,但我就是猜不出正确做法。感觉肯定有种奇怪的构造方式能符合题意。
看完题解发现果然如此。由于还没有英文题解,只知其然而不知其所以然(后面的毛子文看不懂……)。
令a=(n-k)/2,由于题目说了n、k奇偶性相同,易知a必然是一个整数。答案的构造方法是:先输出a个0,再输出一个1,循环a+1遍上述操作。
不过tutorial下面有神仙说这题根本不难,打表就容易发现构造方法了(problem tags里的brute force强烈暗示打表)。也许对于不同的n只有一种可行解?
这题的std可怕地短。
1 /* basic header */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <cstdint> 9 #include <climits> 10 #include <float.h> 11 /* STL */ 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <queue> 16 #include <stack> 17 #include <algorithm> 18 #include <array> 19 #include <iterator> 20 /* define */ 21 #define ll long long 22 #define dou double 23 #define pb emplace_back 24 #define mp make_pair 25 #define fir first 26 #define sec second 27 #define sot(a,b) sort(a+1,a+1+b) 28 #define rep1(i,a,b) for(int i=a;i<=b;++i) 29 #define rep0(i,a,b) for(int i=a;i<b;++i) 30 #define repa(i,a) for(auto &i:a) 31 #define eps 1e-8 32 #define int_inf 0x3f3f3f3f 33 #define ll_inf 0x7f7f7f7f7f7f7f7f 34 #define lson curPos<<1 35 #define rson curPos<<1|1 36 /* namespace */ 37 using namespace std; 38 /* header end */ 39 40 int n, k, delta; 41 42 //服了 43 int main() 44 { 45 scanf("%d%d", &n, &k); delta = (n - k) / 2 + 1; 46 rep1(i, 1, n) printf("%d", i % delta == 0); 47 puts(""); 48 return 0; 49 }
E && F:
神仙题,再见。