P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】
生活随笔
收集整理的這篇文章主要介紹了
P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P4169
題目大意
nnn個點,然后每次操作
解題思路
定義tit_iti?表示第幾個操作,開始就有的點tit_iti?為000
假設最近的點在左上角,那么有要求ti<tj,xi<xj,yi<yjt_i<t_j,x_i<x_j,y_i<y_jti?<tj?,xi?<xj?,yi?<yj?構成了一個三維偏序。
對于一個點對(i,j)(i,j)(i,j),權值是xi?xj+yi?yj?xi+yi?(xj+yj)x_i-x_j+y_i-y_j\Rightarrow x_i+y_i-(x_j+y_j)xi??xj?+yi??yj??xi?+yi??(xj?+yj?)。用樹狀數組維護xi+yix_i+y_ixi?+yi?的前綴maxmaxmax即可
然后旋轉一下坐標就行了,時間復雜度O(nlog?2n)O(n\log^2n)O(nlog2n)
codecodecode
/*#pragma GCC optimize(2) %:pragma GCC optimize(3) %:pragma GCC optimize("Ofast")*/ #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #define lowbit(x) (x&-x) using namespace std; const int N=6e5+10,K=1e6+1; struct node{int x,y,id,t; }a[N],b[N]; int n,m,tot,cnt,t[K+10],ans[N]; int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f; } void print(int x){if (x>9) print(x/10); putchar(x%10+48); return; } void Change(int x,int val){x++;while(x<=K){t[x]=max(t[x],val);x+=lowbit(x);}return; } void Clear(int x){x++;while(x<=K){t[x]=-1e7;x+=lowbit(x);} return; } int Ask(int x){ int ans=-1e7;x++;while(x){ans=max(ans,t[x]);x-=lowbit(x);}return ans; } bool cmp(node x,node y) {return x.t<y.t;} void merge(int l,int mid,int r){int L=l,R=mid+1,z=l;while(z<=r){if((a[L].x<=a[R].x||R>r)&&L<=mid)b[z++]=a[L++];else if(a[L].x>a[R].x||L>mid)b[z++]=a[R++];}for(int i=l;i<=r;i++)a[i]=b[i];return; } void cdq(int l,int r){if(l==r)return;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);int z=l;for(int i=mid+1;i<=r;i++){while(z<=mid&&a[z].x<=a[i].x){if(a[z].id==0)Change(a[z].y,a[z].x+a[z].y);z++;}if(a[i].id!=0)ans[a[i].id]=min(ans[a[i].id],a[i].x+a[i].y-Ask(a[i].y));}for(int i=l;i<z;i++)Clear(a[i].y);merge(l,mid,r);return; } int main() {n=read();m=read(); for(int i=1;i<=n;i++){a[i].x=read()+1;a[i].y=read();a[i].t=i;}for(int i=1;i<=m;i++){int op=read();a[++n].t=n;a[n].x=read()+1;a[n].y=read(); if(op==2)a[n].id=++cnt;}sort(a+1,a+1+n,cmp);memset(t,0xcf,sizeof(t));memset(ans,0x3f,sizeof(ans));cdq(1,n);for(int i=1;i<=n;i++)a[i].x=K-a[i].x;sort(a+1,a+1+n,cmp);cdq(1,n);for(int i=1;i<=n;i++)a[i].y=K-a[i].y;sort(a+1,a+1+n,cmp);cdq(1,n);for(int i=1;i<=n;i++)a[i].x=K-a[i].x;sort(a+1,a+1+n,cmp);cdq(1,n);for(int i=1;i<=cnt;i++)print(ans[i]),putchar('\n'); }總結
以上是生活随笔為你收集整理的P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隐藏文件和显示隐藏的文件怎么设置通过设置
- 下一篇: nssl1452-排行榜【数论】