bzoj1935 Shoi2007 園丁的煩惱

2022-03-27 08:10:52 字數 1322 閱讀 4745

有n個點座標為(xi,yi),m次詢問,詢問(a,b)-(c,d)的矩形內有多少點。

0≤n≤500000,1≤m≤500000,0≤xi,yi≤10000000

看完資料範圍傻眼系列。

做法:離線處理

因為這個範圍肯定不能把x y都離散,

所以只把點和詢問的y座標放在一起都離散化,然後一起按x座標排序,

再開乙個樹狀陣列,求出每個需要的點的二維字首和。

不理解的話拿畫圖板畫一下就好了。

細節見**

#include#define maxn 500005

#define lowbit(a) (a&-a)

using

namespace

std;

inline

intread()

while(c>='

0'&&c<='

9')

return x*t;

} int n,m,y[3*maxn],cnt,tx[maxn],ty[maxn],sum[maxn][5

],xa[maxn],ya[maxn],xb[maxn],yb[maxn],c[maxn*3

],siz;

struct

work

}a[5*maxn];

inline

void add(int pos,int

val)

inline

int query(int

pos)

intmain()

for(int i=1;i<=m;i++)

sort(y+1,y+1+cnt);

siz=unique(y+1,y+1+cnt)-y-1; cnt=0

;

for(int i=1;i<=n;i++);

}for(int i=1;i<=m;i++); //把需要計算矩陣和需要的四個點加進運算元組中,二位字首和不用解釋吧。

a[++cnt]=(work);

a[++cnt]=(work);

a[++cnt]=(work);

}sort(a+1,a+1+cnt);

for(int i=1;i<=cnt;i++)

for(int i=1;i<=m;i++)

printf(

"%d\n

",sum[i][1]+sum[i][2]-sum[i][3]-sum[i][4

]);

return0;

}

附個離散寫法

sort -> unique -> lower_bound

bzoj 1935(樹狀陣列)

傳送門 題解 由於是靜態問題所以可以離線處理,所有點 詢問拆成4個 按x排序,二維可以轉成一維,相當於每次query到的就是當前已插入的點,而只有這些點能對query的返回值造成貢獻。p.s.對於x座標相同的插入 詢問,要考慮這幾個操作的先後順序 include using namespace st...

BZOJ 3566 SHOI2014 概率充電器

題目 題意 給定樹形結構的n個元件,每個元件有一定概率自己充電,還有一定概率通過某條邊給其他元件充電,求充電的元件期望個數。n 500000 題解 樹形結構肯定能想到樹形dp,全樹對某點產生的貢獻一般可以通過一到兩遍樹形dp計算得出,本題所求期望等於每個元件被充電的概率之和。設f i 表示i被充電的...

bzoj3566 SHOI2014 概率充電器

n個充電器連成一棵樹。第i個充電器有p i 的概率直接充電。每條導線有一定機率可以導電。可以導電的導線形成的聯通塊中只要存在直接充電的結點整個聯通塊的充電器均進入充電狀態。問期望進入充電狀態的充電器個數 顯然可知我們只需要得到f i 表示i進入充電狀態的概率 那麼a ns f i 我們把無根樹變有根...