Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6001 | Accepted: 3285 |
Description
A typical situation is schematically depicted in figure 1. The ports of the two functional blocks are numbered from 1 to p, from top to bottom. The signal mapping is described by a permutation of the numbers 1 to p in the form of a list of p unique numbers in the range 1 to p, in which the i:th number specifies which port on the right side should be connected to the i:th port on the left side.Two signals cross if and only if the straight lines connecting the two ports of each pair do.
Input
Output
Sample Input
4 6 4 2 6 3 1 5 10 2 3 4 5 6 7 8 9 10 1 8 8 7 6 5 4 3 2 1 9 5 8 9 2 3 1 7 4 6
Sample Output
3 9 1 4
Source
/*
http://acm.pku.edu.cn/JudgeOnline/problem?id=1631
DP+二分查找
一开始没有使用二分查找,时间复杂度是n ^ 2,结果超时
后来改用二分,时间复杂度是nlgn,AC
二分的思路是:
使用bsVal来保存当前长度的序列中最小的point位置
比如bsVal[2] = 3意味着,长度为二的序列中最小的位置是3
*/
#include <iostream>
#define maxv(a, b) ((a) >= (b) ? (a) : (b))
#define MAX_N 40000
using namespace std;
int maxData[MAX_N + 1];
int input[MAX_N + 1];
int maxP;
int bsVal[MAX_N + 1];
void binarySearch(int curPos)
{
int l = 1, r = maxP, mid;
while(l <= r)
{
mid = (l + r) / 2;
if(bsVal[mid] < input[curPos])
l = mid + 1;
else
r = mid - 1;
}
maxData[curPos] = l;
bsVal[l] = input[curPos];
maxP = maxv(maxP, l);
}
int main()
{
int caseNum, pNum, i, j;
scanf("%d", &caseNum);
for(i = 1; i <= caseNum; i++)
{
maxP = 1;
scanf("%d", &pNum);
for(j = 1; j <= pNum; j++)
{
scanf("%d", &input[j]);
maxData[j] = 1;
if(j == 1)
{
bsVal[1] = input[j];
continue;
}
binarySearch(j);
}
printf("%d/n", maxP);
}
return 0;
}