传说中的背诵题,最长****子串。所有的代码都是现成的,只需要把类型改成结构再调整一下输入输出。
不小心PE了一次T_T!
Accepted | 1076 | C++ | 00:00.00 | 432K |
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define swap(x,y) if(x != y){x = x^y; y = y^x; x = x^y;}
typedef struct s
{
int start;
int end;
int index;
}Gen;
void sort(Gen* a,int p,int r)
{
while (p < r)
{
int i = p - 1 ;
int x = a[r].start;
for(int j = p; j < r; j++ )
{
if(a[j].start <= x)
{
i++ ;
swap(a[i].start,a[j].start);
swap(a[i].end,a[j].end);
swap(a[i].index,a[j].index);
}
}
i++ ;
swap(a[i].start,a[r].start);
swap(a[i].end,a[r].end);
swap(a[i].index,a[r].index);
sort(a,p,i - 1 );
p = i + 1 ;
}
}
void solve(int n)
{
Gen* g = (Gen*)malloc(sizeof(Gen) * n);
int* m = (int*)malloc(sizeof(int) * n);
int* res = (int*)malloc(sizeof(int) * n);
memset(m,0,sizeof(int) * n);
memset(res,0,sizeof(int) * n);
int i,j;
for(i = 0; i < n; i++ )
{
scanf("%d%d",&g[i].start,& g[i].end);
g[i].index = i;
}
sort(g,0,n - 1 );
m[0] = 1 ;
for(i = 1; i < n; i++ )
{
int max = 0 ;
for(j = 0; j < i; j++ )
{
if(g[j].end < g[i].start)
max = max > m[j] ? max : m[j];
}
m[i] = ++ max;
}
int len = 0 ;
for(i = 0; i < n; i++ )
if(len < m[i])
{
len = m[i];
j = i;
}
res[0] = j;
int k = 0 ;
while(j-- )
if(len > m[j] && g[j].end < g[res[k]].start)
{
res[++k] = j;
len = m[j];
}
while (k)
printf("%d ",g[res[k--]].index + 1 );
printf("%d ",g[res[0]].index + 1 );
free(g);
free(m);
free(res);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1076.txt","r" ,stdin);
#endif
int n;
while(scanf("%d",&n) != EOF && n != 0 )
solve(n);
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0 ;
}
#include <string.h>
#include <stdlib.h>
#define swap(x,y) if(x != y){x = x^y; y = y^x; x = x^y;}
typedef struct s
{
int start;
int end;
int index;
}Gen;
void sort(Gen* a,int p,int r)
{
while (p < r)
{
int i = p - 1 ;
int x = a[r].start;
for(int j = p; j < r; j++ )
{
if(a[j].start <= x)
{
i++ ;
swap(a[i].start,a[j].start);
swap(a[i].end,a[j].end);
swap(a[i].index,a[j].index);
}
}
i++ ;
swap(a[i].start,a[r].start);
swap(a[i].end,a[r].end);
swap(a[i].index,a[r].index);
sort(a,p,i - 1 );
p = i + 1 ;
}
}
void solve(int n)
{
Gen* g = (Gen*)malloc(sizeof(Gen) * n);
int* m = (int*)malloc(sizeof(int) * n);
int* res = (int*)malloc(sizeof(int) * n);
memset(m,0,sizeof(int) * n);
memset(res,0,sizeof(int) * n);
int i,j;
for(i = 0; i < n; i++ )
{
scanf("%d%d",&g[i].start,& g[i].end);
g[i].index = i;
}
sort(g,0,n - 1 );
m[0] = 1 ;
for(i = 1; i < n; i++ )
{
int max = 0 ;
for(j = 0; j < i; j++ )
{
if(g[j].end < g[i].start)
max = max > m[j] ? max : m[j];
}
m[i] = ++ max;
}
int len = 0 ;
for(i = 0; i < n; i++ )
if(len < m[i])
{
len = m[i];
j = i;
}
res[0] = j;
int k = 0 ;
while(j-- )
if(len > m[j] && g[j].end < g[res[k]].start)
{
res[++k] = j;
len = m[j];
}
while (k)
printf("%d ",g[res[k--]].index + 1 );
printf("%d ",g[res[0]].index + 1 );
free(g);
free(m);
free(res);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1076.txt","r" ,stdin);
#endif
int n;
while(scanf("%d",&n) != EOF && n != 0 )
solve(n);
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0 ;
}