传送门: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;
}