| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴一下俺的代码#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX_N 20000
int n;
int notes[MAX_N];
int ranks[16][MAX_N];
int rankscount[16];
int pos[16][MAX_N];
int len;
int prevlen;
int level;
int prevlevel;
int minlevel;
bool Less(int a, int b)
{
if (pos[prevlevel][a] < pos[prevlevel][b]) return true;
if (pos[prevlevel][a] > pos[prevlevel][b]) return false;
if (pos[prevlevel][a + len - prevlen] < pos[prevlevel][b + len - prevlen]) return true;
if (pos[prevlevel][a + len - prevlen] > pos[prevlevel][b + len - prevlen]) return false;
if (notes[a] - notes[a + len - prevlen] < notes[b] - notes[b + len - prevlen]) return true;
if (notes[a] - notes[a + len - prevlen] > notes[b] - notes[b + len - prevlen]) return false;
return a < b;
}
bool Equal(int a, int b)
{
if (pos[prevlevel][a] != pos[prevlevel][b]) return false;
if (pos[prevlevel][a + len - prevlen] != pos[prevlevel][b + len - prevlen]) return false;
return notes[a] - notes[a + len - prevlen] == notes[b] - notes[b + len - prevlen];
}
bool search(bool type = false)
{
if (len == 1) {
return true;
}
bool flag = false;
for (int j = 0; j + len <= n; ++j) {
pos[level][j] = -1;
}
rankscount[level] = 0;
for (int j = 0; j < rankscount[prevlevel]; ++j) {
int k = ranks[prevlevel][j];
if (k + len > n) {
continue;
}
if (pos[prevlevel][k] == -1 || pos[prevlevel][k + len - prevlen] == -1) {
continue;
}
ranks[level][rankscount[level]++] = k;
}
{
int start = 0;
int prev = pos[prevlevel][ranks[level][start]];
for (int k = 1; k < rankscount[level]; ++k) {
int x = ranks[level][k], y = pos[prevlevel][x];
if(y != prev) {
sort(ranks[level] + start, ranks[level] + k, Less);
start = k;
prev = y;
}
}
sort(ranks[level] + start, ranks[level] + rankscount[level], Less);
}
int idx = 0, start = ranks[level][0];
pos[level][ranks[level][0]] = idx;
for (int k = 1; k < rankscount[level]; ++k) {
int x = ranks[level][k], y = ranks[level][k - 1];
if (Equal(x, y)) {
pos[level][x] = idx;
}
else {
pos[level][x] = ++idx;
if (y == start) {
pos[level][start] = -1;
}
else if (y - start >= len) {
flag = true;
if (type) return flag;
}
start = x;
}
}
int y = ranks[level][rankscount[level] - 1];
if (y - start >= len) {
flag = true;
}
return flag;
}
void init()
{
for (int i = 0; i < n; ++i) {
pos[0][i] = 0;
ranks[0][i] = i;
}
rankscount[0] = n;
len = 2, prevlen = 1;
level = 1, prevlevel = 0;
minlevel = 0;
for (; len <= n / 2; ++level, len *= 2) {
if (!search()) return;
prevlevel = level;
prevlen = len;
minlevel = level;
}
}
int calc2()
{
if (n == 1) return 0;
init();
int a = 1 << minlevel, b = min(n / 2, a * 2 - 1), res = 0;
prevlen = a;
prevlevel = minlevel;
while (a <= b) {
int c = (a + b) / 2;
len = c;
level = 15;
if (search(true)) {
if (c > res) res = c;
a = c + 1;
}
else {
b = c - 1;
}
}
if (res < 5) res = 0;
return res;
}
int main()
{
while (true) {
scanf_s("%d", &n);
if (!n) break;
for (int i = 0; i < n; ++i) {
scanf_s("%d", ¬es[i]);
}
printf("%d\n", calc2());
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator