傳送門
矩陣內點數顯然可以預處理字首和然後簡單容斥一下
具體就是設 $sum[i][j]$ 表示以 $(i,j)$ 為右上角,以 $(0,0)$ 為左下角的矩陣的點數
那麼對於詢問以 $(xa,ya)$ 為左下角,以 $(xb,yb)$ 為右上角的矩形點數
注意到詢問區間是閉的,顯然答案就是 $sum[xb][yb]-sum[xb][ya-1]-sum[xa-1][yb]+sum[xa-1][ya-1]$
但是此題座標系太大
所以要離散化,掃瞄線,樹狀陣列來維護乙個矩陣內的點數
把所有點和詢問離散化(乙個詢問變成 $4$ 個點 $(xa-1,ya-1),(xa-1,yb),(xb,ya-1),(xb,yb)$),按 $x,y$ 為一二關鍵字排序,$x,y$ 相同時實點先,詢問點後
然後樹狀陣列維護當前$y$ 座標小於等於某個數的點數,然後就可以用樹狀陣列求 $sum$ 了
掃瞄的時候更新答案就好了
**好寫,注意樹狀陣列維護時座標要為正,所以集體+1
#include#include#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;inline
intread()
while(ch>='
0'&&ch<='
9')
return x*f;
}const
int n=1e6+7,m=1e7+7
;int
n,m,mx,cnt;
struct
dat}d[m];
//注意離散的點數比較大
intt[m],ans[n];
inline
void add(int x)
inline
int ask(int x)
intmain()
; d[++cnt]=(dat);
d[++cnt]=(dat);
d[++cnt]=(dat);
}sort(d+1,d+cnt+1
);
for(int i=1;i<=cnt;i++)
ans[d[i].id]+=d[i].p*ask(d[i].y);
}for(int i=1;i<=m;i++) printf("
%d\n
",ans[i]);
return0;
}
bzoj1935 Shoi2007 園丁的煩惱
有n個點座標為 xi,yi m次詢問,詢問 a,b c,d 的矩形內有多少點。0 n 500000,1 m 500000,0 xi,yi 10000000 看完資料範圍傻眼系列。做法 離線處理 因為這個範圍肯定不能把x y都離散,所以只把點和詢問的y座標放在一起都離散化,然後一起按x座標排序,再開乙...
P2057 SHOI2007 善意的投票
題目描述 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人...
題解 P2057 SHOI2007 善意的投票
傳送們 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數...