觀察題目:在第 i 輪操作時,將數字 i 插入
插入的數字是當前最大的
如果答案與上次不同,新的lis必以 i 結尾
以 i 結尾的lis無法再伸長(因為比 i 小的都插入完了)
也就是說,加入 \(i+1\) 到 \(n\) 的數,不會對以 \(i\) 結尾的上公升子串行有影響,所以我們不用去動態地維護lis的大小,只需要最後把總的序列做一次lis就好了。然後對於第 \(i\) 個輸出,只需要求得分別以 \(1\) 到 \(i\) 結尾的子串行的最大值即可。
面對1e5的資料,o(\(n^2\))的大暴力顯然是不行的,我們考慮資料結構優化。
樹狀陣列優化流程:
1.對原數列以值為關鍵字排序,記錄原來的位置(存入乙個結構體)
2.排完序後,數列的值顯然是1n依次遞增,我們不妨列舉1n的值。
對於每乙個\(i\),找到它原來的位置記為p,則用樹狀陣列找到在位置p之前的最大值,作為更新的**。
3.算完後,把\(i\)這個值加到樹狀陣列\(p\)的這個位置,重複執行2
**:
inline int lowbit(int x)
inline void add(int x,int val)}
inline int query(int x)return ret;}
for(int i=1;i<=n;i++) a[i].num=i;//原位置
sort(a+1,a+1+n,cmp);//排序
int ans=0;
for(int i=1;i<=n;i++)
我們採用splay來實現此部分的功能
在這之前請各位精通文藝平衡樹
首先插入兩個極大極小的數(為了避免玄學陣列越界)
對於每次插入操作,例如把val插到x位置的後面,就先把x+1位置的數旋轉到根節點,再把x+2位置的數旋轉到根節點的右兒子,那麼你只需要把數加到根節點的右兒子的左兒子(不懂得可以模擬一下),這樣就實現了插入操作(其實就是提取區間操作)
#include#includeusing namespace std;
#define rint register int
#define inf 0x3f3f3f3f
#define n 100007
templateinline void read(t &x)
while(c>='0'&&c<='9')
x*=flag;
}struct splayt[n];
struct nodea[n];
int c[n];
int root,t,n=0,cnt=0,m,num=0,f[n];
inline int max(int x,int y)
inline bool cmp(const node a,const node b)
inline void update(int p)
inline int wich(int x)
inline void connect(int x,int y,int f)
inline int lowbit(int x)
inline void add(int x,int val)}
inline int query(int x)return ret;}
inline void rotate(int x)
inline void rota(int p)
else
}inline void splay(int p,int to)
if(t[t[p].fa].fa==to)
rota(p);
}}inline int find(int x)
}return 0;
}inline void insert(int val,int k),1};
t[t[root].s[1]].s[0]=cnt;
update(t[root].s[1]);update(root);
splay(cnt,root);
}inline void dfs(int p)
int main(),2};
t[++cnt]=(splay),1};
read(n);rint x;
root=1;
for(int i=1;i<=n;i++)
read(x),insert(i,x);
dfs(root);
for(int i=1;i<=n;i++) a[i].num=i;
sort(a+1,a+1+n,cmp);
int ans=0;
for(int i=1;i<=n;i++)
}
Tjoi2013 最長上公升子串行
time limit 10 sec memory limit 128 mb submit 2294 solved 1153 submit status discuss 給定乙個序列,初始為空。現在我們將1到n的數字插入到序列中,每次將乙個數字插入到乙個特定的位置。每插入乙個數字,我們都想知道此時最長...
TJOI2018 鹼基序列
題目鏈結 演算法 考慮構建字尾自動機 用fi j表示前i個串 匹配到自動機上的j號節點方案數 在自動機上dp即可 詳見 時間複雜度 o nk includeusing namespace std typedef long long ll typedef long double ld typedef ...
BJWC2018 最長上公升子串行
description 現在有乙個長度為n的隨機排列,求它的最長上公升子串行長度的期望。為了避免精度誤差,你只需要輸出答案模998244353的餘數。input 輸入只包含乙個正整數n。n 28 output 輸出只包含乙個非負整數,表示答案模998244353的餘數。可以證明,答案一定為有理數,設...