首页 > 其他分享 >ABC366

ABC366

时间:2024-08-10 21:49:33浏览次数:12  
标签:int lj cin qzh ans ABC366 105

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;
	
}
### 考虑分层

标签:int,lj,cin,qzh,ans,ABC366,105
From: https://www.cnblogs.com/wmmdbk/p/18352831

相关文章