• 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;
    }
    
  • 相关阅读:
    Hosts文件的使用
    【java】关于时间
    【java】定时器
    log4j2的使用
    【springMVC】简单的前后端数据交流
    springMVC简单示例
    442. Find All Duplicates in an Array
    448. Find All Numbers Disappeared in an Array Add to List
    xml scheme 示例解析
    《C#高效编程》读书笔记04-使用Conditional特性而不是#if条件编译
  • 原文地址:https://www.cnblogs.com/Tenshi/p/14946085.html
Copyright © 2020-2023  润新知