HDOJ6635Nonsense Time(时间倒流,lis)

Posted myx12345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ6635Nonsense Time(时间倒流,lis)相关的知识,希望对你有一定的参考价值。

题意:给定n个数的数列,第i个数为a[i],刚开始所有位置都处于禁用状态,第i次之后位置p[i]变为可用,求每次变化后的lis长度

n,a[i],p[i]<=5e4

保证a[i],p[i]均为随机生成的排列

思路:不知道非随机版本能不能树套树解决

技术图片

 

 

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef pair<int,int> PII;
  7 typedef pair<ll,ll> Pll;
  8 typedef vector<int> VI;
  9 typedef vector<PII> VII;
 10 //typedef pair<ll,ll>P;
 11 #define N  100010
 12 #define M  200010
 13 #define fi first
 14 #define se second
 15 #define MP make_pair
 16 #define pb push_back
 17 #define pi acos(-1)
 18 #define mem(a,b) memset(a,b,sizeof(a))
 19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 21 #define lowbit(x) x&(-x)
 22 #define Rand (rand()*(1<<16)+rand())
 23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 24 #define ls p<<1
 25 #define rs p<<1|1
 26 
 27 const int MOD=1e9+7,inv2=(MOD+1)/2;
 28       double eps=1e-4;
 29       int INF=1e9;
 30       int inf=0x7fffffff;
 31       int dx[4]={-1,1,0,0};
 32       int dy[4]={0,0,-1,1};
 33 
 34 struct node
 35 {
 36     int x,y;
 37 }q[N];
 38 
 39 int dp[N],a[N],b[N],c[N],d[N],pre[N],ans[N],n;
 40 
 41 int read()
 42 {
 43    int v=0,f=1;
 44    char c=getchar();
 45    while(c<48||57<c) {if(c==-) f=-1; c=getchar();}
 46    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 47    return v*f;
 48 }
 49 
 50 int lis()
 51 {
 52     q[1].x=0;
 53     q[1].y=0;
 54     rep(i,2,n)
 55     {
 56         q[i].x=INF;
 57         q[i].y=0;
 58     }
 59     rep(i,1,n) pre[i]=0;
 60     int s=0;
 61     rep(i,1,n)
 62      if(c[i])
 63      {
 64         s++;
 65         int l=1,r=s,last=1;
 66         while(l<=r)
 67         {
 68             int mid=(l+r)>>1;
 69             if(q[mid].x<=a[i]){last=mid; l=mid+1;}
 70              else r=mid-1;
 71         }
 72         dp[i]=last; pre[i]=q[last].y;
 73         if(q[last+1].x>a[i]||q[last+1].y==0)
 74         {
 75             q[last+1].x=a[i];
 76             q[last+1].y=i;
 77         }
 78      }
 79     int res=1,k=1;
 80     rep(i,1,n)
 81      if(c[i]&&dp[i]>res){res=dp[i]; k=i;}
 82     rep(i,1,n) d[i]=0;
 83     while(k)
 84     {
 85         d[k]=1;
 86         k=pre[k];
 87     }
 88     return res;
 89 }
 90 
 91 void solve()
 92 {
 93     n=read();
 94     rep(i,1,n) a[i]=read();
 95     rep(i,1,n) b[i]=read();
 96     rep(i,1,n) c[i]=1;
 97     ans[n]=lis();
 98     per(i,n-1,1)
 99     {
100         c[b[i+1]]=0;
101         if(d[b[i+1]]) ans[i]=lis();
102          else ans[i]=ans[i+1];
103     }
104     rep(i,1,n-1) printf("%d ",ans[i]);
105     printf("%d
",ans[n]);
106 }
107 
108 int main()
109 {
110     int cas=read();
111     while(cas--) solve();
112     return 0;
113 }

 

以上是关于HDOJ6635Nonsense Time(时间倒流,lis)的主要内容,如果未能解决你的问题,请参考以下文章

HDOJ4418 Time travel

[HDOJ5935]Car(精度,数学)

HDOJ4355-Party All the Time(三分)

HDOJ3686 Traffic Real Time Query System

Hdoj 2109.Fighting for HDU 题解

HDOJ1362 The Bermuda Triangle