数三角形

【题目描述】

小苏看到一个这样的等边三角形:该等边三角形每边的长度为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. 辛巴学院-Unity-剑英的c#提高篇(一)主循环

    这是测试版 辛巴学院:正大光明的不务正业. 最近刚刚离开了我服务了三年多的公司,因为一个无数次碰到的老问题,没钱了. 之前不知道做什么好的时候,机缘巧合之下和哒嗒网络的吴总聊了一下,发现了vr gam ...

  2. Hibernate 3.3.2 文档翻译 Day01

    Hibernate 3.3.2 文档翻译 翻译人:微冷的雨 第一次书写:2015年11月29日 本人呕心沥血之作,请细心阅读领悟! Day01-1.1 项目描述 微冷的雨翻译:例如,我们将要建立一个可 ...

  3. Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?

    在 SQL Server 创建或修改「存储过程(stored procedure)」时,可加上 WITH RECOMPILE 选项,但多数文档或书籍都写得语焉不详,或只解释为「每次执行此存储过程时,都 ...

  4. Atitit xml命名空间机制

    Atitit xml命名空间机制 命名冲突1 使用前缀来避免命名冲突2 使用命名空间(Namespaces)2 XML Namespace (xmlns) 属性2 默认的命名空间(Default Na ...

  5. iOS----- Crash 分析(文二)-崩溃日志组成

    iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...

  6. iOS-大神们的博客收集

    唐巧的技术博客 http://blog.devtang.comOneV's Den http://onevcat.com破船之家 http://beyondvincent.comNSHipster h ...

  7. Java内部类的定义和使用

    为什么要用到内部类: 在java开发学习中我们经常会碰到内部类.内部类又有很多的优势:首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法名称参数相同,你应 ...

  8. Sql Server系列:自定义函数

    用户自定义函数可以像系统函数一样在查询或存储过程中调用,可以接受参数.执行操作并将操作结果以值的形式返回.返回值可以是单个标量或结果集. 1. 标量函数 标量函数返回一个确定类型的标量值,对于多语句的 ...

  9. LINQ系列:Linq to Object元素操作符

    元素操作符从一个序列返回单个指定的元素. 1. DefaultIfEmpty DefaultIfEmpty操作符将一个空集合替换为包含默认的单个值的集合.在返回序列为空且又需要返回一些对象时,可以通过 ...

  10. 实战MEF(5):导出元数据

    如何理解元数 我们可以把元数据理解为随类型一起导出的附加信息.有时候我们会考虑,把元数据随类型一并导出,增加一些说明,使得我们在导入的时候,可以多一些筛选条件. 默认的类型导出带有元数据吗 上面的内容 ...