• BZOJ 2716 Violet 3 天使玩偶


    2716: [Violet 3]天使玩偶

    Time Limit: 80 Sec  Memory Limit: 128 MB
    Submit: 2145  Solved: 928
    [Submit][Status][Discuss]

    Description

    Input

    Output

    Sample Input

    100 100
    81 23
    27 16
    52 58
    44 24
    25 95
    34 2
    96 25
    8 14
    97 50
    97 18
    64 3
    47 22
    55 28
    89 37
    75 45
    67 22
    90 8
    65 45
    68 93
    87 8
    61 45
    69 72
    38 57
    58 76
    45 34
    88 54
    27 8
    35 34
    70 81
    25 24
    97 97
    4 43
    39 38
    82 68
    27 58
    2 21
    92 88
    96 70
    97 29
    14 53
    6 42
    1 2
    35 84
    64 88
    63 57
    53 40
    82 59
    49 56
    75 72
    29 30
    50 1
    40 83
    52 94
    22 35
    39 1
    94 88
    89 96
    79 46
    33 75
    31 42
    33 95
    6 83
    90 66
    37 54
    35 64
    17 66
    48 37
    30 8
    95 51
    3 51
    90 33
    29 48
    94 78
    53 7
    1 26
    73 35
    18 33
    99 78
    83 59
    23 87
    4 17
    53 91
    98 3
    54 82
    85 92
    77 8
    56 74
    4 5
    63 1
    26 8
    42 15
    48 98
    27 11
    70 98
    36 9
    78 92
    34 40
    42 82
    64 83
    75 47
    2 51 55
    1 7 62
    2 21 62
    1 36 39
    1 35 89
    1 84 15
    2 19 24
    1 58 53
    2 52 34
    1 98 49
    1 4 100
    1 17 25
    1 30 56
    1 69 43
    2 57 23
    2 23 13
    1 98 25
    2 50 27
    1 84 63
    2 84 81
    2 84 77
    1 60 23
    2 15 27
    1 9 51
    1 31 11
    1 96 56
    2 20 85
    1 46 32
    1 60 88
    2 92 48
    1 68 5
    2 90 17
    1 16 46
    2 67 5
    2 29 83
    1 84 70
    2 68 27
    1 99 33
    2 39 89
    2 38 28
    1 42 3
    1 10 60
    2 56 29
    2 12 60
    2 46 51
    2 15 73
    1 93 42
    1 78 82
    1 66 20
    1 46 17
    2 48 5
    1 59 61
    1 87 59
    2 98 72
    1 49 3
    2 21 10
    1 15 4
    1 48 14
    2 67 75
    2 83 77
    1 88 65
    2 100 93
    2 58 83
    1 29 80
    2 31 88
    2 92 94
    1 96 66
    1 61 82
    2 87 24
    1 64 83
    1 28 87
    2 72 90
    2 7 3
    1 86 3
    2 26 53
    2 71 2
    2 88 24
    1 69 60
    1 92 44
    2 74 94
    1 12 78
    2 1 2
    1 4 73
    1 58 5
    1 62 14
    2 64 58
    2 39 45
    1 99 27
    1 42 21
    1 87 2
    2 16 98
    2 17 21
    2 41 20
    1 46 72
    1 11 62
    2 68 29
    1 64 66
    2 90 42
    2 63 35
    1 64 71

    Sample Output

    3
    8
    6
    7
    7
    6
    6
    12
    11
    4
    5
    6
    8
    1
    7
    6
    4
    9
    2
    2
    8
    9
    6
    4
    7
    5
    8
    7
    5
    5
    5
    7
    7
    5
    6
    6
    8
    6
    0
    2
    7
    12
    4
    2
    8
    3
    10

    HINT

    Source

    Vani原创 欢迎移步 OJ2648

    和上道题一样啊,KD-Tree

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 10000010
    #define eps 1e-7
    using namespace std;
    inline int read(){
    	int x=0;int f=1;char ch=getchar();
    	while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    	while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    	return x*f;
    }
    const int MAXN=1e6+10;
    struct node{
    	int d[2],mn[2],mx[2],l,r;
    }p[MAXN],T[MAXN],t;
    int D,n,m,ans,root;
    inline bool operator < (node n,node m){
    	return n.d[D]<m.d[D];
    }
    inline int dis(node n,node m){
    	return abs(n.d[0]-m.d[0])+abs(n.d[1]-m.d[1]);
    }
    namespace KDTree{
    	inline void update(int root){
    		for(int i=0;i<=1;i++){
    			if(T[root].l) T[root].mn[i]=min(T[T[root].l].mn[i],T[root].mn[i]),T[root].mx[i]=max(T[T[root].l].mx[i],T[root].mx[i]);
    			if(T[root].r) T[root].mn[i]=min(T[T[root].r].mn[i],T[root].mn[i]),T[root].mx[i]=max(T[T[root].r].mx[i],T[root].mx[i]);
    		}
    	}
    	inline int build(int l,int r,int now){
    		D=now;
    		int mid=(l+r)>>1;
    		nth_element(p+l,p+mid,p+r+1);
    		T[mid]=p[mid];
    		for(int i=0;i<2;i++){
    			T[mid].mn[i]=T[mid].mx[i]=T[mid].d[i];
    		}
    		if(l<mid) T[mid].l=build(l,mid-1,now^1);
    		if(r>mid) T[mid].r=build(mid+1,r,now^1);
    		update(mid);
    		return mid;
    	}
    	inline int get(int k,node p){
    		int tmp=0;
    		for(int i=0;i<=1;i++){
    			tmp+=max(0,T[k].mn[i]-p.d[i]);
    			tmp+=max(0,p.d[i]-T[k].mx[i]);
    		}
    		return tmp;
    	}
    	inline void insert(int k,int now){
    		if(t.d[now]>=T[k].d[now]){
    			if(T[k].r) insert(T[k].r,now^1);
    			else{
    				T[k].r=++n;T[n]=t;
    				for(int i=0;i<=1;i++)
    					T[n].mn[i]=T[n].mx[i]=t.d[i];
    			}
    		}
    		else{
    			if(T[k].l) insert(T[k].l,now^1);
    			else{
    				T[k].l=++n;T[n]=t;
    				for(int i=0;i<=1;i++)
    					T[n].mn[i]=T[n].mx[i]=t.d[i];
    			}
    		}
    		update(k);
    	}
    	inline void query(int k,int now){
    		int d,dl=inf,dr=inf;
    		d=dis(T[k],t);
    		ans=min(ans,d);
    		if(T[k].l) dl=get(T[k].l,t);
    		if(T[k].r) dr=get(T[k].r,t);
    		if(dl<dr){
    			if(dl<ans) query(T[k].l,now^1);
    			if(dr<ans) query(T[k].r,now^1);
    		}
    		else{
    			if(dr<ans) query(T[k].r,now^1);
    			if(dl<ans) query(T[k].l,now^1);
    		}
    	}
    	void init(){
    		n=read();m=read();
    		for(int i=1;i<=n;i++){
    			p[i].d[0]=read();p[i].d[1]=read();
    		}
    		root=build(1,n,0);
    	}
    	inline int query(node p){
    		ans=inf;query(root,0);
    		return ans;
    	}
    	void solve(){
    		for(int i=1;i<=m;i++){
    			int op=read();t.d[0]=read();t.d[1]=read();
    			if(op==1) insert(root,0);
    			else printf("%d
    ",query(t));
    		}
    	}
    }
    int main(){
    	using namespace KDTree;
    	init();
    	solve();
    	return 0;
    }
    

      

  • 相关阅读:
    【原创】【1】rich editor系列教程。前期准备,兼容
    html5 video,audio控制播放多次,请求/监测全屏状态
    javascript中的位运算,
    温习classList api
    Fiddler常用功能总结
    小程序测试点总结
    Pycharm使用git版本控制
    python 运行当前目录下的所有文件
    MySQL查询count(*)、count(1)、count(field)的区别收集
    python 操作redis,存取为字节格式,避免转码加
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/8184664.html
Copyright © 2020-2023  润新知