BZOJ2509 主席樹 送分題

2021-07-25 08:52:25 字數 1431 閱讀 1300

題意

給出平面上的m條平行於座標軸的線段,問有多少個正方形。

這題其實可以o(

n3) 暴力10秒卡過去……

對於乙個點(x

,y) ,因為線段都是垂直於座標軸的,我們可以計算出通過它的線段的四個端點。又因為每條線段沒有重疊部分,所以可以用類似並查集的方法o(

n2) 處理出來。

那麼暴力就是列舉每個點作為正方形的乙個端點,然後列舉正方形的邊長再判斷。

把平面分成2n

條對角線,可以證明每個正方形的兩個對角肯定在同一條線段上。

然後對於每條對角線,題目可以轉化為有多少對點在彼此的邊長範圍內。

主席樹處理。o(

n2+n

2log

n)

輕鬆rank(倒數)1

#include 

#include

#include

#include

#define n 1010

using

namespace

std;

int n,m,ans,l[n][n],d[n][n],u[n][n],r[n][n];

inline

void read(int &x)

int sl(int x,int y)

int sd(int x,int y)

int sr(int x,int y)

int su(int x,int y)

struct ftt[n<<4];

int t,rt[n],tc;

void insert(int &x,int y,int d)

int query(int x,int l,int r)

void build(int &x,int l,int r)

inline

void build()

inline

void clear()

inline

void insert(int x,int l,int d)

inline

int query(int x,int d)

}b;inline

int calc(int x,int y)

return res;

}int main()else

}for(int i=0;i<=n;i++)

for(int j=0,x,y;j<=n;j++)

sl(i,j),sd(i,j),

sr(i,j),su(i,j);

b.build();

for(int i=0,x,y,j;i<=n;i++)ans+=calc(i,0)+calc(0,i+1);

return

printf("%d\n",ans),0;

}

BZOJ2588 主席樹 樹上差分

這種類似於第k小的題,一般容易想到主席樹,但是樹鏈並不能不是乙個按順序的序列,使用樹鏈剖分也不太容易維護幾條鏈之間的第k小關係。但是可以從主席樹的字首和思想入手,一般情況的主席樹,查詢的時候是query r query l 1 來詢問區間內的數值數量,在這一題裡面,可以考慮到樹上差分,從樹根開始,以...

bzoj2653 二分 主席樹

對於每乙個詢問二分答案。設當前答案為x,將 x的數的權值設為1,當 b 1,c 1 的權值和 a,b 權值和最大的字尾 c,d 權值和最大的字首 0時x可行。先對每個數離散,然後以每個值建立主席樹記錄區間和 最大字首 最大字尾就可以了。時間複雜度 o n log3n 1 include2 inclu...

bzoj2653 Middle 二分 主席樹

這題厲害啊。根本想不到。據說是clj的題?首先要想到二分答案,想到就解出一半了。假設有乙個值x,如果x是區間 l,r 的中位數,且l a,b r c,d 那麼答案一定 x 否則答案一定 那麼如何判斷x是否是 l,r 的中位數呢?實際上,如果使用二分的話,我們不需要知道x是否一定是 l,r 的中位數,...