Description

Input

大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成。如下图的灰色三角形所示。其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个灰色三角形。所以输入格式是这样规定的:输入第一行为正整数n,其中1<=n<=1000,表示大三角形每边的长度。接下来的n行,第i+1行有i组数,从左到右每组数描述一个三角形,每组数都有3个数,这3个数非0即1,表示对应的短边是否被删除,0表示已被删除,1表示未被删除,依次按照三角形的左、右、下边的顺序来描述。所以第i+1行有3i个数,每个数是0或1
Output 仅包含一个整数T,表示有多少个三角形的边界都没有被删除。
Sample Input
5
1 1 1
1 1 0 1 1 0
1 1 1 1 1 1 1 0 1
1 0 1 1 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1 1 0 1 1
Sample Output
19

统计有多少个三角形

枚举底边所在的直线

对于一个三角形,它的条件是底边是实线,左右两边要比底边长

我们先预处理出exl和exr,分别表示往左上最多延伸多长,往右上最多延伸多长

对于底边两点i和j,i<j

它需要满足的条件是(实线我们可以直接一段一段的处理)

j-i<=exr[i],j-i<=exl[j]

所以j<=exr[i]+i,j-exl[j]<=i

然后我们先把j-exl[j]排一个序,从小到大枚举i,加入j-exl[j]<=i的点(即a[j]++),注意要把j<=i的减掉

a[i]数组用树状数组维护,再统计a数组中[1..exr[i]+i]的和就可以了

一开始不知道,所以我把每一个j看成一个平面上的点,坐标为(j,j-exl[j]),枚举i,统计横坐标小于等于exr[i]+i且纵坐标小于等于i的点

用二维树状数组维护这个和,然后过了

这里就只贴二维的那个了(第一种方法没有写)

 const
maxn=;
var
tri:array[..maxn,..maxn,..]of integer;
exl,exr,c:array[..maxn,..maxn]of integer;
n,ans:longint; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure init;
var
i,j:integer;
begin
read(n);
for i:= to n do
for j:= to i do
read(tri[i,j,],tri[i,j,],tri[i,j,]);
end; function lowbit(x:longint):longint;
begin
exit(x and -x);
end; procedure add(x,y,z:longint);
var
h:longint;
begin
while x<=n+ do
begin
h:=y;
while h<=n+ do
begin
inc(c[x,h],z);
h:=h+lowbit(h);
end;
x:=x+lowbit(x);
end;
end; function sum(x,y:longint):longint;
var
h:longint;
begin
sum:=;
while x> do
begin
h:=y;
while h> do
begin
inc(sum,c[x,h]);
h:=h-lowbit(h);
end;
x:=x-lowbit(x);
end;
end; procedure get;
var
h,l,r,i:longint;
begin
for h:= to n do
begin
l:=;
while l<=h do
begin
while (tri[h,l,]=)and(l<=h) do
inc(l);
if l>h then break;
r:=l+;
while tri[h,r,]= do
inc(r);
for i:=l to r do
add(i,max(,i-exl[h,i]),);
for i:=l to r do
begin
add(i,max(,i-exl[h,i]),-);
inc(ans,sum(min(n+,exr[h,i]+i),i));
end;
l:=r+;
end;
end;
end; procedure work;
var
i,j:longint;
begin
for i:= to n do
for j:= to i do
begin
if tri[i,j,]= then exr[i,j]:=exr[i-,j]+;
if tri[i,j,]= then exl[i,j+]:=exl[i-,j]+;
end;
get;
for i:= to n do
for j:= to i+ do
begin
exl[i,j]:=;
exr[i,j]:=;
end;
for i:=n downto do
for j:= to i do
begin
if tri[i,j,]= then exl[i-,j]:=exl[i,j]+;
if tri[i,j,]= then exr[i-,j]:=exr[i,j+]+;
end;
get;
write(ans);
end; begin
init;
work;
end.

1201: [HNOI2005]数三角形 - BZOJ的更多相关文章

  1. bzoj 1201[HNOI2005]数三角形 1202 [HNOI2005]狡猾的商人 暴力 权值并查集

    [HNOI2005]数三角形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 349  Solved: 234[Submit][Status][Disc ...

  2. BZOJ 1201 [HNOI2005]数三角形:枚举 + 前缀和

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1201 题意: 有一个边长为n的正三角形网格,去掉其中一些线段,问你在这幅图中有多少个三角形 ...

  3. 【BZOJ1201】[HNOI2005]数三角形(暴力)

    [BZOJ1201][HNOI2005]数三角形(暴力) 题面 BZOJ 洛谷 题解 预处理每个点向四个方向可以拓展的最大长度,然后钦定一个点作为三角形的某个顶点,暴力枚举三角形长度,检查这样一个三角 ...

  4. 数三角形 bzoj 1201

    数三角形(1s 128MB)triangle [题目描述] 小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点.而整个三角形被连接两个不同边的等分点且 ...

  5. bzoj1201: [HNOI2005]数三角形

    Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...

  6. bzoj1201: [HNOI2005]数三角形----递推+bitset

    -by  bzoj http://www.lydsy.com/JudgeOnline/problem.php?id=1201 枚举所有交点,统计每个以每个点为顶点的正三角和和以每个点为左端点的反三角 ...

  7. BZOJ1201 [HNOI2005]数三角形 大力出奇迹

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1201 题意概括 题解 n3跑过去了,大力出奇迹!简单的,不多说了. 代码 #include < ...

  8. [CQOI 2014] 数三角形 & 机械排序臂

    数三角形 bzoj 3505 要知道一个公式就是(a,b)和(x,y)两点所成线段上面的整点数是gcd(a-x,b-y)-1,通过枚举原点到map上任意一点所能成的三角形,再平移,得到要去掉的三点共线 ...

  9. BZOJ 3505: [Cqoi2014]数三角形 数学

    3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

随机推荐

  1. 取消Win7任务栏窗口自动排序

    点击“开始”菜单,在“搜索程序和文件”框中输入“关闭自动窗口排列”,找到后打开,找到“防止将窗口移动到屏幕边缘时自动排列窗口”这一项,勾上后点击确定就可以了.

  2. 第一回 认识Bootstrap

    Bootstrap 是Twitter推出的一个用于前端开发的开源工具包. Bootstrap是基于HTML5和CSS3开发的,它在jQuery的基础上进行了更为个性化和人性化的完善,形成一套自己独有的 ...

  3. Android 侧滑菜单的简单实现(SlidingMenu)二

    在上一篇博文中已经简单的实现了侧滑菜单,代码也很简单,就几行代码. 这篇文章依然讲侧滑菜单,与前一篇文章不同的是,这篇文章用不同的代码方式来实现侧滑菜单. 在前面的文章中已经用了在Activity中通 ...

  4. Kill Session

    有时候创建索引或修改表字段时,会提示资源正忙,可以查出表对应的进程并kill掉 select l.session_id,o.owner,o.object_name from v$locked_obje ...

  5. 第十一篇、RxSwift

    三. 什么是函数式编程? 什么是函数式编程呢? 函数式编程其实是一种编程思想, 代码写出来只是它的表现形式. 在面向对象的编程思想中, 我们将要解决的一个个问题, 抽象成一个个类, 通过给类定义属性和 ...

  6. Objective-C 【多个对象内存管理(野指针&内存泄漏)】

    ------------------------------------------- 多个对象内存管理(野指针&内存泄漏) (注:这一部分知识请结合"单个对象内存管理"去 ...

  7. javascript笔记——图片大小检测

    <html> <head> <script type="text/javascript"> var isIE = /msie/i.test(na ...

  8. android浪漫樱花凋零动态壁纸应用源码

    android浪漫樱花凋零动态壁纸应用源码,是从那个安卓教程网拿过来的,本项目是一套基于安卓的樱花动态壁纸项目源码,安装以后桌面没有图标,但是可以在修改壁纸-动态壁纸中找到.我的分辨率是480×854 ...

  9. java 枚举 类 enum

    public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializab ...

  10. 防止非授权用户调用DLL

    1.首先要创建一个密钥文件(*.snk)