数三角形

【题目描述】

小苏看到一个这样的等边三角形:该等边三角形每边的长度为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. SQL Server 数据库设计规范

    数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求.数据库设计过程中命名规范很是重要,命名规范合理的 ...

  2. R in Action 读书笔记(5)

    MindMapper原文件

  3. Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx

    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx 分类 图像处理知识点体系 v2 qb24.xlsx 分类 分类 理论知识 图像金字塔 常用底层操作 卷积扫描 ...

  4. 火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题

    一.先遇到document.body.scrollTop值为0的问题 做页面的时候可能会用到位置固定的层,读取document.body.scrollTop来设置层的位置,像这样, window.on ...

  5. 轻量级前端MVVM框架avalon - 整体架构

    官网提供架构图 单看这个图呢,还木有说明,感觉有点蛋疼,作者的抽象度太高了,还好在前面已经大概分析过了执行流程 如图 左边是View视图,我们就理解html结构,换句话就是说用户能看到的界面,渲染页面 ...

  6. TSQL语句

    1.创建数据库create database test3;2.删除数据库drop database test3;3.创建表create table test(    code varchar(20), ...

  7. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  8. 前端自动化构建工具gulp的使用总结

    前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...

  9. 1Z0-053 争议题目解析314

    1Z0-053 争议题目解析314 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 314.Given the following RMAN commands, choose the ...

  10. css常用的特效代码

    一.网页变灰的代码:a) 网页变灰色<head>加到这里</head><style type="text/css">html {FILTER: ...