hdu5820 詢問簡單路徑 主席樹

2021-08-01 23:52:21 字數 1602 閱讀 6319

題意:在乙個大小為50000*50000的矩形中,有n個路燈。(n<=500000)

詢問是否每一對路燈之間存在一條道路,使得長度為|x1 – x2| + |y1 – y2|且每個拐彎點都是路燈。

ps注意 實現的時候下方y要+1(邊界問題) 主席樹root維是記錄的x棵樹的字首的樹根,每棵樹記錄的是y的分布情況

#include using namespace std;

#define maxn 9000000

#define lson l,mid,rt<<1

#define rson mid,r+1,rt<<1|1

#define getmid int mid=(l+r)>>1;

#define mem(x,v) memset(x,v,sizeof(x));

#define ft first

#define sd second

#define mp make_pair

#define pii pairint n,flag;

mapmyp;

int siz;

int sum[maxn],ls[maxn],rs[maxn];

int root[51000];

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

void update(int l,int r,int x,int &y,int pos,int val)

ls[y]=ls[x]; rs[y]=rs[x];

getmid

if (pos <= mid) update(l,mid,ls[x],ls[y],pos,val);

else update(mid+1,r,rs[x],rs[y],pos,val);

sum[y]=sum[ls[y]]+sum[rs[y]];

}int query(int l,int r,int rt,int x,int y)

getmid

int res=0;

if (x <= mid) res+=query(l,mid,ls[rt],x,y);

if (mid < y) res+=query(mid+1,r,rs[rt],x,y);

return res;

}int mx[51000],my[51000];

pii po[501000];

void solve()

mx[x1]=i; my[y1]=i; last=root[x1];

}}int main()

}n=num;flag=1;

sort(po+1,po+n+1);

solve();

for (int i=1;i<=n;i++) po[i].ft=50001-po[i].ft;

sort(po+1,po+n+1);

solve();

printf("%s\n",flag ? "yes" : "no" );

}}/*

51 1

1 21 3

2 13 3

*/

多校賽第7場 hdu5820 Lights 主席樹

比賽時候卡在乙個構造題上了,結束改了一行1a,心痛。沒有時間看別的題,這是個很嚴重的問題。乙個50000x50000的網格,上面有500000個紅綠燈 整點 問這些紅綠燈兩兩之間是否都有一條這樣的路,使得路上每個轉彎點都有交通燈。題解上感覺寫的有點問題。對於每個交通燈,找到距離它最近的上下左的交通燈...

乙個簡單的詢問 HYSBZ 5016

給你乙個長度為n的序列ai,1 i n和q組詢問,每組詢問讀入l1,r1,l2,r2,需輸出 get l,r,x 表示計算區間 l,r 中,數字x出現了多少次。input 第一行,乙個數字n,表示序列長度。第二行,n個數字,表示a1 an 第三行,乙個數字q,表示詢問個數。第4 q 3行,每行四個數...

bzoj5016 乙個簡單的詢問

這種不可直接做的問題 資料範圍又很小 考慮莫隊 但是,l1,l2,r1,r2四維?考慮把詢問二維差分!f a,b 表示,詢問 1,a 1,b 的答案 所以,ans l1,r1,l2,y2 f r1,r2 f l1 1,r2 f r1,l2 1 f l1 1,l2 1 正確性的話,考慮每乙個種類k被統...