監視任務 線段樹以及貪心排序

2021-10-05 15:21:18 字數 1541 閱讀 6527

時間限制:c/c++ 2秒,其他語言4秒

空間限制:c/c++ 131072k,其他語言262144k

64bit io format: %lld

題目描述

????在課餘會接受一些民間的鷹眼類委託,即遠距離的狙擊監視防衛。

????一共接到了?份委託,這些委託與?個直線排布的監視點相關。

第?份委託的內容為:對於區間[??, ??]中的監視點,至少要防衛其中的??個。

????必須完成全部委託,並且希望選取盡量少的監視點來防衛。

輸入描述:

第一行,兩個正整數?,?。

接下來?行,每行三個整數??,??,??。

輸出描述:

一行,乙個整數,即所需防衛的最少監視點數量。

輸入:

1153

73810

3681

13110

111

輸出:

6
資料:樹狀陣列徹底入門

這是我學長寫的,很好!我就是通過這個學的,可理解後看**,有詳細的解釋

思路:

先進行排序按右端點從小到大排,在進行設定監視點,通過單點更新以及區間求和來解決問題,若夠了,則不必再設定,若不夠則從右往左進行設定

**:

#include

using

namespace std;

/*樹狀陣列可以進行兩種操作

1.給定i,計算a1+a2+...+ai,區間求和

2.給定i和x,進行ai+=x; ,單點更新

*/typedef

long

long

int ll;

const

int n =

1e6+10;

int n, m, arr[n]

, vis[n]

, cnt;

//arr樹狀陣列

struct node

//定義優先順序

}num[n]

;void

add(ll p, ll val)

//單點更新 :如果有乙個值變化,則與這個值有關的都要改變整體改變

}int

query

(ll p)

//區間查詢

return res;

}int

main()

//初始化

sort

(num +

1, num + m +1)

;//排序

for(

int i =

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

} cout <<

query

(n)<< endl;

//求取區間和

return0;

}

Wannafly模擬賽3 監視任務(貪心 線段樹)

思路 把所有約束按照右端點排序。這樣每乙個前面的約束區間 l1,r1 與後面的乙個約束區間 l2,r2 的交,一定為 max l1 l2 r1 對於排序後的區間依次滿足約束,假設當前列舉到的約束還沒有滿足,就不斷把對應區間中最右端的0改為1,這些過程可以用線段樹維護來完成。時間複雜度o n m lo...

牛客練習賽3 F 監視任務 貪心 線段樹

傳送門 然後這題是另乙個特殊情況版本 其實有乙個比較顯然的貪心 我們按照r rr從小到大排序 第乙個區間的右端點最小,那麼這k kk個哨兵肯定是貼這右端點往左放 考慮第二個區間,同樣是往右端點往左防止,這樣對右邊的區間最容易產生貢獻 這個過程用線段樹來維護 攜帶乙個引數k kk表示需要在 l,r l...

pair排序 線段覆蓋 貪心

題目鏈結 思路非常簡單的一道貪心題目,但是在給pair排序的時候出了一點問題 我在使用過載 時發現不起作用,詢問學長後才知是pair自帶了過載,我定義的被覆蓋了,解決方法是用自定義函式 include using namespace std int ans 1 pairline 110 bool c...