1. 程式人生 > >2018 ACM-ICPC 徐州賽區 G題

2018 ACM-ICPC 徐州賽區 G題

(有任何問題歡迎留言或私聊 && 歡迎交流討論哦

Catalog

Problem:網路預賽-G Trace

Portal傳送門
 原題目描述在最下面。
 我理解的題意大概是:有nn次漲潮和退潮,每次的範圍是個x×yx\times y的矩形,求n次漲退潮後,潮水痕跡的長度。
 不存在此i,j[1,n],ij,xixjyiyji,j\in[1,n], i\neq j,xi\leq xj且yi\leq yj

Solution:

 每次潮水可能會沖刷掉之前的潮水的一部分痕跡,但是它又不會完全沖刷。
 考慮從最後一次潮水開始往前算貢獻,分x,y方向計算。
 假設此次潮水的範圍是[

xi,yi][xi, yi],找出大於等於xixi的最大YY,則yy方向的新增痕跡長度為yiYyi-Yxx方向同理。
 這樣問題就轉化為一個求區間最值的問題了,線段樹秒。

AC_Code:

#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
const int mod = 1e9+7;
const int
MXN = 1e6 + 7; int n; int sumx[MXN<<2], sumy[MXN<<2]; int ar[MXN], br[MXN], le[MXN], ri[MXN]; void update(int op,int p,int c,int l,int r,int rt){ if(l == r){ if(op == 1) sumx[rt] = max(c,sumx[rt]); else sumy[rt] = max(c,sumy[rt]); return; } int mid = (
l+r)>>1; if(p<=mid)update(op,p,c,l,mid,lson); else update(op,p,c,mid+1,r,rson); if(op == 1)sumx[rt] = max(sumx[lson], sumx[rson]); else sumy[rt] = max(sumy[lson], sumy[rson]); } int query(int op,int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ if(op == 1) return sumx[rt]; else return sumy[rt]; } int mid = (l+r)>>1; if(L>mid)return query(op,L,R,mid+1,r,rson); else if(R<=mid)return query(op,L,R,l,mid,lson); else { return max(query(op,L,mid,l,mid,lson),query(op,mid+1,R,mid+1,r,rson)); } } int main(int argc, char const *argv[]){ scanf("%d", &n); int k = 0; for(int i = 1; i <= n; ++i){ scanf("%d%d", &le[i], &ri[i]); ar[k++] = le[i]; ar[k++] = ri[i]; } sort(ar, ar + k); k = unique(ar, ar + k) - ar; memset(sumx, 0, sizeof(sumx)); memset(sumy, 0, sizeof(sumy)); LL ans = 0; for(int i = n; i >= 1; --i){ int a = le[i], b = ri[i]; le[i] = lower_bound(ar, ar + k, le[i]) - ar + 1; ri[i] = lower_bound(ar, ar + k, ri[i]) - ar + 1; int my = query(1, le[i], k, 1, k, 1);//找出大於xi的最大Y ans += b - my; int mx = query(2, ri[i], k, 1, k, 1);//找出大於yi的最大X ans += a - mx; //printf("%d %d\n", mx, my); update(1, le[i], ar[ri[i]-1], 1, k, 1);//更新此xi下的yi update(2, ri[i], ar[le[i]-1], 1, k, 1); } printf("%lld\n", ans); return 0; }

Problem Description:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述