AtCoder Beginner Contest 158 題解
阿新 • • 發佈:2021-06-28
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 '\n' #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\) 且 \(A\equiv B ~~(mod~p)\) 且 \(p\neq 2, 5\)。那麼我們有 \(a_1a_2...a_{i-1}\equiv0~~(mod~p)\)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#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 '\n'
#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;
}