关闭

tjut 3525

46人阅读 评论(0) 收藏 举报
分类:
#include <iostream>  
#include <cstdio>  
#include <vector>  
#include <cmath>  
#include <set>  
using namespace std;  
  
const int maxn=200100;  
vector <int> va,vb,data,dp;  
vector <vector <int> > v;  
set <int> sa,sb;  
int da[maxn],db[maxn],n,m;  
  
void initial(){  
    va.clear(),vb.clear();  
    sa.clear(),sb.clear();  
    v.clear(),data.clear();  
    dp.clear();  
    for(int i=1;i<=2*n*m;i++){  
        da[i]=-1;db[i]=-1;  
        sa.insert(i),sb.insert(i);  
    }  
}  
  
void input(){  
    set <int>::iterator it;  
    int x,pos;  
    for(int i=0;i<n*m;i++){  
        scanf("%d%d",&x,&pos);  
        if(da[pos]==-1){  
            da[pos]=x;  
            sa.erase(pos);  
        }  
        else{  
            it=sa.upper_bound(pos);  
            da[*it]=x;  
            sa.erase(it);  
        }  
    }  
    for(int i=0;i<n*m;i++){  
        scanf("%d%d",&x,&pos);  
        if(db[pos]==-1){  
            db[pos]=x;  
            sb.erase(pos);  
        }  
        else{  
            it=sb.upper_bound(pos);  
            db[*it]=x;  
            sb.erase(it);  
        }  
    }  
    for(int i=1;i<=2*n*m;i++){  
        if(da[i]!=-1) va.push_back(da[i]);  
        if(db[i]!=-1) vb.push_back(db[i]);  
    }  
}  
  
void computing(int casen){  
    int len=va.size();  
    v.resize(n+1);  
    for(int i=0;i<len;i++) v[va[i]].push_back(i+1);  
    for(int i=0;i<len;i++){  
        int s=vb[i];  
        for(int t=v[s].size()-1;t>=0;t--){  
            data.push_back(v[s][t]);  
        }  
    }  
    dp.push_back(-1);  
    for(int i=0;i<data.size();i++){  
        int l=0,r=dp.size()-1;  
        if(data[i]>dp[r]) dp.push_back(data[i]);  
        else{  
            while(l<r){  
                int mid=(l+r)/2;  
                if(data[i]<=dp[mid]) r=mid;  
                else l=mid+1;  
            }  
            dp[r]=data[i];  
        }  
    }  
    printf("Case #%d: %d\n",casen,dp.size()-1);  
  
}  
  
int main(){  
    int t;  
    scanf("%d",&t);  
    for(int i=1;i<=t;i++){  
        scanf("%d%d",&n,&m);  
        initial();  
        input();  
        computing(i);  
    }  
    return 0;  
}  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27611次
    • 积分:4418
    • 等级:
    • 排名:第6718名
    • 原创:433篇
    • 转载:0篇
    • 译文:0篇
    • 评论:11条
    文章分类
    阅读排行