题目背景

墙上贴着许多形状相同的海报、照片。它们的边都是水平和垂直的。每个矩形图片可能部分或全部的覆盖了其他图片。所有矩形合并后的边长称为周长。

题目描述

编写一个程序计算周长。

如图1所示7个矩形。

如图2所示,所有矩形的边界。所有矩形顶点的坐标都是整数。

输入输出格式

输入格式:

输入文件的第一行是一个整数N(0<=N<5000),表示有多少个矩形。接下来N行给出了每一个矩形左下角坐标和右上角坐标(所有坐标的数值范围都在-10000到10000之间)。

输出格式:

输出文件只有一个正整数,表示所有矩形的周长。

输入输出样例

输入样例#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

扫描线线段树

其实能够找到的一些题解的线段树都暴力的很,如果稍微数据强一点就能卡,但是这题数据实在是太弱了QAQ

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<vector>
  6 #define MAXN 5005
  7 #define MAXM 10005
  8 #define X first
  9 #define Y second
 10 #define pii pair<int,int>
 11 using namespace std;
 12 int read(){
 13     int x=0,f=1;char ch=getchar();
 14     while(ch<'0'||ch>'9'){if('-'==ch)f=-1;ch=getchar();}
 15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 16     return x*f;
 17 }
 18 struct Node{
 19     int L,R,p,b;
 20     Node(int p1=0,int p2=0,int p3=0,int p4=0){
 21         L=p1,R=p2,p=p3,b=p4;
 22     }
 23 };
 24 bool comp(const Node &p1,const Node &p2){
 25     if(p1.p!=p2.p){
 26         return (p1.p<p2.p);
 27     }
 28     else{
 29         return (p1.b>p2.b);
 30     }
 31 }
 32 int n;
 33 vector<Node> vx,vy;
 34 void init(){
 35     n=read();
 36     for(int i=1;i<=n;i++){
 37         int x1=read(),y1=read(),x2=read(),y2=read();
 38         x1+=10001,y1+=10001,x2+=10001,y2+=10001;
 39         vx.push_back(Node(x1,x2,y1,1));vx.push_back(Node(x1,x2,y2,-1));
 40         vy.push_back(Node(y1,y2,x1,1));vy.push_back(Node(y1,y2,x2,-1));
 41     }
 42     sort(vx.begin(),vx.end(),comp);sort(vy.begin(),vy.end(),comp);
 43     n=10000*2;
 44 }
 45 int dat[MAXM<<3],tag[MAXM<<3];
 46 void pushdown(int k){
 47     int lc=(k<<1),rc=(k<<1|1);
 48     dat[lc]+=tag[k],dat[rc]+=tag[k];
 49     tag[lc]+=tag[k],tag[rc]+=tag[k];
 50     tag[k]=0;
 51 }
 52 void pushup(int k){
 53     dat[k]=min(dat[k<<1],dat[k<<1|1]);
 54 }
 55 void add(int a,int b,int k,int L,int R,int x){
 56     if(b<=L||R<=a){
 57         return;
 58     }
 59     else if(a<=L&&R<=b){
 60         dat[k]+=x;
 61         tag[k]+=x;
 62     }
 63     else{
 64         if(tag[k]){
 65             pushdown(k);
 66         }
 67         add(a,b,k<<1,L,(L+R)>>1,x);
 68         add(a,b,k<<1|1,(L+R)>>1,R,x);
 69         pushup(k);
 70     }
 71 }
 72 int query(int a,int b,int k,int L,int R){
 73     if(b<=L||R<=a){
 74         return 0;
 75     }
 76     if(L+1==R){
 77         return (dat[k]?1:0);
 78     }
 79     else if(a<=L&&R<=b&&dat[k]){
 80         return R-L;
 81     }
 82     else{
 83         if(tag[k]){
 84             pushdown(k);
 85         }
 86         int lc=query(a,b,k<<1,L,(L+R)>>1);
 87         int rc=query(a,b,k<<1|1,(L+R)>>1,R);
 88         return (lc+rc);
 89     }
 90 }
 91 int Abs(int x){
 92     return (x>0?x:-x);
 93 }
 94 void solve(){
 95     int ans=0;
 96     for(int i=0;i<vx.size();i++){
 97         int x=vx[i].L,y=vx[i].R,b=vx[i].b;
 98         int cnt1=query(x,y,1,1,n+1);
 99         add(x,y,1,1,n+1,b);
100         int cnt2=query(x,y,1,1,n+1);
101         ans+=Abs(cnt1-cnt2);
102 //        printf("%d ",Abs(cnt1-cnt2));
103     }
104 //    printf("\n");
105     for(int i=0;i<vy.size();i++){
106         int x=vy[i].L,y=vy[i].R,b=vy[i].b;
107         int cnt1=query(x,y,1,1,n+1);
108         add(x,y,1,1,n+1,b);
109         int cnt2=query(x,y,1,1,n+1);
110         ans+=Abs(cnt1-cnt2);
111 //        printf("%d ",Abs(cnt1-cnt2));
112     }
113     printf("%d\n",ans);
114 }
115 int main()
116 {
117 //    freopen("data.in","r",stdin);
118 //    freopen("my.out","w",stdout);
119     init();
120     solve();
121     return 0;
122 }

转载于:https://www.cnblogs.com/w-h-h/p/7814811.html

洛谷P1856 [USACO5.5]矩形周长Picture相关推荐

  1. [洛谷P1856] [USACO5.5]矩形周长Picture

    洛谷题目链接:[USACO5.5]矩形周长Picture 题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长 ...

  2. 洛谷[P1719 最大加权矩形] {前缀和与差分} 奋斗的珂珂~

    洛谷[P1719 最大加权矩形] {前缀和与差分} 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电 ...

  3. 洛谷1345 [Usaco5.4]奶牛的电信

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  4. 洛谷P1709 [USACO5.5]隐藏口令Hidden Password

    P1709 [USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N<= ...

  5. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)

    P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...

  6. 拆分-洛谷P2745 [USACO5.3]窗体面积Window Area

    https://www.luogu.org/problem/show?pid=2745 本来因为会WA的,结果AC了,啊哈哈哈哈哈哈哈哈哈 因为题目要求我们要把一个个平面有先后关系,那么我们就搞一个队 ...

  7. 洛谷 P1719 最大加权矩形

    P1719 最大加权矩形 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她 ...

  8. 洛谷 P1719 最大加权矩形 (前缀和,动态规划)

    题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没 ...

  9. 洛谷 P1719 最大加权矩形 动态规划

    题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没 ...

最新文章

  1. C#程序调用cmd执行命令
  2. Android自定义流式布局-FlowLayout
  3. 第二届「机器智能前沿论坛」强势来袭,众多机器学习大咖邀你共话AI未来!
  4. CM: 如何通过table SKWG_BREL快速查询product attachment信息
  5. 操作系统---进程篇
  6. java 交互式 shell_Java9 Shell工具(JShell)
  7. hdu 1728 逃离迷宫(dFS+优先队列)
  8. 从 BM 到 RBM
  9. 抓取html的地址怎么写,跪求一个获取URL地址html代码的写法
  10. 算法工程师的能力素质模型
  11. obs多推流地址_手把手教你-OBS录屏使用
  12. Linux系统程序包管理工具-RPM
  13. 基于Java+SpringBoot+Vue+uniapp微信小程序零食商城系统设计和实现
  14. 医院在线预约挂号管理系统(Java+SSH+MySQL)
  15. MyBatis基于XML的使用——缓存
  16. 自考计算机专业实践报不了名,2014年9月北京自考计算机及应用专业实践课程网报通知...
  17. c++ 数组作为参数、返回值
  18. 织梦网站巧用标签实现图片自动Alt功能,强化织梦seo效果
  19. RGB图像转为灰度图
  20. c#时分秒毫秒微妙_C# 日期格式精确到毫秒 【转】

热门文章

  1. GMQ交易所正式发布GMQ Token
  2. 关于操作 ASP.NET Web API的实例
  3. SQL开头quoted和ansiNULL
  4. wordpress 迁移网站更改域名解决图片无法显示
  5. linux下daemon守护进程的实现(以nginx代码为例)
  6. RAC环境创建本地数据文件的解决方法
  7. [前端优化]使用Combres合并对js、css文件的请求
  8. JavaFX 概述 (译)
  9. 你不了解PHP的10件事情!
  10. Linux操作系统的8个经典技巧