AtCoder Beginner Contest 366
A - Election 2
思路
票数超过半数即为获胜,也可以将剩余票数都给少数者,若结果相同,则结束;
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n,a,b;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>a>>b;
n-=(a+b);
if((a>b&&a>b+n)||(b>a&&b>a+n))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
B - Vertical Writing
思路
以字符串的形式读入,并反转找到每一行输出的长度即可;
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 110, MAX = 1e9, INF = -1e9;
int n;
char s[N][N];
char c[N][N];
string S;
int a[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
memset(s,'*',sizeof(s));
cin>>n;
int lm=0;
for(int i=n;i>=1;i--){
cin>>S;
int l=S.size();
a[i]=l;
S=" "+S;
lm=max(lm,l);
for(int j=1;j<=l;j++){
s[i][j]=S[j];
}
}
for(int i=1;i<=lm;i++){
for(int j=1;j<=n;j++){
c[i][j]=s[j][i];
}
}
for(int i=1;i<=lm;i++){
for(int j=n;j>=1;j--){
if(c[i][j]!='*'){
a[i]=j;break;
}
}
}
for(int i=1;i<=lm;i++){
for(int j=1;j<=a[i];j++){
cout<<c[i][j];
}
cout<<endl;
}
return 0;
}
C - Balls and Bag Query
思路
用map储存,若数量低于1则删除,答案就是map目前的大小;
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
map<int,int> mp;
int q;
int x;
int p;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>q;
while(q--){
cin>>p;
if(p==1){
cin>>x;
mp[x]++;
}
else if(p==2){
cin>>x;
mp[x]--;
if(mp[x]<=0)mp.erase(x);
}
else cout<<mp.size()<<endl;
}
return 0;
}
D - Cuboid Sum Query
思路
三维前缀和,不难,画图推理即可(考察美术);
核心算式:
三维前缀和的初始化:
\(s[i][1][1]=s[i-1][1][1]+a[i][1][1]\);
\(s[1][i][1]=s[1][i-1][1]+a[1][i][1]\);
\(s[1][1][i]=s[1][1][i-1]+a[1][1][i]\);
三维前缀和的计算:
\(s[i][j][k]=s[i-1][j][k]+s[i][j-1][k]+s[i][j][k-1]-s[i-1][j-1][k]-s[i][j-1][k-1]-s[i-1][j][k-1]+s[i-1][j-1][k-1]+a[i][j][k]\);
三维前缀和的使用(\(x1-x2\),\(y1-y2\),\(z1-z2\)):
\(s[x2][y2][z2]-s[x1-1][y2][z2]-s[x2][y1-1][z2]-s[x2][y2][z1-1]+s[x1-1][y2][z1-1]+s[x2][y1-1][z1-1]+s[x1-1][y1-1][z2]-s[x1-1][y1-1][z1-1]\);
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int long long
#define pb push_back
#define bs bitset
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
typedef priority_queue<int> PQ;
const int N = 105, MAX = 1e9, INF = -1e9;
int n,q;
int a[N][N][N];
int s[N][N][N];
int lx1,lx2,ly1,ly2,lz1,lz2;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
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];
}
}
}
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++){
s[i][1][1]=s[i-1][1][1]+a[i][1][1];
s[1][i][1]=s[1][i-1][1]+a[1][i][1];
s[1][1][i]=s[1][1][i-1]+a[1][1][i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
s[i][j][k]=s[i-1][j][k]+s[i][j-1][k]+s[i][j][k-1]-s[i-1][j-1][k]-s[i][j-1][k-1]-s[i-1][j][k-1]+s[i-1][j-1][k-1]+a[i][j][k];
}
}
}
cin>>q;
while(q--){
cin>>lx1>>lx2>>ly1>>ly2>>lz1>>lz2;
cout<<s[lx2][ly2][lz2]-s[lx1-1][ly2][lz2]-s[lx2][ly1-1][lz2]-s[lx2][ly2][lz1-1]+s[lx1-1][ly2][lz1-1]+s[lx2][ly1-1][lz1-1]+s[lx1-1][ly1-1][lz2]-s[lx1-1][ly1-1][lz1-1]<<endl;
}
return 0;
}