題意:在乙個大小為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被統...