時間限制: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...