hdu 5481 區間離散 組合

2021-07-05 23:22:37 字數 1122 閱讀 6534

第二個樣例解釋:

集合中含有2個區間:乙個是[0,2],編號為1,乙個是[1,3],編號為2。

集合的子集有4個:

1、空集,集合中區間的並的長度為0

2、,集合中區間的並的長度為2

3、,集合中區間的並的長度為2

4、,集合中區間的並為[0,3],長度為3

考慮某乙個區間對於答案的貢獻:

若某個區間沒有被其它區間覆蓋,則該區間在子集中出現的總次數為:2^(n-1)次(總子集數-去掉該區間的子集總數)

若某個區間被覆蓋了1次,即有2個區間重疊,那麼該區間在子集中出現總次數為:2^(n-1)+2^(n-2)次(第1個區間在子集中出現的次數+第2個區間在子集中出現且第1個區間不出現的總次數)

…………

可以得到

若該區間被覆蓋了k(k>=0)次,即有k+1個區間重疊,得到該區間在所有子集中出現的總次數:2^(n-1)+2^(n-2)+……+2^(n-k-1)

如何統計每乙個區間的重疊次數?

對於輸入的每乙個區間的兩個端點,給乙個權值,左端點為1,右端點為-1。然後把所有端點按照位置從小到大排序。從左往右掃一遍,累加端點的權值,得到的當前的權值和就是當前所在區間的重疊次數。

累加每個區間的重疊次數*區間長度,即為所求。

#include#include#include#includeusing namespace std;  

typedef __int64 ll;

#define maxn 100005

#define mod 1000000007

struct pa[maxn<<1];

ll ans,sum[maxn],p[maxn];

bool cmp(p x,p y)

int main()

sum[1]=p[n-1];

for(i=2;i<=n;++i) sum[i]=(sum[i-1]+p[n-i])%mod;

sort(a+1,a+n+n+1,cmp);

int ans=0,cnt=0;

for(i=1;iprintf("%d\n",ans);

} return 0;

}

hdu 5481 數學期望 區間合併

題解 實際上求的是所有子集的並集長度之和。把座標離散化之後,可以單獨考慮每一段區間在並集內部的出現次數,如果有m個大區間覆蓋這段小區間,就會發現當且僅當這m個區間都不在子集中時,這一小段區間不會成為並集的一部分,所以一共有2n 2n m 個子集包含這段小區間。把長度乘以出現次數即可。總結 1 出現區...

BZOJ4653 區間,離散化 線段樹

time 2016.08.09 author xiaoyimi 傳送門思路 當時打同步賽的時候 花了3h去做t3提答 大概玩了50分 回來看t1竟然是懵逼狀態 想了一會,滿腦子都是離散化後差分字首和處理blabla 但不知道怎麼處理區間覆蓋大於m時答案的最優性 為什麼當時連按區間大小排序的思路都沒有...

hdu 1698 區間更新

基礎題 初學 include include using namespace std define lson l m rt 1 define rson m 1 r rt 1 1 const int maxn 101000 int h w n int col maxn 2 標記是否當前節點梗係 int...