zoukankan      html  css  js  c++  java
  • Jzoj3467 最长上升子序列

    维护一个序列,使它可以进行下面两种操作:
    1.在末尾添加一个数字x
    2.将整个序列变成第x次操作后的样子
    在每次操作后,输出当前序列的最长上升子序列的长度
    序列初始时为空

    嗯,可持久化线段树的裸题

    额这可是noip提高组难度的题,我们发现所有操作可以变成一棵树(离线做法老套路了)

    让后每次最多修改数组上的一个值(考虑二分求LIS的过程)最后改回去就好了

    注意dfs又卡栈(jzoj极不良心啊)

    #pragma GCC opitmize("O3")
    #pragma G++ opitmize("O3")
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    #define N 500010
    #define INF 0x7fffffff
    using namespace std;
    extern int main2(void) __asm__ ("main2");
    struct edge{ int v,c,nt; } G[N];
    int h[N],f[N],n,cnt=0,A[N];
    inline void adj(int x,int y,int c){
    	G[++cnt]=(edge){y,c,h[x]}; h[x]=cnt;
    }
    void dfs(int x){
    	A[x]=lower_bound(f,f+n,INF)-f;
    	for(int p,v,i=h[x];i;i=G[i].nt){
    		p=lower_bound(f,f+n,G[i].c)-f;
    		v=f[p]; f[p]=G[i].c; dfs(G[i].v); f[p]=v;
    	}
    }
    int main2(){
    	freopen("lis.in","r",stdin);
    	freopen("lis.out","w",stdout); 
    	scanf("%d",&n); *f=INF;
    	for(int o,x,i=1;i<=n;++i){
    		scanf("%d%d",&o,&x); f[i]=INF;
    		if(o) adj(x,i,INF); else adj(i-1,i,x);
    	}
    	dfs(0);
    	for(int i=1;i<=n;++i) printf("%d
    ",A[i]); exit(0);
    }
    int main(){  
        	int size=32<<20; char *p=(char*)malloc(size)+size;    
       	 __asm__ __volatile__("movq  %0, %%rsp
    "  "pushq $exit
    "   "jmp main2
    "  :: "r"(p));   
    }

  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477190.html
Copyright © 2011-2022 走看看