数三角形

【题目描述】

小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点。而整个三角形被连接两个不同边的等分点且平行于三角形的第三边的线段分成了n2个单位等边三角形(边长为1)。下图左是n=5的情形:

小苏想知道,删除其中的一些短边后,剩下的边一共组成多少个三角形(包括所有边长为m的三角形),正立的和倒立的都算,只要三角形的3m条短边都没有被删除就算是组成一个三角形)。例如,上图右就存在19个三角形。

【输入格式】

大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成。如下图的灰色三角形所示。其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个灰色三角形。所以输入格式是这样规定的:

从文件中读入数据,文件第一行为正整数n,表示大三角形每边的长度。接下来的n行,第i+1行有i组数,从左到右每组数描述一个三角形,每组数都有3个数,这3个数非0即1,表示对应的短边是否被删除,0表示已被删除,1表示未被删除,依次按照三角形的左、右、下边的顺序来描述。所以第i+1行有3i个数,每个数是0或1。

【输出格式】

输出文件中仅包含一个整数T,表示有多少个三角形的边界都没有被删除。

【输入样例】

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

【输出样例】

19

【数据范围】

1<=n<=1000,1<=m<=n。


题解:

先考虑正三角,枚举底边所在的直线,一个合法三角形的底边是实线,左右两边比底边长

预处理:

c[i].l : 往左上延伸的最长长度

c[i].r : 往右上延伸的最长长度

r[i] : 向右延伸的最长长度

设一条底边的两个编号为 i 和 j

那么一个合法三角形需要满足:

(1)点 i 在点 j 的左边 : i < j -> i >= j

(2)i 到 j 之间为实边: r[i] >= j

(3)左边长于底边 : j - i <= c[i].r -> c[i].r + i >= j

(4)右边长于底边 : j - i <= c[j].l -> i >= j + c[j].l

那么转化为了关于 j 的不等式组

然后将 j 按 j - c[j].l 排序

从大到小枚举 i ,在树状数组中加入满足(4)的点 j

那么答案就是满足 (2) 和 (3) 的元素个数中的较小值减去转化过的条件(1)的元素个数

其实暴力能过(* ̄^ ̄(* ̄^ ̄(* ̄^ ̄)

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
inline int Get()
{
int x = ;
char c = getchar();
while('' > c || c > '') c = getchar();
while('' <= c && c <= '')
{
x = (x << ) + (x << ) + c - '';
c = getchar();
}
return x;
}
struct shape
{
int l, r, m;
};
struct mystery
{
int v, i;
};
shape a[][], c[][];
mystery s[];
int n;
int ans;
int r[][];
int tr[];
inline void Add(int x, int y)
{
while(x <= n + )
{
tr[x] += y;
x += x & (-x);
}
}
inline int Sum(int x)
{
int sum = ;
while(x)
{
sum += tr[x];
x -= x & (-x);
}
return sum;
}
inline bool rule(mystery a, mystery b)
{
if(a.v != b.v) return a.v < b.v;
return a.i < b.i;
}
inline void Up()
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= i + ; ++j)
{
if(!a[i][j].l) c[i][j].r = ;
else c[i][j].r = c[i - ][j].r + ;
if(!a[i][j - ].r) c[i][j].l = ;
else c[i][j].l = c[i - ][j - ].l + ;
}
for(int j = i + ; j >= ; --j)
{
if(!a[i][j].m) r[i][j] = j;
else r[i][j] = r[i][j + ];
}
}
for(int k = ; k <= n; ++k)
{
for(int i = ; i <= k + ; ++i)
{
s[i].v = i - c[k][i].l;
s[i].i = i;
}
sort(s + , s + + k + , rule);
int num = ;
for(int i = ; i <= k + ; ++i)
{
while(num <= k + && s[num].v <= i)
{
Add(s[num].i, );
++num;
}
if(c[k][i].r && r[k][i])
{
int one = Sum(c[k][i].r + i);
int two = Sum(i);
int thr = Sum(r[k][i]);
ans += min(one, thr) - two;
}
}
for(int i = ; i < num; ++i) Add(s[i].i, -);
}
}
inline void Down()
{
for(int i = n; i >= ; --i)
{
for(int j = ; j <= i; ++j)
{
if(!a[i][j].r) c[i][j].r = ;
else c[i][j].r = c[i + ][j + ].r + ;
if(!a[i][j].l) c[i][j].l = ;
else c[i][j].l = c[i + ][j].l + ;
}
for(int j = i; j >= ; --j)
{
if(!a[i - ][j].m) r[i][j] = j;
else r[i][j] = r[i][j + ];
}
}
for(int k = ; k <= n; ++k)
{
for(int i = ; i <= k; ++i)
{
s[i].v = i - c[k][i].l;
s[i].i = i;
}
sort(s + , s + + k, rule);
int num = ;
for(int i = ; i <= k; ++i)
{
while(num <= k && s[num].v <= i)
{
Add(s[num].i, );
++num;
} if(c[k][i].r && r[k][i])
{
int one = Sum(c[k][i].r + i);
int two = Sum(i);
int thr = Sum(r[k][i]);
ans += min(one, thr) - two;
}
}
for(int i = ; i < num; ++i) Add(s[i].i, -);
}
}
int main()
{
n = Get();
for(int i = ; i <= n; ++i)
for(int j = ; j <= i; ++j)
{
a[i][j].l = Get();
a[i][j].r = Get();
a[i][j].m = Get();
}
Up();
Down();
printf("%d", ans);
}

数三角形 bzoj 1201的更多相关文章

  1. 1201: [HNOI2005]数三角形 - BZOJ

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

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

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

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

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

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

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

  5. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形 容斥

    1914: [Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 272  Sol ...

  6. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description

  7. bzoj 3505: [Cqoi2014]数三角形 组合数学

    3505: [Cqoi2014]数三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 478  Solved: 293[Submit][Status ...

  8. BZOJ 3505: [Cqoi2014]数三角形( 组合数 )

    先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不 ...

  9. BZOJ 3505: [Cqoi2014]数三角形 [组合计数]

    3505: [Cqoi2014]数三角形 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注意三角形的三点不能共线. 1<=m,n<=1000 $n++ m++$ $ans ...

随机推荐

  1. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  2. SQL Server 2012 Managed Service Account

    原创地址:http://www.cnblogs.com/jfzhu/p/4007472.html 转载请注明出处 (一)Windows服务使用的登陆帐号 Windows服务只有登录到某一帐户的情况下才 ...

  3. 可扩容分布式session方案

    分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...

  4. Html5 绘制旋转的太极图

    采用Html5+JavaScript在Canvas中绘制旋转的太极图,如下图所示: 具体思路和绘制逻辑,在上图中已有说明,代码如下: <script type="text/javasc ...

  5. 单独使用jdbc编程问题总结(一)

    在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...

  6. Android笔记——提升ListView的运行效率

    之所以说 ListView 这个控件很难用,就是因为它有很多的细节可以优化,其中运行效率就是很重要的一点.目前我们ListView 的运行效率是很低的,因为在 FruitAdapter 的getVie ...

  7. angular中的compile和link函数

    angular中的compile和link函数 前言 这篇文章,我们将通过一个实例来了解 Angular 的 directives (指令)是如何处理的.Angular 是如何在 HTML 中找到这些 ...

  8. jQuery 2.0.3 源码分析 事件绑定 - bind/live/delegate/on

    事件(Event)是JavaScript应用跳动的心脏,通过使用JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应 事件的基础就不重复讲解了,本来是定位源码分析 ...

  9. Huffman树进行编码和译码

    //编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  10. Util应用程序框架公共操作类(六):验证扩展

    前面介绍了仓储的基本操作,下面准备开始扩展查询,在扩展查询之前,首先要增加两个公共操作类,一个是经常要用到的验证方法,另一个是Lambda表达式的操作类. 很多时候,我们会判断一个对象是否为null, ...