BZOJ5484(LIS性質 樹狀陣列)

2022-02-27 15:25:13 字數 2106 閱讀 1522

題目傳送

學習的這篇題解。

結論:1.直觀感受一下會發現找到lis,lis裡的東西相對位置是不會變的,其他的移一移總會排序成功的,所以其他的就是最小集合了,第一問的答案就是n-lis;

2.尋找字典序第k小的集合,相當於是尋找字典序第k大的lis,然後把這個lis刪去,就是第二問的答案集合。

前置技能:

樹狀陣列,及樹狀陣列求lis。

解決方法(請先看**):

1.樹狀陣列bit[i]求lis的同時再維護一下「以比i大的數字為開頭、這個lis長度下的序列的數量」。數量超過maxk的時候min一下砍掉(是一種常見手法),因為多了也沒有用它只會詢問maxk以內的,否則有可能爆longlong。

2.用vector存下每個長度的lis是以哪些位置為起點,然後按長度從大到小列舉,看看第k個是哪個lis,標記這些數字。因為之前維護了數量,所以這時就不用從1開始乙個乙個列舉到k了,一下砍下去一段。

1

#pragma comment(linker, "/stack:1024000000,1024000000")

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13 #include 14 #include 15 #include 16 #include

17 #include 18 #include 19 #include 20 #include 21 #include 22

#define init(a, b) memset(a, b, sizeof(a))

23#define rep(i, a, b) for (int i = a; i <= b; i++)

24#define irep(i, a, b) for (int i = a; i >= b; i--)

25using

namespace

std;

2627 typedef double

db;28 typedef long

long

ll;29 typedef unsigned long

long

ull;

30 typedef pairp;

31const

int inf = 0x3f3f3f3f;32

const ll inf =1e18;

3334 template void read(t &x)

4344 template void

write(t x)

4950 template void

writeln(t x)

5455

const

int maxn = 1e5 + 5;56

const ll maxk =1e18;

5758

intn, a[maxn];

59ll k;

60struct

arr

66 arr(int

a, ll b)

69}dp[maxn], bit[maxn];

70 vectorv[maxn];

71bool

mark[maxn];

7273

void modify(arr &a, arr b)

79 a.cnt = min(maxk, a.cnt +b.cnt);80}

8182

void update(int

x, arr val)

8687 arr query(int

x) 93

94int

main()

103104

int lis = query(1

).len;

105for (int i = lis, pos = 1; i; --i) else

117}

118}

119120 writeln(n -lis);

121 rep(i, 1

, n)

125return0;

126 }

BZOJ1052 BZOJ3760 覆蓋問題

原題位址 先說自己的逗比方法 二分答案,把所有點用乙個最小的矩形 框 起來,易證矩形的其中乙個端點是最優解中正方形的乙個端點,然後列舉四個端點後遞迴處理,差不多了 然後 olz黃學長的o n 做法 ac code include include include using namespace std...

動態點分治 bzoj 3730,bzoj 1095

總結一下動態點分治的模板。對於乙個樹,把它點分的同時記錄每個點的所有父親 logn個 並記錄點距其父親的距離。具體實現就是dfs的時候fa x dep x u,dis x dep x d bzoj1095 您需要寫乙個程式支援反轉點的顏色,求距離最遠的黑色點對的距離。解析 在每個點u存乙個堆st記錄...

福慧雙修 探險 BZOJ4398 BZOJ2407

分析 雙倍經驗 資料範圍不同 我們考慮,我們必定是從1走一條邊到節點i,之後從i到j跑最短路,之後再從j到1走另一條邊的情況下,不會重複,並且是答案。那麼我們考慮預處理出pre i 表示從1走到i滿足最短路的並且經過pre i pre i 為路徑第二個節點。那麼,針對每乙個邊,x,y,z,v 滿足當...