日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

luogu1856

發(fā)布時(shí)間:2024/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 luogu1856 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P1856 [USACO5.5]矩形周長Picture

題目背景

墻上貼著許多形狀相同的海報(bào)、照片。它們的邊都是水平和垂直的。每個(gè)矩形圖片可能部分或全部的覆蓋了其他圖片。所有矩形合并后的邊長稱為周長。

題目描述

編寫一個(gè)程序計(jì)算周長。

如圖1所示7個(gè)矩形。

如圖2所示,所有矩形的邊界。所有矩形頂點(diǎn)的坐標(biāo)都是整數(shù)。

輸入輸出格式

輸入格式:

輸入文件的第一行是一個(gè)整數(shù)N(0<=N<5000),表示有多少個(gè)矩形。接下來N行給出了每一個(gè)矩形左下角坐標(biāo)和右上角坐標(biāo)(所有坐標(biāo)的數(shù)值范圍都在-10000到10000之間)。

輸出格式:

輸出文件只有一個(gè)正整數(shù),表示所有矩形的周長。

輸入輸出樣例

輸入樣例#1:
7 -15 0 5 10 -5 8 20 25 15 -4 24 14 0 -6 16 4 2 15 10 22 30 10 36 20 34 0 40 16 輸出樣例#1:
228

求周長和,不用離散的方法

記錄最小值和最小值出現(xiàn)的個(gè)數(shù)

?

#include <cstdio> #include <algorithm> using namespace std; #define N 10005 int n,x1[N],y1[N],x2[N],y2[N]; struct node{int x1,x2,y,op;}line[N]; inline bool cmp(node a,node b){return a.y!=b.y?a.y<b.y:a.op>b.op;} struct SegmentTree{int l,r,mi,sum,lazy;}Tree[N<<4]; inline void pushup(int x) {if(Tree[x<<1].mi==Tree[x<<1|1].mi)Tree[x].sum=Tree[x<<1].sum+Tree[x<<1|1].sum, Tree[x].mi=Tree[x<<1].mi;else if(Tree[x<<1].mi<Tree[x<<1|1].mi)Tree[x].sum=Tree[x<<1].sum, Tree[x].mi=Tree[x<<1].mi;else Tree[x].sum=Tree[x<<1|1].sum, Tree[x].mi=Tree[x<<1|1].mi; } inline void ADD(int x,int v){Tree[x].lazy+=v;Tree[x].mi+=v;} inline void pushdown(int x){ADD(x<<1,Tree[x].lazy); ADD(x<<1|1,Tree[x].lazy); Tree[x].lazy=0;} inline void build(int l,int r,int x) {Tree[x].l=l; Tree[x].r=r; Tree[x].lazy=0;if(l==r){Tree[x].sum=1;Tree[x].mi=0;return;}int mid=(l+r)>>1;build(l,mid,x<<1);build(mid+1,r,x<<1|1);pushup(x); } inline void updata(int l,int r,int x,int v) {if(l==Tree[x].l&&Tree[x].r==r){Tree[x].lazy+=v;Tree[x].mi+=v;return;}if(Tree[x].lazy!=0) pushdown(x); int mid=(Tree[x].l+Tree[x].r)>>1;if(r<=mid)updata(l,r,x<<1,v); else if(l>mid) updata(l,r,x<<1|1,v);else updata(l,mid,x<<1,v), updata(mid+1,r,x<<1|1,v); pushup(x); } int main() {int i,ans=0; scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);line[i*2-1].x1=line[i*2].x1=x1[i]; line[i*2-1].x2=line[i*2].x2=x2[i]-1;line[i*2-1].y=y1[i]; line[i*2].y=y2[i]; line[i*2-1].op=1; line[i*2].op=-1;}n*=2;sort(line+1,line+n+1,cmp); build(-N,N,1);for(i=1;i<=n;i++){int oo=Tree[1].sum*(Tree[1].mi==0); updata(line[i].x1,line[i].x2,1,line[i].op); ans+=abs(oo-Tree[1].sum*(Tree[1].mi==0));}for(i=1;i<=n;i++){line[i*2-1].x1=line[i*2].x1=y1[i]; line[i*2-1].x2=line[i*2].x2=y2[i]-1;line[i*2-1].y=x1[i]; line[i*2].y=x2[i]; line[i*2-1].op=1; line[i*2].op=-1;}sort(line+1,line+n+1,cmp); build(-N,N,1);for(i=1;i<=n;i++){int oo=Tree[1].sum*(Tree[1].mi==0); updata(line[i].x1,line[i].x2,1,line[i].op); ans+=abs(oo-Tree[1].sum*(Tree[1].mi==0));}printf("%d\n",ans); } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/gaojunonly1/p/10325073.html

總結(jié)

以上是生活随笔為你收集整理的luogu1856的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。