Codeforces Beta Round #63 (Div. 2)
Codeforces Beta Round #63に参加しました。
解いた問題E,D,A(この順番)
A
def readints(): return map(int,raw_input().split()) def main(): n=input() tx=ty=tz=0 for i in xrange(n): x,y,z=readints() tx+=x ty+=y tz+=z #print tx,ty,tz if tx==ty==tz==0:print"YES" else:print"NO" pass main()
問題自体はとても簡単だった。問題文に無駄な装飾が多すぎる気がする。英語が苦手な人にとっては。
D
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define clr(a) memset(a,0,sizeof(a)) #define nclr(a) memset() #define dump(x) cerr << #x << " = " << (x) << endl; #define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl; using namespace std; static const double EPS = 1e-5; typedef long long ll; int dp[500][500][2]; int v[20][2]; int dd,sx,sy,n,d; int rec(int x,int y,int k){ //printf("called rec %d %d\n ",x,y); int ret=0; if((x-200)*(x-200)+(y-200)*(y-200)>d*d)return 1; if(dp[x][y][k]!=-1) return dp[x][y][k]; REP(i,n) if(rec(x+v[i][0], y+v[i][1],k)==0) ret = 1; if(k==0 && rec(y,x,1)==0) ret =1; dp[x][y][k]=ret; //printf("%d %d %d\n",x-200,y-200,ret); //debug(d*d); //debug(dd); return ret; } int main(){ scanf("%d %d %d %d",&sx,&sy,&n,&d); dd=d*d; REP(i,n) scanf("%d %d", &v[i][0], &v[i][1]); REP(i,500) REP(j,500) REP(k,2) dp[i][j][k]=-1; if(rec(sx+200,sy+200,1)==1)printf("Anton"); else printf("Dasha"); return 0; }
最初 int v[20][0]と書いてて、しばらく気付かずに酷い目にあった。最初ddの値が異常で全然原因が分からなかったが、int v[20][0]のせいで値漏れ(?)が発生してddの値がおかしくなってたようだ。あと、一方がreflectionをするともう一方はreflectionが出来なくなると勘違いして時間を食った。こんな英語だった。"Also each player can once per game symmetrically reflect a dot ---"。
E
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define clr(a) memset(a,0,sizeof(a)) #define nclr(a) memset() #define dump(x) cerr << #x << " = " << (x) << endl; #define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl; using namespace std; static const double EPS = 1e-5; typedef long long ll; int x[100050]; set<int> one; map<int,int> al; void pr(){ if(one.empty())printf("Nothing\n"); else printf("%d\n",*(--one.end())); } int main(){ int n,k; scanf("%d %d",&n,&k); REP(i,n)scanf("%d",x+i),al[x[i]]=0; REP(i,k){ al[x[i]]+=1; } REP(i,k) if(al[x[i]]==1) one.insert(x[i]); pr(); REP(i,n-k){ al[x[i+k]]+=1; al[x[i]]-=1; if(x[i+k]!=x[i]){ if(al[x[i]]==0)one.erase(one.find(x[i])); if(al[x[i]]==1)one.insert(x[i]); if(al[x[i+k]]==2)one.erase(one.find(x[i+k])); if(al[x[i+k]]==1)one.insert(x[i+k]); } pr(); } return 0; }
STLのsetが使えそうだと思ったけどmethod名をまだしっかり覚えてないので、リファレンスを見ながら解いた。もしかして、set,multisetがあればpriority_queueはあまり必要ないのかも。
B,C
Cは問題文長すぎだし、意味もよく分からなかった。Bも同じく。