intさわだんのBlack History

刹那的レジェンドになりたい。

POJ(PKU) Jessica's Reading Problem

蟻本にある問題。

蟻本頭良すぎて焦る。

しゃくとり法。

#include <cstdio>
#include <algorithm>
#include <map>
#include <set>

using namespace std;

int main(){
  
  int p,a[1000003];
  scanf("%d",&p);
  for(int i = 0;i < p;i++) scanf("%d",&a[i]);
  set<int> all;
  for(int i = 0;i < p;i++){
    all.insert(a[i]);
  }
  
  int n = all.size();
  
  int s = 0,t = 0,num = 0;
  map<int,int> count;
  int ans = p;
  for(;;){
    while(t < p && num < n){
      if(count[a[t++]]++ == 0) num++;
    }
    if(num < n)break;
    
    ans = min(ans,t-s);
    if(--count[a[s++]] == 0) num--;
  }
  
  printf("%d\n",ans);
  
  return 0;
  
}


かなりどうでもいいのだが、TLE黒歴史ソースがこちら。
蟻本みたいな天才な考え方はできなかった。

#include <cstdio>
#include <map>
#include <iostream>

using namespace std;

int ans;

int p,d[1000003];

int main(){
  map<int,int> m;
  scanf("%d",&p);
  ans = p;
  for(int i = 0;i < p;i++){
    scanf("%d",&d[i]);
    m[d[i]] = 0;
  }
  map<int,int>::iterator it;
  bool flag;
  int s = 0,t = 0;
  int ho = -1;
  for(;;){
    flag = true;
    while(flag == true && t < p){
      flag = false;
      if(ho == 0){
	break;
      }else if(ho == -1){
      for(it = m.begin();it != m.end();it++){
	if(it->second == 0){
	  flag = true;
	  break;
	}
      }
      if(flag){
	m[d[t]]++; t++;
      }
      }else{
	for(int i = t;i < p;i++){
	  m[d[i]]++;
	  if(d[i] == ho){
	    ho=0;
	    flag = false;
	    break;
	  }else{
	    flag = true;
	  }
	}
      }
    }
    if(t == p){
    flag = false;
    for(it = m.begin();it != m.end();it++){
      if(it->second == 0){
	flag = true;
	break;
      }
    }
    if(flag)break;
    }
    ans = min(ans,t - s);
    m[d[s]]--; s++;
    if(m[d[s]] == 0) ho = d[s];
  }
  
 
  
  printf("%d\n",ans);
  
  return 0;
  
}