2019CCPC網路賽 array(權值線段樹)

2021-10-09 16:02:49 字數 1654 閱讀 5748

題目位址

兩種操作

1. 給 a[i] + 10000000

2. 查詢不存在 在a[1 ~ r] 中 且不低於k的數

在第乙個操作時 由於k的範圍不夠 就相當於把 a[i] 刪除掉即a[i]的下標變為無窮大而對於第二種操作 也就是 等價為在 k之後 的下標的大於r 的可以使用權值線段樹用來維護當前區間最大的 下標如果當前的右端點 大於等於k 且 且最大下標大於 r 那就可以在這個區間中查詢但是不一定這個區間存在 因為也有可能是 在 小於k的那段而且 下標是 由低到高 所以 能左邊 最好左邊最好 返回的不是該點的下標 而是這個點所以 也就是這個l,r

#include

using namespace std;

const

int n =

1e5+

10,inf =

0x3f3f3f3f

;struct nodetr[n *4]

;int a[n]

,id[n]

;int n,m;

void

pushup

(int u)

void

build

(int u,

int l,

int r);if

(l == r)

int mid =

(l + r)

>>1;

build

(u<<

1,l,mid)

;build

(u<<1|

1,mid +

1,r)

;pushup

(u);

}void

modify

(int u,

int k)

int mid =

(tr[u]

.l + tr[u]

.r)>>1;

if(k <= mid)

modify

(u<<

1,k)

;else

modify

(u<<1|

1,k)

;pushup

(u);

}int

query

(int u,

int k,

int r)

int ans =-1

;int mid =

(tr[u]

.r + tr[u]

.l)>>1;

if(k <= mid && tr[u<<1]

.maxp > r)

ans =

query

(u<<

1,k,r);if

(ans !=-1

)return ans;

if(tr[u<<1|

1].r>=k&&tr[u<<1|

1].maxp > r)

ans =

query

(u<<1|

1,k,r)

;return ans;

}int

main()

build(1

,1,n);

int ans =0;

while

(m--

)else}}

return0;

}

2019CCPC網路選拔賽補題

hdu6703 題意就不說了,直接分析吧。對於1操作,a pos 1e7,但是我們每次詢問是 1,n 範圍內的,這個操作顯然就是把這個點給刪了。對於2操作,詢問 1,r 區間內 k且不等於a i 1 i r 的最小的數。題目做法如下 對位置建權值線段樹,每個結點表示乙個區間,每個結點維護乙個區間的位...

2019CCPC網路預選賽解題報告

hdu 6709 fishing master hdu 6702 題目 hdu 6702 題意 給乙個a,b,輸出 a xor c b xor c 值最小的正整數c 型別 思維 思路 輸出a b,如果a b 0輸出1即可 includeusing namespace std define ll lo...

2019 CCPC 網路選拔 array

給乙個 1 到 n 的排列 現在有 m 個操作,每個操作是下面的一種 t leq 10,1 leq n leq 10 5,1 leq m leq 10 5 1 leq k leq n 考場上頭鐵,硬肝了 4h 結考後 20 分鐘調出來,1a.但想出來還是很高興的 我們會發現每次給出的 k 都在 1,...