苏州公司建设网站首页,全国网站开发赛,免费移动版wordpress,今天最近的新闻P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治欧几里得距离) 记得上一次欧几里得距离的转化是CF1093G Multidimensional Queries#xff0c;我们使用了点对在四种方向分别考虑并用 \(\max\) 合并的方法解决#xff0c;现在使用一种类似的方法。 \(\bigstar\texttt{Trick}\)… P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治欧几里得距离) 记得上一次欧几里得距离的转化是CF1093G Multidimensional Queries我们使用了点对在四种方向分别考虑并用 \(\max\) 合并的方法解决现在使用一种类似的方法。 \(\bigstar\texttt{Trick}\) 将点对的统计钦定为查询点在修改点在右上方这样两个点之间的距离就是 \((A_xB_x)-(A_yB_y)\)。 那么现在只用将图旋转 \(\frac{\pi}{2}\times 4\)就可以覆盖所有情况了。 对于这道题怎么提取出左下右上点对呢CDQ 分治 首先的时间限制作为第一维 \(t_1\le t_2\)后面满足 \(x_1\le x_2,y_1\le y_2\)。 四次 CDQ 即可 // Author:A weak man named EricQian
#includebits/stdc.h
using namespace std;
#define infll 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define Maxn 2000005
#define pb push_back
#define pa pairint,int
#define fi first
#define se second
typedef long long ll;
inline int rd()
{int x0;char ch,t0;while(!isdigit(ch getchar())) t|ch-;while(isdigit(ch)) xx*10(ch^48),chgetchar();return xt?-x:x;
}
inline ll maxll(ll x,ll y){ return xy?x:y; }
inline ll minll(ll x,ll y){ return xy?x:y; }
inline ll absll(ll x){ return x0ll?x:-x; }
inline ll gcd(ll x,ll y){ return (y0)?x:gcd(y,x%y); }
int n,m,MAX;
struct QUERY
{int num,opt,x,y,ans;QUERY(int N0,int O0,int X0,int Y0,int Ainf):num(N),opt(O),x(X),y(Y),ans(A){}
}q[Maxn1];
bool operator (QUERY a,QUERY b){ return (a.x!b.x)?(a.xb.x):(a.yb.y); }
bool cmpnum(QUERY x,QUERY y) { return x.numy.num; }
bool cmpx(QUERY x,QUERY y) { return (x.x!y.x)?(x.xy.x):(x.yy.y); }
struct BIT
{int MIN[Maxn];inline void init(){ memset(MIN,0x3f,sizeof(MIN)); }inline void add(int x,int val){ while(x1000005) MIN[x]min(MIN[x],val),xx(-x); }inline void del(int x){ while(x1000005) MIN[x]inf,xx(-x); }inline int query(int x){ int retinf; while(x) retmin(ret,MIN[x]),x-x(-x); return ret; }
}T;
inline void Turn()
{for(int i1;iMAX;i){int xq[i].x,yq[i].y;q[i].x1000005-y1,q[i].yx;}
}
void solve(int nl,int nr)
{if(nlnr) return;int mid(nlnr)1;solve(nl,mid),solve(mid1,nr);sort(qnl,qmid1,cmpx),sort(qmid1,qnr1,cmpx);int Lnl,Rmid;for(;Lmid;L){if(q[L].opt1) continue;while(Rnr q[R1]q[L]){R;if(q[R].opt2) continue;T.add(1000005-q[R].y1,q[R].xq[R].y);}q[L].ansmin(q[L].ans,T.query(1000005-q[L].y1)-q[L].x-q[L].y);}for(int imid1;iR;i){if(q[i].opt2) continue;T.del(1000005-q[i].y1);}
}
int main()
{//ios::sync_with_stdio(false); cin.tie(0);//freopen(.in,r,stdin);//freopen(.out,w,stdout);nrd(),mrd(),T.init();for(int i1,x,y;in;i) xrd()1,yrd()1,q[MAX]QUERY(0,1,x,y);for(int i1,opt,x,y;im;i)optrd(),xrd()1,yrd()1,q[MAX]QUERY(i,opt,x,y);for(int tu1;tu4;tu,Turn()) sort(q1,qMAX1,cmpnum),solve(1,MAX);sort(q1,qMAX1,cmpnum);for(int iMAX;i1;i--) if(q[i].opt2) printf(%d\n,q[i].ans);//fclose(stdin);//fclose(stdout);return 0;
}