1. 程式人生 > >【bzoj3173】: [Tjoi2013]最長上升子序列

【bzoj3173】: [Tjoi2013]最長上升子序列

ms是個簡單的splay+nlogn的最長上升子序列。。?
但是我老是搞不清順序怎麼辦0.0
根據題目加入的順序發現的性質要注意阿0.0
orzorzlyh

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=200011;
const int inf=0x3f3f3f3f;
struct node{int l,r,fa,size,mx,ans;}sp[N];
int root,cnt;
int
a[N],dp[N],ans[N]; //max的方法不太對。。。 void update(int x) { int l=sp[x].l,r=sp[x].r; sp[x].size=sp[l].size+sp[r].size+1; } void zig(int x) { int y=sp[x].fa; sp[y].l=sp[x].r; if(sp[x].r)sp[sp[x].r].fa=y; sp[x].fa=sp[y].fa; if(sp[y].fa) if(sp[sp[y].fa].l==y)sp[sp[y].fa].l=x; else
sp[sp[y].fa].r=x; sp[x].r=y,sp[y].fa=x; update(y); } void zag(int x) { int y=sp[x].fa; sp[y].r=sp[x].l; if(sp[x].l)sp[sp[x].l].fa=y; sp[x].fa=sp[y].fa; if(sp[y].fa) if(sp[sp[y].fa].l==y)sp[sp[y].fa].l=x; else sp[sp[y].fa].r=x; sp[x].l=y,sp[y].fa=x; update(y); } void
splay(int x,int aim) { while(sp[x].fa!=aim) { int y=sp[x].fa; if(sp[y].fa==aim) { if(sp[y].l==x)zig(x); else zag(x); } else { if(sp[sp[y].fa].l==y) { if(sp[y].l==x)zig(y),zig(x); else zag(x),zig(x); } else { if(sp[y].r==x)zag(y),zag(x); else zig(x),zag(x); } } } if(aim==0)root=x; update(x); } int find(int x,int wz) { if(x==0)return -1; int l=sp[x].l,r=sp[x].r; if(sp[l].size>=wz)return find(l,wz); if(sp[l].size+1>=wz)return x; return find(r,wz-sp[l].size-1); } int getnext(int x) { x=sp[x].r; while(sp[x].l)x=sp[x].l; return x; } void insert(int wz) { int x=find(root,wz-1); splay(x,0); int y=getnext(x); splay(y,x); sp[y].l=++cnt; sp[cnt].fa=y; sp[cnt].size=1; update(y); update(x); } void bili() { root=1; cnt=2; sp[1].r=2,sp[2].fa=1; sp[1].size=2;sp[2].size=1; } void dfs(int x) { if(x==0)return; dfs(sp[x].l); a[++cnt]=x; dfs(sp[x].r); } int main() { int n;cin>>n; bili(); for(int i=1;i<=n;i++) { int wz; scanf("%d",&wz);wz+=2; insert(wz); } cnt=0;dfs(root); for(int i=1;i<=n;i++) a[i]=a[i+1],dp[i]=inf; for(int i=1;i<=n;i++) { int j=lower_bound(dp+1,dp+1+n,a[i])-dp; dp[j]=a[i]; ans[a[i]-2]=j; } for(int i=1;i<=n;i++) { ans[i]=max(ans[i],ans[i-1]); printf("%d\n",ans[i]); } return 0; }

相關推薦

bzoj3173[Tjoi2013]上升序列

isp ont const getch sed led hint 直接 close Description 給定一個序列,初始為空。現在我們將1到N的數字插入到序列中,每次將一個數字插入到一個特定的位置。每插入一個數字,我們都想知道此時最長上升子序列長度是多少? Inp

LG4309BZOJ3173[TJOI2013]上升序列

【LG4309】【BZOJ3173】[TJOI2013]最長上升子序列 題面 洛谷 BZOJ 題解 插入操作顯然用平衡樹就行了 然後因為後面的插入對前面的操作無影響 就直接在插入完的序列上用樹狀陣列求下每個點為終點的最長上升子序就行了 然而懶得手寫平衡樹了 直接用了\(rope\) rope用法 程式

bzoj3173: [Tjoi2013]上升序列

ms是個簡單的splay+nlogn的最長上升子序列。。? 但是我老是搞不清順序怎麼辦0.0 根據題目加入的順序發現的性質要注意阿0.0 orzorzlyh #include<iostream> #include<cstdio>

LeetCode300. 上升序列 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/longest-increasing-subsequence/submissions/ 題目描述: 給定一個無序的整數陣列,找到其中最長上升子序列的長度。 示例: 輸入: [10,9,2,5,3,7,101,

洛谷P1020關於上升序列的四種解法

這是第一次寫部落格,參加學校的acm已經有一年的時間了,現在才開始寫,說實話有點晚,但再不寫就更晚了,現在在做最長子序列方面的題,找了一道比較經典的題來舉例。 題目連結:https://www.luogu.org/problemnew/show/P1020

dp上升序列

輸出 個數 getchar() 輸入 長度 %d pri get 描述 題目描述 給定一個序列,初始為空。現在我們將1到N的數字插入到序列中,每次將一個數字插入到一個特定的位置。我們想知道此時最長上升子序列長度是多少? 輸入 第一行一個整數N,表示我們要將1到N插入序

BZOJ3173: [Tjoi2013]上升序列(樹狀數組)

nss 貢獻 isp 轉化 復雜 src printf efi col 【題意】給定ai,將1~n從小到大插入到第ai個數字之後,求每次插入後的LIS長度。 【算法】樹狀數組||平衡樹 【題解】 這是樹狀數組的一個用法:O(n log n)尋找前綴和為k的最小位置。(當數列

BZOJ3173: [Tjoi2013]上升序列

pac struct class -i 記得 cst 子序列 hide cnblogs 1~n<=1e5依次插入序列中某一個位置,求每次插入後的最長上升子序列。 因為新插入的數對前面插入的答案沒影響,所以只要能想方設法構造出最終序列即可。 方法一:平衡樹!。。。。 方

LeetCode 中等題74-上升序列

題目描述:給定一個無序的整數陣列,找到其中最長上升子序列的長度。 示例: 輸入: [10,9,2,5,3,7,101,18] 輸出: 4 解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4。 說明: 可能會有多種最長上升子

bzoj千題計劃316:bzoj3173: [Tjoi2013]上升序列(二分+樹狀陣列)

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x

bzoj2423[HAOI2010]公共序列 dp

代碼 ring ont 註意 return 需要 sam tdi light 題目描述 字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1&

[TJOI2013]上升序列

[TJOI2013]最長上升子序列 題目大意: 給定一個序列,初始為空。將\(1\sim n(n\le10^5)\)的數字插入到序列中,每次將一個數字插入到一個特定的位置。每插入一個數字後輸出LIS長度。 思路: 首先用線段樹(或rope)求出最終狀態的序列,然後就變成了普通的LIS問題。 原始碼:

BZOJ 3173: [Tjoi2013]上升序列

treap做法太裸了 不打了(我哪會treap啊。。懶得打splay 233) 發現一種很妙的離線做法 樹狀陣列 一開始每個位置都為1 從後往前,找到字首和等他要加到的位置+1的位置,這個位置就是這個值最後的位置(不信你手玩一下) 然後把這個位置值變成0。 上面一步用樹狀陣列上二

51nod---1006 公共序列Lcs(動態規劃&&字串LCS)

題目連結這裡呀 1006 最長公共子序列Lcs 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關注 給出兩個字串A B,求A與B的最長公共子序列(子序列不要求是連續的)。 比如兩個串為: abcicba abd

bzoj3173上升序列

節點 return hup 位置 一個 ostream online %d pre Portal --> bzoj3173 Solution   感覺自己需要智力康復qwq   首先題目給的這個序列肯定是一個\(1-n\)的排列,並且插入的順序是從小到大   仔細思考

洛谷 P1567 統計天數上升序列/暴力

cout show class its 輸入輸出 view adg 統計 int 題目背景 統計天數 題目描述 炎熱的夏日,KC非常的不爽。他寧可忍受北極的寒冷,也不願忍受廈門的夏天。最近,他開始研究天氣的變化。他希望用研究的結果預測未來的天氣。 經歷千辛萬苦,他收

bzoj5161上升序列 狀壓dp+打表

-s 只需要 [] sca div limits pow 證明 AC 題目描述 現在有一個長度為n的隨機排列,求它的最長上升子序列長度的期望。 為了避免精度誤差,你只需要輸出答案模998244353的余數。 輸入 輸入只包含一個正整數n。N<=28 輸出

POJ 3903 Stock Exchange 上升序列模板題

com ++ 特點 pri 解析 class span 表示 problem 題目鏈接:http://poj.org/problem?id=3903 轉載於:https://www.cnblogs.com/GodA/p/5180560.html 題目大意: 裸的DP最長

洛谷 P1020 導彈攔截 上升序列 || 線段樹

PE AD 捕捉 描述 esp 數據 依次 size new 題目鏈接:https://www.luogu.org/problemnew/show/P1020 題目描述 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能

jzoj5920. NOIP2018模擬10.21風箏(dp,上升序列)

5920. 【NOIP2018模擬10.21】風箏 Description 當一陣風吹來,風箏飛上天空,為了你,而祈禱,而祝福,而感動…… Description oyiya 在 AK 了 IOI 之後來到了鄉下,在田野中玩耍,放鬆身心。 他發現前面有一排小朋