HDU1025 Constructing Roads In JGShining's Kingdom

原題地址:戳進來

這道題目就是說有兩條平行線,第一條線上是rich城市,第二條線上是poor城市,要求把相同數字的城市相連,但是不能出現交叉,問最多能連幾條線。

這道題目我一直感覺有問題,有的人說輸入本身就是有序的不用排序,也有的說輸入無序,要按照poor城市的升序排rich城市,然後求rich城市序列中的最長上升子序列,我貼出這道題的目的不是這道題本身,而是想說明求LIS的動態規劃加二分的方法,時間複雜度是O(N*logN),如果不知道請轉最長上升子序列 LIS,如果你用普通的動態規劃的方法做我打一百個保票你會超時,不信你去試一下,題目鏈接在上面,貼出我的AC代碼。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAXN 500010
int d[MAXN];
struct node
{
    int r;
    int p;
}a[MAXN];
int cmp(const node&a,const node&b)
{
    return a.p>1;
        if(n>d[mid]&&nd[mid])
            l=mid+1;
        else
            r=mid-1;
    }
    return 0;
}
int main()
{
    int n,count=0;
    while(cin>>n)
    {
        count++;
        for(int i(1);i<=n;i++)
            cin>>a[i].r>>a[i].p;
        sort(a+1,a+1+n,cmp);
        int len=1,i,j;
        d[1]=a[1].r;
        for(i=2;i<=n;i++)
        {
            if(a[i].r>d[len])
            {
                len++;
                d[len]=a[i].r;
            }
            else
            {
                j=Binsearch(a[i].r,d,1,len)+1;
                d[j]=a[i].r;
            }
        }
        if(len==1)
        {
            cout<<"Case "<

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章