A
[link](https://atcoder.jp/contests/abc366/tasks/abc366_a]
判断一下少的那个人加上剩下的所有票是否会超过另一个人,如果超过,不确定,否则目前票多的必胜。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
signed main(){
int n,a,b;
cin >> n >> a >> b;
int s = n-a-b;
if(a < b){
if(a+s > b){
cout << "No";
}
else cout << "Yes";
}
else{
if(b+s > a){
cout << "No";
}
else cout << "Yes";
}
return 0;
}
B
link
我并没有看下面讲解只看了描述(竖线中的)
略一看样例便可知道,是一列一列从下往上输出,对于一列,如果这个位置有字符,输出,否则,如果后面(也就是上面)还有字符,输出一个*
,否则break
。
那么我们可以存一下每一列最靠后的字符(也就是最靠上的字符),如果超出了这个,就结束。
别忘了存一下最大长度。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s[105];
int w[105],mx;
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i){
cin >> s[i];
int sn = s[i].length();
if(sn > mx) mx = sn;
for(int j = 0;j < s[i].length();++ j)
w[j] = (w[j] == 0)?i:w[j];
}
for(int i = 0;i < mx;++ i){
for(int j = n;j >= 1&&j >= w[i];-- j){
int sn = s[j].length();
if(sn <= i) cout << '*';
else cout << s[j][i];
}
cout << endl;
}
return 0;
}
C
link
我觉得C<B
开一个桶,如果是一个新的,个数加一,如果减没了,个数减一。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int q;
int x,tp;
int bucket[1000005],sum;
signed main(){
cin >> q;
for(int i = 1;i <= q;++ i){
cin >> tp;
if(tp == 1){
cin >> x;
bucket[x]++;
if(bucket[x] == 1) sum++;
}
else if(tp == 2){
cin >> x;
bucket[x]--;
if(bucket[x] == 0) sum--;
}
else cout << sum << endl;
}
return 0;
}
D
link
三维前缀和。这里提供两种思考方式。
直接想三维前缀和
考虑类比二位前缀和的容斥原理,脑补一下,反正我没脑补出来图,奇加偶减(具体可以学习一下容斥原理),那么就有\(qzh_{i,j,k}=qzh_{i-1,j,k}+qzh_{i,j-1,k}+qzh_{i,j,k-1}-qzh_{i-1,j-1,k}-qzh_{i-1,j,k-1}-qzh_{i,j-1,k-1}+qzh_{i-1,j-1,k-1}+a_{i,j,k}\),查询也是类似的(详见代码)。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int n;
int q;
int a[105][105][105];
int qzh[105][105][105];
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i)
for(int j = 1;j <= n;++ j)
for(int k = 1;k <= n;++ k){
cin >> a[i][j][k];
qzh[i][j][k] = qzh[i-1][j][k]+qzh[i][j-1][k];
qzh[i][j][k] += qzh[i][j][k-1];
qzh[i][j][k] -= qzh[i-1][j-1][k];
qzh[i][j][k] -= qzh[i-1][j][k-1];
qzh[i][j][k] -= qzh[i][j-1][k-1];
qzh[i][j][k] += qzh[i-1][j-1][k-1]+a[i][j][k];
}
cin >> q;
while(q--){
int li,ri,lj,rj,lk,rk;
cin >> li >> ri >> lj >> rj >> lk >> rk;
int ans = qzh[ri][rj][rk];
ans -= qzh[li-1][rj][rk];
ans -= qzh[ri][lj-1][rk];
ans -= qzh[ri][rj][lk-1];
ans += qzh[li-1][lj-1][rk];
ans += qzh[li-1][rj][lk-1];
ans += qzh[ri][lj-1][lk-1];
ans -= qzh[li-1][lj-1][lk-1];
cout << ans << endl;
}
return 0;
}