欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ5045


题意概括

  有一堵墙。

  

  现在挖掉某些砖。如果有相邻的某两个砖没有了,那么他们中上方的那块也没了。

  比如(0,0)和(0,2)被挖掉了,那么(1,1)也没了; (1,1)没了(1,3)没了,那么(2,2)也没了。

  现在挖掉n(n<=100000)块砖,问会掉多少块砖;

  砖块坐标<=109


题解

  我们按照纵坐标离散化。

  我们把对于最低行的所有砖块改成用许多条线段不重复覆盖的形式。这个需要排序和线性处理。

  每条线段可以弄掉的位置为一个以线段为底的三角形区域。

  然后跳转往上到第二个纵坐标。

  枚举原来处理过的线段。如果线段能打掉的三角形的顶点在当前纵坐标之上,那么我们把一个新的梯形区域记入,并构成一条当前纵坐标的线段。

  如果顶点在下面,那么直接统计即可。

  对于现在,有两类线段,一种是从下面继承的,一种是当前原有的。

  其实没什么区别的。

  直接按照对最低行的处理搞一搞就可以了。

  然后循环解决。

  这样的时间复杂度是O(nlogn)的。

  为什么?因为我们把所有的线段看一看。我们发现,由x块砖构成的线段,最多可以演变成x条纵坐标不同的线段,那么不同的线段总数<=n。

  对于每一条不同的线段,处理的均摊复杂度为O(logn);最多n条不同线段,那么O(nlogn);

  具体处理还是也具体看待。


代码

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=100000+5;
int n,x[N],xz;
LL ans=0;
struct Point{
int x,y;
}p[N];
struct vec{
Point seg[N];
int z;
void clear(){
z=0;
}
void push(int a,int b){
seg[++z].x=a,seg[z].y=b;
}
}a,b;
bool cmpx(Point a,Point b){
return a.x<b.x;
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y),x[i]=p[i].x;
sort(p+1,p+n+1,cmpx);
sort(x+1,x+n+1);
xz=1;
for (int i=2;i<=n;i++)
if (x[i]!=x[i-1])
x[++xz]=x[i];
a.clear();
for (int pos=1,xp=1;pos<=n,xp<=xz;xp++){
b.clear();
for (int i=1;i<=a.z;i++){
int L=a.seg[i].x,R=a.seg[i].y,w=(R-L)/2,dx=x[xp]-x[xp-1];
if (w<=dx)
ans+=1LL*w*(w+1)/2;
else {
ans+=1LL*(w+w-dx+1)*dx/2;
b.push(L+dx,R-dx);
}
}
for (;p[pos].x==x[xp];pos++)
b.push(p[pos].y,p[pos].y+2);
sort(b.seg+1,b.seg+b.z+1,cmpx);
a.clear();
vec &c=a;
for (int i=1;i<=b.z;i++)
if (c.z==0||c.seg[c.z].y<b.seg[i].x)
c.push(b.seg[i].x,b.seg[i].y);
else
c.seg[c.z].y=max(c.seg[c.z].y,b.seg[i].y);
}
for (int i=1;i<=a.z;i++){
int L=a.seg[i].x,R=a.seg[i].y,w=(R-L)/2;
ans+=1LL*w*(w+1)/2;
}
printf("%lld",ans);
return 0;
}

  

BZOJ5045 打砖块 2017年9月月赛 其他的更多相关文章

  1. BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5047 题意概括 概括??~别为难语文做一题错两题的我了…… 题解 我们发现,对于某一种装置,有c种 ...

  2. 猖獗的假新闻:2017年1月1日起iOS的APP必须使用HTTPS

    一.假新闻如此猖獗 刚才一位老同事 打电话问:我们公司还是用的HTTP,马上就到2017年了,提交AppStore会被拒绝,怎么办? 公司里已经有很多人问过这个问题,回答一下: HTTP还是可以正常提 ...

  3. [转载]Ubuntu17.04(Zesty Zapus)路线图发布:2017年4月13日发布

    Canonical今天公布了Ubuntu 17.04(Zesty Zapus)操作系统的发布路线图,该版本于今年10月24日上线启动,toolchain已经上传且首个daily ISO镜像已经生成.面 ...

  4. 最新IP地址数据库Dat格式-高性能高并发版(2017年1月)

    最新IP地址数据库->Dat格式 高性能格式->qqzeng-ip.dat 国内版-20170101-Dat 版                国外版-20170101-Dat 版     ...

  5. 2017年1月5日 星期四 --出埃及记 Exodus 21:31

    2017年1月5日 星期四 --出埃及记 Exodus 21:31 This law also applies if the bull gores a son or daughter.牛无论触了人的儿 ...

  6. 2017年1月4日 星期三 --出埃及记 Exodus 21:30

    2017年1月4日 星期三 --出埃及记 Exodus 21:30 However, if payment is demanded of him, he may redeem his life by ...

  7. 2017年1月3日 星期二 --出埃及记 Exodus 21:29

    2017年1月3日 星期二 --出埃及记 Exodus 21:29 If, however, the bull has had the habit of goring and the owner ha ...

  8. 2017年1月2日 星期一 --出埃及记 Exodus 21:28

    2017年1月2日 星期一 --出埃及记 Exodus 21:28 "If a bull gores a man or a woman to death, the bull must be ...

  9. 2017年1月1日 星期日 --出埃及记 Exodus 21:27

    2017年1月1日 星期日 --出埃及记 Exodus 21:27 And if he knocks out the tooth of a manservant or maidservant, he ...

随机推荐

  1. MongoDB 时差问题问题

    在读取的时候,需要再次转换回来,比较麻烦. 其实,Mongo本身就已经提供了相应的处理方法,即在实体类中加个属性即可.具体如下: [BsonDateTimeOptions(Kind = DateTim ...

  2. PCA whitening

    对输入数据,维度为2时,想要把数据降维1维: 数据的主方向就是旋转数据的第一维.因此,若想把这数据降到一维,可令: 数据已经进行预处理(零均值),使得每个特征和具有相同的均值和方差. PCA算法将寻找 ...

  3. JavaScript之this,call,apply

    this:被调用的上下文对象: apply与call:切换被调用的上下文对象,即 调用时,this被临时性地切换 //demo 1 [call] function forEach(list,callb ...

  4. JavaScript之BOM五大对象(window;location;navigator;screen;history)

    一.window 1.浏览器窗口与页面各部分尺寸 2.间歇调用与超时调用 setInterval(function,time(以毫秒计)) 返回:时间Id号(为clearInterval(timeId ...

  5. Ubuntu16.04搭建QingdaoU(docker一键式部署)

    QDUOJ已经开源到2.0版本了,下面的教程不再适用,仅做纪念吧! 这几天装什么Linux.开源OJ上瘾了...竟然没去刷题...嗯,做好记录就写题啦! 先上原始网站的图: 风格不错,很符合我的口味. ...

  6. python3爬虫一

    1.环境安装: 在py3env(虚拟环境)下安装scrapy,新建项目: pip install scrapy scrapy startproject ArticleSpider cd Article ...

  7. Debian 9 源配置

    Debian 9: deb http://mirrors.163.com/debian/ stretch main non-free contrib deb http://mirrors.163.co ...

  8. SpringMVC使用Burlap发布远程服务

    参考这篇文章https://www.cnblogs.com/fanqisoft/p/10283156.html 将提供者配置类中的 @Bean public HessianServiceExporte ...

  9. 关于C++中的指针、数组

    C++中指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式:将整数变量加一后,其值将增加1:将指针变量加一后,增加的量等于其指向的数据类型的字节数: 指针中存储的是地址,地址在形式上和整数 ...

  10. win7下出现读不到移动硬盘的解决办法

    很多电脑会出现移动硬盘读不到,或者 读到部分盘的情况,那么下面我就为大家来一一解决这些情况: 方法一:    最常见的是硬盘供电不足导致 ,要么换一个硬盘盒子,要么给硬盘一个外加电源即可方法二:    ...