bzoj 2716: [Violet 3]天使玩偶

Posted dsrdsr

tags:

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

bzoj 2716: [Violet 3]天使玩偶

链接

bzoj

思路

80s的评测交了五六发、、、貌似卡评测了
只讨论在左下角的点,cdq分支求出。
然后剩下的用坐标对称啥的再来三遍。
不过每次还原这样是会T的。
对x排序,然后搞就过了,(我也不知道,不过还是40s左右)
KD-tree比较快,10s+

代码

/**************************************************************
    Problem: 2716
    User: gryz2016
    Language: C++
    Result: Accepted
    Time:45880 ms
    Memory:52076 kb
****************************************************************/
 
#include <bits/stdc++.h>
#define lowbit(x) (x & -x)
using namespace std;
const int N = 1e6 + 7, maxn = 1e6, M = 5e5 + 7;
char buf[4000001],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,4000000,stdin),p1==p2)?EOF:*p1++)
int read() 
    int x = 0,f = 1;char s = getchar();
    for (;s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;
    for (;s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
    return x * f;

int ans[N],TLE;
struct node 
    int type, x, y, id, jyb;
    node(int nb = 0,int a = 0, int b = 0, int c = 0, int d = 0) 
        jyb = nb, type = a, x = b, y = c, id = d;
    
    bool operator < (const node &b) const 
        return x == b.x ? y < b.y : x < b.x;
    
Q[M * 2], tmp[M * 2];
struct mmp 
    int ma[N];
    void add(int x, int ad) for (int i = x; i <= TLE; i += lowbit(i)) ma[i] = max(ma[i], ad);
    void clear(int x) for (int i = x; i <= TLE; i += lowbit(i)) ma[i] = 0;
    int query(int x) int ans = 0;for (int i = x; i >= 1; i -= lowbit(i)) ans = max(ans, ma[i]);return ans; 
BIT;
   
void cdq(int l, int r) 
    if (l == r) return;
    int mid = (l + r) >> 1;
    int p = l, q = mid + 1, js = l;
    for(int i=l;i<=r;++i)
        if(Q[i].jyb <= mid) tmp[p++]=Q[i];
        else tmp[q++]=Q[i];
    for(int i=l;i<=r;++i) Q[i]=tmp[i];
     
    p=l;
    for(int i=mid+1;i<=r;++i) 
        if(Q[i].type==2) 
            while(Q[p].x<=Q[i].x&&p<=mid) 
                if(Q[p].type==1) BIT.add(Q[p].y,Q[p].x+Q[p].y);
                p++;
            
            int val=BIT.query(Q[i].y);
            if(val) ans[Q[i].id]=min(ans[Q[i].id],Q[i].x+Q[i].y-val);
        
    
    for(int i=l;i<=mid;++i) if(Q[i].type==1) BIT.clear(Q[i].y);
    cdq(l, mid), cdq(mid + 1, r);

int main() 
    int n = read(), m = read(), js = 0, DSR = 0;
    for (int i = 1; i <= n; ++i) 
        int x = read() + 1, y = read() + 1;
        TLE = max(TLE, y);
        TLE = max(TLE, x);
        Q[++js] = node(js, 1, x, y);
    
    for (int i = 1; i <= m; ++i) 
        int opt = read(), x = read() + 1, y = read() + 1;
        TLE = max(TLE, y);
        TLE = max(TLE, x);
        if (opt == 1) 
            Q[++js] = node(js, 1, x, y);
         else 
            Q[++js] = node(js, 2, x, y, ++DSR);
            ans[DSR] = 0x3f3f3f3f;      
        
    
    TLE++;
    sort(Q + 1, Q + 1 + js);
    cdq(1, js);
     
    for (int i = 1; i <= js; ++i) Q[i].x = -Q[i].x + TLE;
    sort(Q + 1, Q + 1 + js);
    cdq(1, js);
     
    for (int i = 1; i <= js; ++i) Q[i].y = -Q[i].y + TLE;
    sort(Q + 1, Q + 1 + js);
    cdq(1, js);
   
    for (int i = 1; i <= js; ++i) Q[i].x = -Q[i].x + TLE;
    sort(Q + 1, Q + 1 + js);
    cdq(1, js);
       
    for (int i = 1; i <= DSR; ++i) printf("%d\n", ans[i]);
    return 0;

以上是关于bzoj 2716: [Violet 3]天使玩偶的主要内容,如果未能解决你的问题,请参考以下文章

Bzoj2716 [Violet 3]天使玩偶

BZOJ2716: [Violet 3]天使玩偶

bzoj 2716[Violet 3]天使玩偶 (CDQ+树状数组)

BZOJ2716 & NKOJ2739:[Violet 3]天使玩偶——题解

BZOJ 2716: [Violet 3]天使玩偶 [CDQ分治]

bzoj 2716 [Violet 3]天使玩偶 CDQ分治