AtCoder Beginner Contest 158(已AK)

A Station and Bus

傳送門
陳述題

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
string s;
int main()
{
    cin>>s;
    if(s!="AAA"&&s!="BBB")cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

B Count Balls
傳送門
陳述題

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
ll n,a,b;
int main()
{
    cin>>n>>a>>b;
    if(a+b==0)cout<<0<<endl;
    ll ans=n/(a+b)*a+min(n%(a+b),a);
    cout<<ans<<endl;
    return 0;
}

C Tax Increase
傳送門
先算出max(ceil(a/0.08),ceil(b/0.1)),再看這個數能回去否?

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
int a,b;
int main()
{
    cin>>a>>b;
    int t1=ceil(a*1.0/0.08),t2=ceil(b*1.0/0.1);
    int t=max(t1,t2);
    int a1=floor(t*0.08),a2=floor(t*0.1);
    if(a1==a&&a2==b)pf(t);
    else pf(-1);
    return 0;
}

D String Formation
傳送門
dequedeque再加個反轉標記實現

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
deque<char>q;
string s;
int qq,com,f;
char c;
int main()
{
    cin>>s>>qq;
    rep(i,0,s.size()-1)q.push_back(s[i]);
    bool flag=true;
    rep(i,1,qq){
        cin>>com;
        if(com==1)flag=!flag;
        else{
            cin>>f>>c;
            if(flag){
                if(f==1)q.push_front(c);
                else q.push_back(c);
            }else{
                if(f==2)q.push_front(c);
                else q.push_back(c);
            }
        }
    }
    if(flag){
        while(!q.empty()){
            cout<<q.front();
            q.pop_front();
        }
    }else{
        while(!q.empty()){
            cout<<q.back();
            q.pop_back();
        }
    }
    return 0;
}

E Divisible Substring
傳送門
必須明白取餘證明
那麼天大的數我們也能知道這個數是不是能整除pp
如果枚舉的話O(n2)O(n^2)肯定不行的
那麼考慮從後往前算餘數,並且記錄餘數出現的個數,比如算到第ii位,此時餘數爲11,但是先前有餘數爲11的個數爲22,那麼也就是說我們可以直接從第ii位到那兩個貢獻前面的位置作爲一個子字符串,因爲此時前面正好能整除pp,從數學方面考慮下,(10na+b)%mod=1(10^n*a+b)\%mod=1,因爲b%mod=1b\%mod=1,又因爲1010pp互質,那麼必然a%mod=0a\%mod=0,非常巧妙的方法,但是素數還要格外考慮一下2255,因爲1010與之不互質,這兩個數都有個特點就是最後一位都和這兩個取模爲00,也就是從前往後考慮,直接累加當前第幾位,也就是幾種選擇。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e4+5;
int n,p,cnt[N];
string s;
int main()
{
    cin>>n>>p>>s;
    int size=s.size();
    ll ans=0;
    if(p==2||p==5)rep(i,0,size-1){if((s[i]-'0')%p==0)ans+=i+1;}
    else{
        ll base=1,now=0;
        cnt[0]=1;
        per(i,size-1,0){
            now=(((s[i]-'0')*base)%p+now)%p;
            base=(base*10)%p;
            ans+=cnt[now];++cnt[now];
        }
    }
    cout<<ans<<endl;
    return 0;
}

F Removing Robots
傳送門
這個題我的做法可能有點繁瑣,首先肯定要按起始座標軸排序,然後考慮dp[i]dp[i]表示最後集合中第ii個機器人爲最後一個的集合個數,其中dp[0]dp[0]表示爲空集,那麼如果每個機器人沒有DD這個範圍,那麼就從左往右考慮,dp[i]=dp[i]+dp[0j]dp[i]=dp[i]+dp[0\sim j],也就是到了第ii位,把這個機器人放到前面那些集合的尾部即可,但是每個機器人此時有DD的範圍,那麼什麼情況下會讓部分集合不存在呢?考慮前面有的機器人激活後的範圍已經觸及到xix_i了,那麼這個機器人前面的那些集合必然不行,再加強一下,也就是說找到每個機器人左邊第一個範圍觸及到他的起始座標的,然後把找到的這個機器人前邊的dpdp前綴和減去就是答案。可以看出最後需要維護出每個機器人左邊第一個能觸及到他的機器人,這塊可以用個優先隊列處理下(詳見代碼),之後當算出一個dp[i]dp[i]後,對於ii後面所有dpdp都要加上這個值,那麼用差分數組幫助實現,再維護一個dpdp的前綴和數組sumsum用來減去對應的值即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=2e5+5;
const int P=998244353;
pii robs[N];
int n,cop[N],ner[N];
ll dp[N],sum[N],bb[N];
struct eff{
    int l,r,id;
    bool operator < (const eff a)const{
        return id<a.id;
    }
};
priority_queue<eff>q;
int findd(int x){return upper_bound(cop+1,cop+n+2,x)-cop;}
int main()
{
    sc(n);
    rep(i,1,n)sc2(robs[i].fi,robs[i].se);
    sort(robs+1,robs+n+1);
    rep(i,1,n)cop[i]=robs[i].fi;
    cop[n+1]=inf;
    rep(i,1,n){
        while(!q.empty()){
            auto u=q.top();
            if(i>u.r)q.pop();
            else if(i>=u.l&&i<=u.r&&!ner[i]){
                ner[i]=u.id;
                break;
            }else break;
        }
        int nx=robs[i].fi+robs[i].se-1,pos=findd(nx);
        q.push({i+1,pos-1,i});
    }
    bb[1]++;sum[0]=1;dp[0]=1;
    rep(i,1,n){
        bb[i]=(bb[i]+bb[i-1])%P;
        dp[i]=(dp[i]+bb[i])%P;
        if(ner[i]>0)dp[i]=((dp[i]-sum[ner[i]-1])%P+P)%P;
        bb[i+1]=(bb[i+1]+dp[i])%P;
        sum[i]=(dp[i]+sum[i-1])%P;
        //cout<<dp[i]<<" "<<sum[i]<<endl;
    }
    cout<<sum[n]<<endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章