CF 255C

2238 ワード

タイトル:http://codeforces.com/problemset/problem/255/C
試合の時に最初にこの問題を読み間違えて、2回間違えてやっと発見して、それからしばらく考えて、問題が要求したその数列は、実は1つの状況で、すべて等しい数で、2つの状況の2つの異なる数が互いに現れて、
1つ目の状況は解決しやすく、肝心なのは2つ目の状況を求めることです.第2の場合は、n個の数のうちの任意の2個の数からなる最大可能な長さを列挙すればよい.では、同じ数の下付き(i)をそれぞれ1つのvectorに保存します.そして列挙すればいい.試合中最後の5分で提出します.のどこかk-1がKと書いてあるからです.ひざまずいた=!! 
#include <cmath>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#include <stack>
#include <deque>
using namespace std;
typedef long long LL;
#define eps 10e-9
#define inf 0x3f3f3f3f
const int maxn = 5000;
int b[maxn],a[maxn],c[maxn];
vector<int > v[maxn];
int hash[1000100];
int main(){
    int n;  int len=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
          scanf("%d",&b[i]);
          if(!hash[ b[i] ]){
             v[ ++len].push_back(i);
             hash[ b[i] ]=len;
          }
          else{
             int cur = hash[ b[i] ];
             v[cur].push_back(i);
          }
    }
     if(n==1){
       printf("1
"); return 0; } int ans=0; for(int i=1;i<=len;i++){ if(v[i].size()>ans) ans=v[i].size(); } for(int i=1;i<=len;i++){ for(int j=i+1;j<=len;j++){ int k=0, l=0; int temp=1; while(l<v[i].size()&&k<v[j].size()){ if(v[j][k]>v[i][l]){ temp++; l++; k++; if(l==v[i].size()) break; if(v[i][l]>v[j][k-1]) temp++; else{ while(v[i][l]<v[j][k-1]&&l<v[i].size()){ l++; } if(l<v[i].size()) temp++; } } else{ k++; } } if(temp>ans) ans=temp; } } printf("%d
",ans); return 0; }