G. Trace ACM-ICPC 2018 徐州赛区网络预赛

线段树啊最重要的是转化。

可这题连题意都没正确理解,就别提转化了。

有一场gg

set+二分可做,  线段树可做。

 

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
#define ms(x) memset(x, 0, sizeof(x))
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define ll long long
const int MAXN = 101234;
const int INF = 0x3f3f3f3f;

int MAXy[MAXN<<2], MAXx[MAXN<<2];

void PushUp(int rt) {
	MAXx[rt] = max(MAXx[rt<<1], MAXx[rt<<1|1]);
	MAXy[rt] = max(MAXy[rt<<1], MAXy[rt<<1|1]);
}

void Build(int l, int r, int rt) {
	if(l == r) {
		MAXx[rt] = MAXy[rt] = 0;
		return;
	}
	int m = (l + r) >> 1;
	Build(lson);
	Build(rson);
	PushUp(rt);
}


void UpdateV(int op, int p,int key, int l, int r, int rt) {
	if(l == r) {
        if(op==1)
            MAXx[rt] = key;
        else
            MAXy[rt] = key;
		return;
	}
	int m = (l + r) >> 1;
	if(p <= m) UpdateV(op, p, key,lson);
	else UpdateV(op, p, key, rson);
	PushUp(rt);
}
int QueryMax(int L, int R, int l, int r, int rt, int op) {
	if(L<=l && r<=R){
        if(op==1) return MAXx[rt];
        else return MAXy[rt];
	}
	int m = (l + r) >> 1;
	int ret = -INF;
	if(L <= m) ret = max(ret, QueryMax(L, R, lson, op));
	if(R > m) ret = max(ret, QueryMax(L, R, rson, op));

	return ret;
}
int X[MAXN], Y[MAXN];
int aX[MAXN], aY[MAXN];
int sub[MAXN];
int main(){
    int n, o = 0;
    scanf("%d", &n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&X[i],&Y[i]);
        aX[i] = X[i], aY[i] = Y[i];
        sub[o++] = X[i];
        sub[o++] = Y[i];
    }
    sort(sub, sub+o);
    int k = unique(sub, sub+o) - sub;
    ms(MAXx), ms(MAXy);
    ll ans = 0;
    for(int i=n-1;i>=0;i--){  // op==1 find x,   else find y
        aX[i] = lower_bound(sub, sub+k, aX[i]) - sub;
        aY[i] = lower_bound(sub, sub+k, aY[i]) - sub;

    // cout<<QueryMax(aY[i], k, 1,k,1, 1)<<" ";
    // cout<<QueryMax(aX[i], k, 1,k,1, 2)<<endl;

        ans += X[i] - QueryMax(aY[i]+1, k, 1,k,1, 1);
        ans += Y[i] - QueryMax(aX[i]+1, k, 1,k,1, 2);
        UpdateV(2,aX[i]+1,sub[aY[i]], 1,k,1);
        UpdateV(1,aY[i]+1,sub[aX[i]], 1,k,1);
    }
    printf("%lld\n", ans);

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值