Hatena::Grouptopcoder

IH19980412の日記

 | 

2013-04-24

Croc Champ 2013 - Round 2

05:56

とにかく二完を目標に。

A:

・最近ゲーム系多いなあ

・特に工夫はいらない?

・11,10,01の数でやればよさげ

書く。通った

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
int main(){
	int n;
	string a,b;
	cin >> n;
	cin >> a >> b;
	int r1=0,r2=0;
	int x=0,xy=0,y=0;
	for(int i=0;i<2*n;i++){
		if(a[i]=='0' && b[i]=='1') x++;
		if(a[i]=='1' && b[i]=='0') y++;
		if(a[i]=='1' && b[i]=='1') xy++;
		r1+=a[i]-'0';
		r2+=b[i]-'0';
	}
	int gen0=0,gen1=0;
	if(xy%2==0){
		gen0=gen1=xy/2;
		if(x>y){
			gen0+=(x-y+1)/2;
		}else{
			gen1+=(y-x)/2;
		}
	}
	else{
		gen0=xy/2+1;
		gen1=xy/2;
		if(x<y){
			gen1+=(y-x+1)/2;
		}else{
			gen0+=(x-y)/2;
		}
	}
	r1-=gen1;
	r2-=gen0;
	if(r1<r2){
		puts("Second");
	}else if(r1>r2){
		puts("First");
	}else{
		puts("Draw");
	}
}

B:

・縦+横<=11なのにN,M<=1000って...

・最大でもそんなに大きくならなそう

・全探索むずい><

・Cへ

C:

・(a+b+c)^3-a^3-b^3-c^3からa,b,cのあり得る場合の数か

・(a+b+c)^3-a^3-b^3-c^3=3(a+b)(a+c)(b+c)じゃん

・与えられた数を3で割って、その後X<=Y<=Z,X+Y>Z,X*Y*Z=(与えられた数/3)となるX,Y,Zを列挙か

書く。通る

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef pair<int,P> P1;
typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 2000000000
vector<long long>vec;
int main(){
	long long r;
	scanf("%lld",&r);
	if(r%3!=0){
		puts("0");
		return 0;
	}
	r/=3;
	for(long long i=1;i*i<=r;i++){
		if(r%i==0){
			vec.pb(i);
			if(i*i!=r){
				vec.pb(r/i);
			}
		}
	}
	sort(vec.begin(),vec.end());
	int ret=0;
	for(long long i=1;i*i*i<=r;i++){
		long long s;
		s=r/i;
		int F=lower_bound(vec.begin(),vec.end(),i)-vec.begin();
		for(int d=F;;d++){
			if(vec[d]*vec[d]>s){
				break;
			}
			if(s%vec[d]==0){
				long long a,b,c,D,e,f;
				a=i;
				b=vec[d];
				c=s/vec[d];
				if((a+b+c)%2==0 && a+b>c){
					D=(a+b+c)/2-a;
					e=(a+b+c)/2-b;
					f=(a+b+c)/2-c;
					if(D==f){
						ret++;
					}else if((D==e) || (e==f)){
						ret+=3;
					}else{
						ret+=6;
					}
				}
			}
		}
	}
	printf("%d\n",ret);
}

あとはすることがなかった><

systest 通る。

実はCでバグがあったんだけどなぜかとおってしまった(if(r%i==0){をいれていないので、本当は割り切れないパターンをカウントする恐れがあった)

rating 1936->2058(+122)

ここまで来ると赤くなってしまいたい(無理)

 |