給定乙個序列,初始為空。
現在我們將1到n的數字插入到序列中,每次將乙個數字插入到乙個特定的位置。
每插入乙個數字,我們都想知道此時最長上公升子串行長度是多少?
因為每次插入的數是按順序從小到大的,所以我們可以從後往前計算
我們先用 vector 自帶的 insert 函式得到所有數都插入完後的序列,
然後從 n 到 1 依次計算
當計算完第 i 次操作的 lis 後只要把 i 這個數的貢獻去掉即可返回第 i - 1 次操作
然後就沒有然後了。。。
以上步驟用 線段樹 or 樹狀陣列 維護都可
感覺挺水的一道題,不理解為什麼會是紫題
#include usingnamespace
std;
const
int n = 1e5 + 10
;struct
tree
tree[n
<< 2
];void push_up(int
rt)void push_down(int rt, int
length)
}void build(int l, int r, int rt, int *aa)
int mid = (l + r) >> 1
; build(l, mid, rt
<< 1
, aa);
build(mid + 1, r, rt << 1 | 1
, aa);
push_up(rt);
}void update_range(int l, int r, int key, int
rt) push_down(rt, tree[rt].r - tree[rt].l + 1
);
int mid = (tree[rt].r + tree[rt].l) >> 1
;
if(l <= mid) update_range(l, r, key, rt << 1
);
if(r > mid) update_range(l, r, key, rt << 1 | 1
); push_up(rt);
}int query_max(int l, int r, int
rt)vector
vec, ans;
inta[n], aa[n], n;
signed main()
for(int i = 1; i <= n; i++) a[i] = vec[i - 1
]; build(
1, n, 1
, aa);
for(int i = 1; i <= n; i++)
for(int i = n; i; i--)
reverse(ans.begin(), ans.end());
for(auto i : ans) cout << i << '\n'
;
return0;
}
#includeusingnamespace
std;
const
int n = 3e5 + 10
;int
n , tree[n] , a[n];
vector
vec , ans;
int lowbit(int
x) void add(int pos , int
val)
}int get_max(int
pos)
return
res ;
}signed main()
for(int i = 1 ; i <= n ; i ++) a[i] = vec[i - 1
];
for(int i = 1 ; i <= n ; i ++)
for(int i = n ; i ; i --)
reverse(ans.begin() , ans.end());
for(auto i : ans) cout << i << '\n'
;
return0;
}
洛谷P4309 TJOI2013 最長上公升子串行
給定乙個序列,初始為空。現在我們將1到n的數字插入到序列中,每次將乙個數字插入到乙個特定的位置。每插入乙個數字,我們都想知道此時最長上公升子串行長度是多少?第一行乙個整數n,表示我們要將1到n插入序列中,接下是n個數字,第k個數字xk,表示我們將k插入到位置xk 0 xk k 1,1 k n n行,...
P4304 TJOI2013 攻擊裝置
傳送門 看到棋盤先黑白染色冷靜一下 然後發現.攻擊的時候同種顏色不會相互攻擊 這樣就是個網路流經典套路了,關於這個套路我以前好像寫過幾題,那邊有解釋一下 傳送門 include include include include include include using namespace std t...
Tjoi2013 最長上公升子串行
time limit 10 sec memory limit 128 mb submit 2294 solved 1153 submit status discuss 給定乙個序列,初始為空。現在我們將1到n的數字插入到序列中,每次將乙個數字插入到乙個特定的位置。每插入乙個數字,我們都想知道此時最長...