P4169 [Violet]天使玩偶/SJY摆棋子

Posted 2529102757ab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4169 [Violet]天使玩偶/SJY摆棋子相关的知识,希望对你有一定的参考价值。

  1 // luogu-judger-enable-o2
  2 #include<cstdio> 
  3 #include<iostream>
  4 using namespace std;
  5 const int maxn=1e7+10;
  6 const int inf=2e7+7;
  7 struct node
  8 
  9     int x,y,id,ans,time;
 10 a[maxn],b[maxn],tt[maxn];;
 11 int flag;
 12 int len,x,y;
 13 int n,q;
 14 struct XX
 15 
 16     int c[maxn];
 17     int  lowbit(int x)
 18     
 19         return x&(-x);
 20     
 21     void update(int x,int w)
 22     
 23         for(;x<=len;x+=lowbit(x))
 24         
 25             c[x]=max(w,c[x]);
 26         
 27     
 28     int sum(int x)
 29     
 30         int res=0;
 31         for(;x;x-=lowbit(x))
 32         
 33             res=max(res,c[x]);
 34         
 35         if(res)
 36         
 37             return res;
 38         
 39         else
 40         return -inf;
 41     
 42     void clear(int x)
 43     
 44         for(;c[x];x+=lowbit(x))
 45         
 46             c[x]=0;
 47         
 48     
 49 XX;
 50 void CDQ(int l,int r)
 51 
 52     if(l == r) return;
 53     int mid =(l+r)>>1;
 54     CDQ (l,mid);
 55     CDQ(mid+1,r);
 56     int t1=l;
 57     int t2=mid+1;
 58     int k=l;
 59     while(t2<=r)
 60     
 61         while(t1<=mid&&b[t1].x<=b[t2].x)
 62         
 63             if(b[t1].time==1)
 64             
 65                 XX.update(b[t1].y,b[t1].x+b[t1].y);
 66               
 67              tt[k++]=b[t1++];
 68         
 69         if(b[t2].time==2)
 70         
 71             a[b[t2].id].ans=min(a[b[t2].id].ans,b[t2].x+b[t2].y-XX.sum(b[t2].y));    
 72         
 73         tt[k++]=b[t2++];
 74     
 75     for(int i=l;i<=t1-1;i++)
 76     
 77         if(b[i].time==1)
 78         
 79             XX.clear(b[i].y);
 80         
 81     
 82     
 83     while(t1<=mid)
 84     
 85         tt[k++]=b[t1++];
 86     
 87     for(int i=l;i<=r;i++)
 88     
 89         b[i]=tt[i];
 90     
 91 
 92 void solve(int x1,int y1)
 93 
 94     for(int i=1;i<=n+q;i++)
 95     
 96         b[i]=a[i];
 97         if(x1)
 98         
 99             b[i].x=len-b[i].x;
100         
101         if(y1)
102         
103             b[i].y=len-b[i].y;
104         
105     
106     CDQ(1,n+q);
107 
108 int main()
109 
110     scanf("%d%d",&n,&q);
111     for(int i=1;i<=n;i++)
112     
113         scanf("%d%d",&x,&y);
114         a[i].time=1;
115         a[i].id=i;
116         a[i].x=++x;
117         a[i].y=++y;
118         len=max(len,max(x,y));
119     
120     for(int i=n+1;i<=n+q;i++)
121     
122         scanf("%d%d%d",&flag,&x,&y);
123         a[i].time=flag;
124         a[i].id=i;
125         a[i].x=++x;
126         a[i].y=++y;
127         a[i].ans=inf;
128         len=max(len,max(x,y));
129     
130     len++;
131     solve(0,0);
132     solve(0,1);
133     solve(1,0);
134     solve(1,1);
135     for(int i=n+1;i<=n+q;i++)
136     
137         if(a[i].time ==2)
138         
139             printf("%d\n",a[i].ans);
140         
141     
142     return 0;
143   

 

以上是关于P4169 [Violet]天使玩偶/SJY摆棋子的主要内容,如果未能解决你的问题,请参考以下文章

ybt金牌导航4-2-1luogu P4169[Violet]天使玩偶 / SJY摆棋子(K-D tree 模板)

SJY摆棋子&&[Violet 3]天使玩偶

[Violet]天使玩偶/SJY摆棋子

[Violet]天使玩偶/SJY摆棋子

luogu4169 [Violet]天使玩偶/SJY摆棋子

[Violet]天使玩偶/SJY摆棋子