読者です 読者をやめる 読者になる 読者になる

beet's soil

競プロのことなど

Codeforces Round #400 (Div. 1 + Div. 2, combined)

遅延+鯖落ち+延長 これぞCodeforces(いいえ

【A. A Serial Killer】

がんばりましょう。
*(set.begin()+1)でバグって??ってなった。
前はできた気がするんだけど…

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
  set<string> ss;
  string a,b;
  cin>>a>>b;
  ss.insert(a);ss.insert(b);
  cout<<a<<" "<<b<<endl;
  int n;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>a>>b;
    ss.erase(a);
    cout<<*ss.begin()<<" "<<b<<endl;
    ss.insert(b);
  }
  return 0;
}
【B. Sherlock and his girlfriend】

誤読して1WA。
素数判定やるだけなわけないでしょwと思ったらやるだけだった。
篩したけどO(NsqrtN)の愚直でも通りそう。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
  int n;
  cin>>n;
  int c[n],ans=0;
  memset(c,0,sizeof(c));
  for(int i=0;i<n;i++){
    c[i]++;
    ans=max(ans,c[i]);
    if(c[i]==1) for(int j=i;j<n;j+=i+2) c[j]=max(c[j],c[i]);
  }
  cout<<ans<<endl;
  for(int i=0;i<n;i++) cout<<c[i]<<" \n"[i==n-1];
  return 0;
}
【C. Molly's Chemicals】

k^m<=10^14になるmはO(log(NA))個しかないので、
mapに累積和をぶち込んでおいて全部決めうちするとO(Nlog(NA))になるよみたいな感じ。
k=1,-1がコーナー。2hackされた。
システムテストに通ったので圧倒的感謝。
f:id:beet_aizu:20170224154415p:plain
うしさんと同じ部屋で笑ってたらhackされた。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
  int INF=1LL<<55LL;
  int n,k;
  cin>>n>>k;
  int m=0;
  int p[60];
  p[0]=1;
  if(k==1){
    m=1;
  }else if(k==-1){
    p[1]=-1;
    m=2;
  }else{
    for(int i=0;abs(p[i])<INF;i++){
      p[i+1]=p[i]*k;
      m=i+1;
    }
  }
  int a[n];
  for(int i=0;i<n;i++) cin>>a[i];
  int ans=0,tmp=0;
  map<int,int> ma;
  for(int i=0;i<n;i++){
    ma[tmp]++;
    tmp+=a[i];
    for(int j=0;j<m;j++)
      if(ma.count(tmp-p[j]))
	ans+=ma[tmp-p[j]];
  }
  cout<<ans<<endl;
  return 0;
}
【D. The Door Problem】

「each door is controlled by exactly two switches.」なので
明らかに2SATやるだけ。蟻本見ながら書いた。
SCCはライブラリのやつ。UF解かしこいなあ。

int main(){
  int n,m;
  cin>>n>>m;
  int o[n];
  for(int i=0;i<n;i++) cin>>o[i];
  vector<int> s[n];
  for(int i=0;i<m;i++){
    int r;
    cin>>r;
    for(int j=0;j<r;j++){
      int k;
      cin>>k;
      k--;
      s[k].push_back(i);
    }
  }
  for(int i=0;i<n;i++){
    assert((int)s[i].size()==2);
    //cout<<o[i]<<" "<<s[i][0]<<" "<<s[i][1]<<endl;
    if(o[i]){
      add_edge(s[i][0],s[i][1]);
      add_edge(s[i][1],s[i][0]);
      add_edge(s[i][0]+m,s[i][1]+m);
      add_edge(s[i][1]+m,s[i][0]+m);
    }else{
      add_edge(s[i][0],s[i][1]+m);
      add_edge(s[i][1],s[i][0]+m);
      add_edge(s[i][0]+m,s[i][1]);
      add_edge(s[i][1]+m,s[i][0]);
    }
  }
  V=m*2;
  scc();
  for(int i=0;i<m;i++){
    //cout<<cmp[i]<<" "<<cmp[i+m]<<endl;
    if(cmp[i]==cmp[i+m]){
      cout<<"NO"<<endl;
      return 0;
    }
  }
  cout<<"YES"<<endl;
  return 0;
}
【全体】

oooo-- +1 3916points 440th
1574 -> 1712 (+138)
前回の太陽分回復した。
いつもこんぐらいできてればなあ。