2018牛客練習賽34

2021-09-03 02:53:57 字數 1751 閱讀 3216

c-little w and segment coverage

官方題解

題意:給m個區間,把每個區間上的點都加1,然後問刪除哪乙個點後不會被覆蓋的點最少

我覺得這道題挺好的,就適合我們這些小白做,看題解能夠收穫很多~

哇,線段樹原來還闊以統計區間內小於等於某個數x的個數有多少個呀,我太挫了,這個竟然沒想到,經宋大佬指導後理解了,只要這段區間內的最小值都小於x的話,那麼這段區間不就是個數了蠻

然後刪除這段區間,那麼這段區間的每個值不就都會減少1嘛,所以能覆蓋的點其實就是值大於等於2的點,所以直接找大於等於2的點的個數就行了

#include

"bits/stdc++.h"

using namespace std;

typedef

long

long ll;

const

int maxn=

1e5+5;

const

int mod=

1e9+7;

int n,m;

int min[maxn<<2]

,a[maxn]

;void

pushup

(int id)

void

build

(int id,

int l,

int r)

}int

query

(int id,

int l,

int r,

int ql,

int qr,

int val)

//求[ql,qr]內大於等於val的有多少個

if(ql<=l&&qr>=r && min[id]

>=val)

return

(r-l+1)

;else

}int l[maxn]

,r[maxn]

;int

main()

int cnt=0;

for(

int i=

1;i<=n;i++

)build(1

,1,n);

int ans=0;

int min=n,pos=-1

;//min表示刪除一條邊最少會增加多少個點不能被覆蓋

for(

int i=

1;i<=m;i++)}

cout<" "<}}

官方題解沒有用線段樹,而是直接找值為1的數,然後看區間內值為1的數有多少個,如果刪去這條邊,那麼值為1的就變成0了,那這些點就肯定不會被覆蓋到了,就是這樣統計的

#include

"bits/stdc++.h"

using namespace std;

typedef

long

long ll;

const

int maxn=

1e5+5;

int n,m;

int a[maxn]

,sum[maxn]

,l[maxn]

,r[maxn]

;int

main()

int cnt=0;

for(

int i=

1;i<=n;i++

)int min=n,pos=-1

;for

(int i=

1;i<=m;i++)}

cout<" "<}}

little w and Sum 牛客練習賽34

include using namespace std typedef long long ll const ll maxn 1e5 5 ll s maxn int main ll num 0 ll flag 0 for ll i 0 i小w與tokitsukaze一起玩3ds上的小遊戲,現在他們遇...

little w and Sum 牛客練習賽34

include using namespace std typedef long long ll const ll maxn 1e5 5 ll s maxn int main ll num 0 ll flag 0 for ll i 0 i小w與tokitsukaze一起玩3ds上的小遊戲,現在他們遇...

牛客練習賽34 C

題目描述 小w有m條線段,編號為1到m。用這些線段覆蓋數軸上的n個點,編號為1到n。第i條線段覆蓋數軸上的區間是l i r i 覆蓋的區間可能會有重疊,而且不保證m條線段一定能覆蓋所有n個點。現在小w不小心丟失了一條線段,請問丟失哪條線段,使數軸上沒被覆蓋到的點的個數盡可能少,請輸出丟失的線段的編號...