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と書いてあるからです.ひざまずいた=!!
試合の時に最初にこの問題を読み間違えて、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;
}