%
給定乙個 n×n
n\times n
n×n 的矩陣,對於 q
qq 組 x1,
y1,x
2,y2
,k
x1,y1,x2,y2,k
x1,y1,
x2,y
2,k,你需要求出該子矩陣內的第 k
kk 大的值。
資料範圍1⩽n
⩽500,1
⩽q
⩽60000
1\leqslant n\leqslant 500,1\leqslant q\leqslant 60000
1⩽n⩽50
0,1⩽
q⩽60
000%
考慮整體二分,用二維樹狀陣列統計子矩陣內大於等於當前二分值的數的個數。注意詢問區間的空間要開到 n×n
+q
n\times n+q
n×n+
q,時間複雜度為 t(n
)=θ(
nlog2
3n
)t(n)=\theta(n\log_2^3n)
t(n)=θ
(nlog23
n)
#include
using
namespace std;
#define maxn 1210
#define maxq 400010
#define inf 2147483647
int n;
struct queq[maxq<<1]
,q1[maxq<<1]
,q2[maxq<<1]
;int arr[maxn]
[maxn]
;void
add(
int x,
int y,
int d)
intbase_sum
(int x,
int y)
intsum
(int x1,
int y1,
int x2,
int y2)
int ans[maxn]
,cnt=0;
void
solve
(int l=0,
int r=
1e9,
int ql=1,
int qr=cnt)
int mid=
(l+r)
>>
1,q1=
0,q2=0;
for(
int i=ql;i<=qr;i++
)else
}for
(int i=
1;i<=q1;i++)if
(q1[i]
.op==1)
add(q1[i]
.x1,q1[i]
.y1,
-q1[i]
.y2)
;for
(int i=
1;i<=q1;i++
) q[i+ql-1]
=q1[i]
;for
(int i=
1;i<=q2;i++
) q[i+ql+q1-1]
=q2[i]
;solve
(l,mid,ql,ql+q1-1)
;solve
(mid+
1,r,ql+q1,qr);}
int t[maxn]
[maxn]
;void
change
(int a,
int b,
int c)
; q[
++cnt]
=(que);}
int qs=0;
void
query
(int a,
int b,
int c,
int d,
int k);}
intmain()
for(
int i=
1,a,b,c,d,k;i<=m;i++
)solve()
;for
(int i=
1;i<=qs;i++
)printf
("%d\n"
,ans[i]);
return0;
}
luogu P1505 國家集訓隊 旅遊
題面傳送門 第一次一遍過國集紫題。好激動。一看就是樹剖,只不過操作有點多。把每條邊的權值放在兒子節點即可。對於取相反數放懶標記即可。其他是樹剖正常操作。實現 include include define max a,b a b a b define min a,b a b a b using nam...
Luogu P2839 國家集訓隊 middle
首先 b,c 是必選的,然後選一段 a,b 的字尾和一段 c,d 的字首 都可空 對於中位數 這裡中位數採用這道題的定義 有個常見的處理方式 二分 mid,將 0,則說明 mid 的佔到了一半以上,即中位數 mid。採用這種處理方式,二分中位數,由於要中位數盡量大,所以要貪心,選字尾和字首使得大於等...
Luogu P1975 國家集訓隊 排隊
luogu 1975 國家集訓隊 排隊 quad 很明顯交換後能增加或減少的逆序對的個數只和這兩個數和這兩個數中間的數有關。quad 於是我們需要乙個資料結構能夠快速求出乙個區間內比乙個特定數值大 小的個數。quad 這個資料結構可以是分塊,這在分塊九講裡面有提到過,這裡就不再闡述具體操作過程了。q...