菜的求助

P1856 [IOI1998] [USACO5.5] 矩形周长Picture

``` #include<bits/stdc++.h> using namespace std; struct node{ int l,r,h; bool flag; node(int _l,int _r,int _h,bool _fl){ l = _l; r = _r; h = _h; flag = _fl; } }; const int N = 5e3 + 10; vector <node> v; struct tree{ int sum; int cnt; int len; bool l,r; }; tree root[N << 2]; int n; int mx,mn; bool cmp(node a,node b){ return a.h < b.h || a.h == b.h && a.flag > b.flag; } void push_up(int u,int l,int r){ if(root[u].sum){ root[u].cnt = 1; root[u].len = r - l + 1; root[u].l = root[u].r = 1; } else if(l == r){ root[u].cnt = 0; root[u].len = 0; root[u].l = root[u].r = 0; } else{ root[u].len = root[u << 1].len + root[u << 1 | 1].len; root[u].cnt = root[u << 1].cnt + root[u << 1 | 1].cnt; if(root[u << 1].r && root[u << 1 | 1].l) root[u].cnt--; root[u].l = root[u << 1].l; root[u].r = root[u << 1 | 1].r; } } void add(int u,int l,int r,int from,int to,int value){ if(l >= from && to >= r){ root[u].sum += value; push_up(u,l,r); return; } int mid = (l + r) >> 1; if(mid >= from) add(u >> 1,l,mid,from,to,value); if(to > mid) add(u >> 1 | 1,mid + 1,r,from,to,value); push_up(u,l,r); } int ans; int last; int main(){ scanf("%d",&n); mx = -0x7f7f7f7f; mn = 0x7f7f7f7f; for(int i = 1;i <= n;i++){ int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); mx = max(mx,max(x1,x2)); mn = min(mn,min(x1,x2)); v.push_back(node(x1,x2,y1,1)); v.push_back(node(x1,x2,y2,-1)); } if(mn <= 0){ //若为负的坐标,移到第一象限 for(int i = 0;i < v.size();i++){ v[i].l += 1 - mn; v[i].r += 1 - mn; } mx -= mn; } stable_sort(v.begin(),v.end(),cmp); for(int i = 0;i < v.size();i++){ add(1,1,mx,v[i].l,v[i].r - 1,v[i].flag); while(v[i].h == v[i + 1].h && v[i].flag == v[i + 1].flag){ i++; add(1,1,mx,v[i].l,v[i].r - 1,v[i].flag); } ans += abs(root[1].len - last); last = root[1].len; ans += root[1].cnt * 2 * (v[i + 1].h - v[i].h); } printf("%d",ans); } ```
by Joseph_H @ 2022-10-16 19:39:33


|