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も同じく。