Particle

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

Croc Champ 2012 - Qualification Round

A.
前から数える。本番ではstring s[3000]としてRE

#include <iostream>
#include <string>
using namespace std;

string s[30000];

int main(){
    int n,ans = 0;
    cin>>n;
    for(int i = 0; i < n; i++)cin>>s[i];
    int f = 1;
    for(int i = 0,l = s[0].size(); i < l && f; i++){
        char c = s[0][i];
        for(int j = 1; j < n; j++){
            if(c!=s[j][i]){
                f = 0;
                break;
            }
            if(j==n-1)ans++;
        }
    }
    
    cout<<ans<<endl;
    
    return 0;
}

B.
r_nとして考えられる数字は高々10000通りなので、10000回回してから周期を調べる。

#include <iostream>
using namespace std;


int main(){
	int a,b,m,r,ans = 1;
	cin>>a>>b>>m>>r;
	
	for(int i = 0; i < 10000; i++)r = (a*r+b)%m;
	
	int initial = r;
	while(initial != (r = (a*r+b)%m))ans++;
	
	cout<<ans<<endl;
	
	return 0;
}

C.
実装するだけ。本番ではAと同じく1桁間違えてWA

#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;

int t[100000],res[100000],n,m;
pair<int,int> x[100000];

int main(){
    scanf("%d%d",&n,&m);
    for(int i = 0; i < n; i++){
        scanf("%d%d",t+i,&x[i].first);
        x[i].second = i;
    }
    
    int time = 0,pos = 0;
    for(int i = 0; i < n; i+=m){
        int b = i+m>n?n:i+m;
        time = max(time,t[b-1]);
        sort(x+i,x+b);
        
        int a1,a2;
        a1 = i,a2 = i;
        while(a2 < b && x[a1].first == x[a2].first)a2++;
        
        while(a1!=a2){
            time += x[a1].first - pos;
            for(int j = a1; j < a2; j++){
                res[x[j].second] = time;
            }
            pos = x[a1].first;
            time += 1+(a2-a1)/2;
            a1 = a2;
            while(a2 < b && x[a1].first == x[a2].first)a2++;
        }
        time += x[b-1].first;
        pos = 0;
    }
    
    printf("%d",res[0]);
    for(int i = 1; i < n; i++){
        printf(" %d",res[i]);
    }
    puts("");
    return 0;
}

D.
前計算するだけ。ζ(2) = (π^2)/6 ≒ 1.7なので、前計算も足し算も大体O(n)となります。

#include<iostream>
typedef long long ll;
using namespace std;

int d[10000001];

int main(){
	for(int i = 2; i*i <= 10000000; i++){
		for(int j = 1; j*i*i <= 10000000; j++){
			d[j*i*i] = j;
		}
	}
	ll ans = 0;
	int a,n;
	cin>>a>>n;
	for(int i = 0; i < n; i++){
		ans += d[a+i]?d[a+i]:a+i;
	}
	cout<<ans<<endl;
	return 0;
}

E.
読んだ