思路:
現將每條線段按左端點公升序排序,依次往堆裡加右端點,若果size>k就pop一下。如果size==k並且最小的大於當前l則更新一下。
因為這樣每個左端點的對應右端點一定是最大的,這裡堆的作用相當於事實求出左端點比當前左端點小的線段中第k大的右端點,而這個肯定是最大的當前左端點對應的區間。
#include
using
namespace
std;
#define mod 1000000007
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn=100010;
int n,k,m;
ll sum[maxn];
ll t;
struct nodee[maxn];
bool cmp(node a,node b)
for(int i=0;iscanf("%d%d",&e[i].l,&e[i].r);
}sort(e,e+m,cmp);
int x,y;
ll ans=0;
for(int i=0;iif(q.size()>k)q.pop();
if(q.size()==k&&q.top()>=x)
}printf("%lld\n",ans);
}return
0;}
HDU 5700 區間交(線段樹)
problem description 小a有乙個含有n個非負整數的數列與m個區間。每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。例如樣例中,選擇 2,5 與 4,5 兩個區間就可以啦。input 多組測試資料 第一行三個數n,k,m 1 n 10...
hdu 5700 區間交 線段樹 列舉
傳送門 題意 給定序列a1,a2.an以及m個區間,從m個區間中選出k個區間使k個區間相交的部分和最大。思路 預處理字首和。按照r從小到大l從大到小的順序將所有區間排序,用線段樹維護區間第k小。然後列舉區間的右端點,求出當前第k小左端點,然後計算差值即可。include include includ...
HDU 5700 區間交 離線線段樹
小a有乙個含有n個非負整數的數列與m個區間。每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。例如樣例中,選擇 2,5 與 4,5 兩個區間就可以啦。多組測試資料 第一行三個數n,k,m 1 n 100000,1 k m 100000 接下來一行n個數...