題意
給出平面上的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 的中位數,...