摩爾瓦多的移動**公司摩基亞(mokia)設計出了一種新的使用者定位系統。和其他的定位系統一樣,它能夠迅速回答任何形如「使用者c的位置在哪?」的問題,精確到公釐。但其真正高科技之處在於,它能夠回答形如「給定區域內有多少名使用者?」的問題。
在定位系統中,世界被認為是乙個w*w的正方形區域,由1*1的方格組成。每個方格都有乙個座標(x,y),1<=x,y<=w。座標的編號從1開始。對於乙個4*4的正方形,就有1<=x<=4,1<=y<=4(如圖):
請幫助mokia公司編寫乙個程式來計算在某個矩形區域內有多少名使用者。
有三種命令,意義如下:
命令引數意義0
w初始化乙個全零矩陣。本命令僅開始時出現一次。
1x y a
向方格(x,y)中新增a個使用者。a是正整數。
2x1 y1 x2 y2
查詢x1<=x<=x2,y1<=y<=y2所規定的矩形中的使用者數量
3無引數
結束程式。本命令僅結束時出現一次。
對所有命令2,輸出乙個一行整數,即當前詢問矩形內的使用者數量。
0 41 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
輸入輸出
意義0 4
大小為4*4的全零正方形
1 2 3 3
向(2,3)方格加入3名使用者
2 1 1 3 3
查詢矩形1<=x<=3,1<=y<=3內的使用者數量
3查詢結果
1 2 2 2
向(2,2)方格加入2名使用者
2 2 2 3 4
查詢矩形2<=x<=3,2<=y<=4內的使用者數量
5查詢結果
3終止程式
1<=w<=2000000
1<=x1<=x2<=w
1<=y1<=y2<=w
1<=x,y<=w
0命令1不超過160000個。
命令2不超過10000個。
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6const
int maxn=200010;7
const
int maxs=2000010;8
struct
node
13}p[maxn],t[maxn];
14int
bit[maxs],s,op,cnt;
15int
vis[maxs],dep;
16void add(int x,int
d)24}25
int query(int
x)32
return
ret;33}
3435
bool
cmp1(node a,node b)
3839
bool
cmp2(node a,node b)
42void solve(int l,int
r)49
for(int i=l;i<=r;i++)p[i]=t[i];
50 solve(l,mid);++dep;
51for(int i=mid+1,j=l;i<=r;i++)
58 solve(mid+1
,r);
59 t1=l;t2=mid+1;60
for(int i=l;i<=r;i++)
61if(t2==r+1||p[t1].x];
62else t[i]=p[t2++];
63for(int i=l;i<=r;i++)p[i]=t[i]; 64}
6566
intmain()
76else83}
84 sort(p+1,p+cnt+1
,cmp1);
85 solve(1
,cnt);
86 sort(p+1,p+cnt+1
,cmp2);
87for(int i=1,ret;i<=cnt;i++)
88if(p[i].d==-1)96
return0;
97 }
2 遞迴與分治
遞迴的概念 直接或間接的呼叫自身的演算法稱為遞迴演算法 當乙個函式以及它的乙個變數是由函式自身定義時,稱這個函式是雙遞迴函式。聽不懂,看下面分析 分析 a n,m 的自變數m的每乙個取值都定義了乙個單變數函式。m 0時是 2 m 1時,a 1,1 a a 0,1 1 a 1,0 2,a n,1 a ...
L2 遞推 遞迴 分治
f1 fn 順推法,對應遞推 fn f1 倒推法,對應遞迴 怎麼解決遞推的問題 找到初始狀態 找到遞推公式 開始迴圈算即可 自己找到遞推關係!用遞推的方式求 fibonacci 數列 f 0 0 f 1 1 for int i 2 i n i f i f i 1 f i 2 簡單的排列組合 排列 從...
分治法(2) 最大子段和
題目 給定n個元素的整數列 可能為負整數 a1,a2,an.求形如 ai,ai 1,aj i j 1 n,i j 的子段使其和為最大。當所有整數為負整數時定義其最大欄位和為0。例如當 a1,a2,a3,a4,a5,a6 2,11,1,13,5,2 最大欄位和為i 2,j 4 下標從1開始 如果直接用...