Particle

競技プログラミングについての雑記

CodeForces #101 (Div. 2)

問題Aはhttp://codeforces.com/problemset/problem/141/A


A.
文字を数えて、同じかどうか判定すればよい

int memo[26];
string a,b,c;
int r;

int main(){
        cin>>a>>b>>c;
        for(int i=0;i<a.size();i++){
                memo[a[i]-'A']++;
        }
        for(int i=0;i<b.size();i++){
                memo[b[i]-'A']++;
        }
        for(int i=0;i<c.size();i++){
                memo[c[i]-'A']--;
        }
        for(int i=0;i<26;i++){
                if(memo[i]) r++;
        }
        if(r){
                cout<<"NO"<<endl;
        }
        else {
                cout<<"YES"<<endl;
        }
        return 0;
}

B.
実装すればよい。これよりシンプルに書ける。

long a,x,y;

int main(){
        cin>>a>>x>>y;
        if(y<=0){
                cout<<-1<<endl;
                return 0;
        }
        if(0<y&&y<a){
                if(-a<2*x&&2*x<a){
                        cout<<1<<endl;
                }else{
                        cout<<-1<<endl;
                }
                return 0;
        }
        y-=a;
        int b=2*a;
        int my=y%b;
        int dy=y/b;
        if(0<my&&my<a){
                if(-a<2*x&&2*x<a){
                        cout<<2+3*dy<<endl;
                }else{
                        cout<<-1<<endl;
                }
        }else if(a<my&&my<b){
                if(-a<x&&x<0){
                        cout<<3+3*dy<<endl;
                }else if(0<x&&x<a){
                        cout<<4+3*dy<<endl;
                }else{
                        cout<<-1<<endl;
                }
        }else{
                cout<<-1<<endl;
        }
        return 0;
        
}

C.
背の高さの順番を決めてから、背の高い方から並び順を入れ替えていく。挿入ソートしてるみたいだけど、用語とかは分かりません。

int n,m[3000],s[3000];


int main(){
        cin>>n;
        
        vector<pair<int,string> > p(n);
        for(int i=0;i<n;i++){
                cin>>p[i].second>>p[i].first;
                s[i]=m[i]=i;
        }
        sort(p.begin(),p.end(),greater<pair<int,string> >());
        for(int i=n-1;i>=0;i--){
                if(p[i].first+i>=n){
                        cout<<-1<<endl;
                        return 0;
                }
                for(int j=0;j<p[i].first;j++){
                        swap(m[i+j],m[i+j+1]);
                }
        }
        for(int i=0;i<n;i++){
                cout<<p[m[i]].second<<' '<<s[m[i]] + 100<<endl;
        }
        return 0;
}

D.
ダイクストラ法の問題らしいけど、問題を理解できてない。練習になりそうだから、後で解きたい

E.
最小全域木らしいけど、最小全域木がほとんど分からない。あと問題を理解できてない。
割と良く出るらしいから、早いうちに解けるようになりたい。