AtCoder Beginner Contest 158 题解

传送门:https://atcoder.jp/contests/abc158

A

#include<bits/stdc++.h>
using namespace std;

int main(){
	string s; cin>>s;
	
	bool ok1=false, ok2=false;
	for(auto i: s) if(i=='A') ok1=true; else ok2=true;
	
	if(ok1&ok2) puts("Yes");
	else puts("No");
	return 0;
}

B

#include<bits/stdc++.h>
using namespace std;

#define int long long
signed main(){
	int n, a, b; cin>>n>>a>>b;
	int t=a+b;
	
	int res=0;
	res+=n/t*a;
	if(n%t>=a) res+=a;
	else res+=n%t;
	
	cout<<res<<endl;
	
	return 0;
}

C

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a, b; cin>>a>>b;
	
	int res;
	bool ok=false;
	for(int i=1; i<=2000; i++){
		if(floor((double)i*0.08)==a && floor((double)i*0.1)==b){
			ok=true;
			res=i;
			break;
		}
	}
	
	if(!ok) puts("-1");
	else cout<<res<<endl;
	
	return 0;
}

D

如果有翻转,那就打一个标记,然后操作 (2) 反向,否则操作 (2) 直接模拟即可。

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '
'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define pf(a) push_front(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;

inline void read(int &x) {
    int s=0;x=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
    x*=s;
}

deque<char> q;

int main(){
	string s; cin>>s;
	for(auto i: s) q.pb(i);
	
	int m; read(m);
	bool fl=false;
	while(m--){
		int op; read(op);
		if(op&1){
			fl^=1;
		}
		else{
			int t; read(t);
			char ch; cin>>ch;
			if(!fl){
				if(t&1) q.pf(ch);
				else q.pb(ch);
			}
			else{
				if(t&1) q.pb(ch);
				else q.pf(ch);
			}
		}
	}
	
	string res;
	while(q.size()) res+=q.front(), q.pop_front();
	
	if(fl) reverse(res.begin(), res.end());
	cout<<res<<endl;
	
    return 0;
}

E

核心:如果一个数是另一个数的后缀,即 (A=a_1a_2...a_i...a_n)(B = a_i...a_n)(Aequiv B ~~(mod~p))(p eq 2, 5)。那么我们有 (a_1a_2...a_{i-1}equiv0~~(mod~p))

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '
'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;

#define int long long

inline void read(int &x) {
    int s=0;x=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
    x*=s;
}

const int P=1e4+5;
int buc[P];

signed main(){
	int n, p; read(n), read(p);
	string s; cin>>s;
	s=' '+s;
	
	if(p==2 || p==5){
		int res=0;
		rep(i,1,n) if((s[i]-'0')%p==0) res+=i;
		cout<<res<<endl;
		return 0;
	}
	
	int t=0, bit=1;
	dwn(i,n,1){
		int v=(s[i]-'0')*bit%p; bit=bit*10%p;
		t=(v+t)%p;
		buc[t]++;
	}

	int res=buc[0]*(buc[0]+1)/2;
	rep(i,1,p-1) res+=buc[i]*(buc[i]-1)/2;
	cout<<res<<endl;
	
    return 0;
}

F

(f[i]) 表示第 (i) 个及之后的方案数,那么我们有 (f[i+1] + f[next]) ,其中 (next) 表示第 (i) 个机器人无法直接或者间接“够得着”的机器人编号。

那么我们倒着扫一遍,然后一边扫一边维护 (next) 即可,可以使用线段树。

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '
'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;

inline void read(int &x) {
    int s=0;x=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
    x*=s;
}

#define x first
#define y second

const int N=2e5+5, mod=998244353;

int n;
PII q[N];
int p[N];

int f[N];

struct node{
	int l, r;
	int v;
}tr[N<<2];

int ls(int u){return u<<1;}
int rs(int u){return u<<1|1;}

void pushup(int u){
	tr[u].v=max(tr[ls(u)].v, tr[rs(u)].v);
}

void build(int u, int l, int r){
	tr[u]={l, r};
	if(l==r) return;
	int mid=l+r>>1;
	build(ls(u), l, mid), build(rs(u), mid+1, r);
}

void update(int u, int p, int v){
	if(tr[u].l==tr[u].r) tr[u].v=v;
	else{
		int mid=tr[u].l+tr[u].r>>1;
		if(mid>=p) update(ls(u), p, v);
		else update(rs(u), p, v);
		pushup(u);
	}
}

int query(int u, int l, int r){
	if(tr[u].l>=l && tr[u].r<=r){
		return tr[u].v;
	}
	int mid=tr[u].l+tr[u].r>>1;
	int res=0;
	if(l<=mid) res=max(res, query(ls(u), l, r));
	if(mid<r) res=max(res, query(rs(u), l, r));
	return res;
}

int main(){
	read(n);
	rep(i,1,n){
		int x, y; read(x), read(y);
		q[i]={x, y};
	}
	
	sort(q+1, q+1+n);
	rep(i,1,n) p[i]=q[i].x;
	p[n+1]=INF;
	
	f[n+1]=1;
	build(1, 1, n);
	dwn(i,n,1){
		int nxt=lower_bound(p+i, p+n+1+1, q[i].x+q[i].y)-p;
		nxt=max(nxt, query(1, i+1, nxt-1)); 
		update(1, i, nxt);
		f[i]=(f[i+1]+f[nxt])%mod;
	}
	
	cout<<f[1]<<endl;
	
    return 0;
}
原文地址:https://www.cnblogs.com/Tenshi/p/14946085.html