《Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)》
A:水题:
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<LL,int> pii; const int N = 2e5+5; const int M = 1e6+5; const LL Mod = 998244353; #define pi acos(-1) #define INF 1e18 #define CT0 cin.tie(0),cout.tie(0) #define IO ios::sync_with_stdio(false) #define dbg(ax) cout << "now this num is " << ax << endl; namespace FASTIO{ inline LL read(){ LL x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } } using namespace FASTIO; int main() { int ca;ca = read(); while(ca--) { int n;n = read(); for(int i = 4 * n,j = 1;j <= n;i -= 2,++j) printf("%d%c",i,j == n ? '\n' : ' '); } return 0; }
B:贪心即可
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<LL,int> pii; const int N = 1e5+5; const int M = 1e6+5; const LL Mod = 998244353; #define pi acos(-1) #define INF 1e18 #define CT0 cin.tie(0),cout.tie(0) #define IO ios::sync_with_stdio(false) #define dbg(ax) cout << "now this num is " << ax << endl; namespace FASTIO{ inline LL read(){ LL x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } } using namespace FASTIO; int main() { int ca;ca = read(); while(ca--) { int a,b;a = read(),b = read(); string s;cin >> s; int n = s.size(); int f = 0,ans = 0,ma = 0; for(int i = 0;i < n;++i){ if(s[i] == '1') { if(f == 0) { if(ans != 0 && b * ma < a) ans += b * ma; else ans += a; } ma = 0,f = 1; } else ma++,f = 0; } printf("%d\n",ans); } return 0; }
C:堆维护
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<LL,int> pii; const int N = 2e5+5; const int M = 1e6+5; const LL Mod = 998244353; #define pi acos(-1) #define INF 1e18 #define CT0 cin.tie(0),cout.tie(0) #define IO ios::sync_with_stdio(false) #define dbg(ax) cout << "now this num is " << ax << endl; namespace FASTIO{ inline LL read(){ LL x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } } using namespace FASTIO; struct Node{ LL x;int id; bool operator < (const Node a)const{ return x < a.x; } }; LL b[N]; int main() { int ca;ca = read(); while(ca--) { int n;n = read(); priority_queue<Node> Q; LL sum = 0; for(int i = 1;i <= n;++i){ int x;x = read(); Q.push(Node{x,i}); } for(int i = 1;i <= n;++i) b[i] = read(); while(!Q.empty()){ Node a = Q.top(); if(sum + b[a.id] <= a.x) sum += b[a.id],Q.pop(); else break; } LL ans = 0; if(!Q.empty()) ans = Q.top().x; ans = max(ans,sum); printf("%lld\n",ans); } return 0; }
D:没想到这个看起来简单的题能卡我这么久。
主要的思路就是从左边开始删,然后不够的代价从右边补,然后看中间是否某个值 < 0。
亿点细节:一开始是used取最大值,仔细思考之后used应该是叠加的,因为我们每次都让a[i] - used.。
然后我们每次减去之后显然前面的都是前面的区间里的最小值了,所以我们比较的时候应该去比较和最小值的差距。
主要是这里一开始比的都不是和最小值的差距。
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<LL,int> pii; const int N = 2e5+5; const int M = 1e6+5; const LL Mod = 998244353; #define pi acos(-1) #define INF 1e18 #define CT0 cin.tie(0),cout.tie(0) #define IO ios::sync_with_stdio(false) #define dbg(ax) cout << "now this num is " << ax << endl; namespace FASTIO{ inline LL read(){ LL x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } } using namespace FASTIO; int a[N]; int main() { int ca;ca = read(); while(ca--) { int n;n = read(); for(int i = 1;i <= n;++i) a[i] = read(); int f = 0,used = 0,pre = a[1]; for(int i = 1;i <= n;++i){ a[i] -= used; if(a[i] < 0){f = 1;break;} if(a[i] > pre) used += a[i] - pre; pre = min(pre,a[i]); } printf("%s\n",f ? "NO" : "YES"); } system("pause"); return 0; }
E:待补
F:题意是问使答案等于B序列的方案数,一开始没读对。
思路:因为是有顺序的,对于i位置,显然可以删去左边的和删去右边的来得到,这样就有两种可能即方案数 * 2。
然后如果两边只有一边可以删,那就方案数 * 1。
如果两边都要不能删,那就说明不存在满足的方案。
对于能删的情况,我们在遍历中更新即可。
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 2e5+5; const int M = 1e6+5; const LL Mod = 998244353; #define pi acos(-1) #define INF 1e18 #define CT0 cin.tie(0),cout.tie(0) #define IO ios::sync_with_stdio(false) #define dbg(ax) cout << "now this num is " << ax << endl; namespace FASTIO{ inline int read() { int x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-')f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();} return x * f; } } using namespace FASTIO; int a[N],b[N],pos[N]; bool vis[N]; int main() { int ca;ca = read(); while(ca--) { memset(vis,0,sizeof(vis)); int n,k;n = read(),k = read(); for(int i = 1;i <= n;++i) a[i] = read(),pos[a[i]] = i; for(int i = 1;i <= k;++i) b[i] = read(),vis[pos[b[i]]] = 1; vis[0] = 1,vis[n + 1] = 1; LL ans = 1; for(int i = 1;i <= k;++i) { int ma = pos[b[i]]; if(vis[ma - 1] == 0 && vis[ma + 1] == 0) ans = ans * 2 % Mod; else if(vis[ma - 1] == 0 || vis[ma + 1] == 0) ans = ans * 1; else{ans = 0;break;} vis[ma] = 0; } printf("%lld\n",ans); } system("pause"); return 0; }