数三角形

【题目描述】

小苏看到一个这样的等边三角形:该等边三角形每边的长度为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. SecureCRT使用技巧

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   修改SecureCRT颜色配置 option->Global options –> Termina ...

  2. 完成AngularJS with MVC 5, Web API 2项目

    经过接近两个月的日夜奋战,完成AngularJS with MVC 5, Web API 2的项目,这也是进入公司以后最大的一个项目,从项目需求.用户Prototype/Demo,招人,开发完成,可谓 ...

  3. 到底应该选择那种Linux.NET的部署方式?

    当前部署Linux.NET环境的方式可谓是五花八门,既有传统的源码编译的方式.又有各式各样的一键安装脚本.还有绿色包安装方式,而随着Mono官方的新站上线,更增加了采用RPM包的部署方式.那对于一名L ...

  4. Christmas Trees, Promises和Event Emitters

    今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...

  5. Java 浅析三大特性之一继承

    上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...

  6. 用Mindjet MindManager 15 打开文件后停止响应的解决方法

    这个是因为文件里面有很多规格不统一的注释(那个像小本子的图标[里面就是注释部分]),默认编码是utf-8的,如果不一样的话就会出现这个问题.网上大多数都是让咱们删掉注释再打开 弱弱的问一下,如果我都把 ...

  7. OpenCascade MeshVS Usage

    OpenCascade MeshVS Usage eryar@163.com Abstract. MeshVS means Mesh Visualization Service. It can be ...

  8. ASP.NET MVC之Unobtrusive Ajax(五)

    前言 这一节我们来讲讲Unobtrusive中的Ajax提交,大部分情况下我们是利用JQuery来进行Ajax请求,当然利用JQuery来进行表单Ajax请求也不例外,但是相对于Unobtrusive ...

  9. codefordream 关于js初级训练

    这里的初级训练相对简单,差不多都是以前知识温习. 比如输出“hello world”,直接使用console.log()就行.注释符号,“//”可以注释单行,快捷键 alt+/,"/*   ...

  10. 2014年百度之星程序设计大赛 - 初赛(第二轮)Chess

    题目描述:小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路线.也就是说,如果“王”当前在 ...