bzoj1201: [HNOI2005]数三角形
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,表示有多少个三角形的边界都没有被删除。
预处理每个点向右上、左下、右、左四个方向延伸的最大长度,枚举左上-右下方向的路径,计算一边在这条路径上的三角形个数,可以排序并用树状数组维护
#include<cstdio>
#include<algorithm>
char buf[],*ptr=buf,*pmx=buf+;
inline int g(){
if(ptr==pmx)fread(ptr=buf,,,stdin);
return *(ptr++);
}
int _(){
int x=,c=g();
while(c<)c=g();
while(c>)x=x*+c-,c=g();
return x;
}
const int N=;
int n;
int d1[N][N],d2[N][N],d3[N][N],v1[N][N],v2[N][N],v3[N][N],v4[N][N],xs[N],xs2[N],bit[N],tk[N],T=,ans=;
struct itv{int l,r;}is[N],is2[N];
bool operator<(const itv&a,const itv&b){return a.l<b.l;}
void inc(int w){
for(++w;w<N;w+=w&-w){
if(tk[w]!=T)tk[w]=T,bit[w]=;
++bit[w];
}
}
int sum(int w){
int s=;
for(++w;w;w-=w&-w){
if(tk[w]!=T)tk[w]=T,bit[w]=;
s+=bit[w];
}
return s;
}
int main(){
n=_();
for(int i=;i<=n;++i){
for(int j=;j<=i;++j){
d1[i][j]=_();
d3[i][j]=_();
d2[i+][j]=_();
}
}
++n;
for(int i=;i<=n;++i){
for(int j=;j<=i;++j){
if(d2[i][j-])v2[i][j]=v2[i][j-]+;
if(d1[i-][j])v4[i][j]=v4[i-][j]+;
}
for(int j=i;j;--j)if(d2[i][j])v3[i][j]=v3[i][j+]+;
}
for(int i=n;i;--i){
for(int j=;j<=i;++j)if(d1[i][j])v1[i][j]=v1[i+][j]+;
}
for(int i=;i<=n;++i){
for(int x=i,y=,p;y<=n;){
while(!d3[x][y]&&y<=n)++x,++y;
if(y>n)break;
for(p=;;++x,++y,++p){
xs[p]=v1[x][y];
is[p]=(itv){p-v2[x][y],p};
xs2[p]=v3[x][y];
is2[p]=(itv){p-v4[x][y],p};
if(!d3[x][y])break;
}
std::sort(is+,is+p+);
++T;
for(int w=,r=;w<=p;++w){
while(r<=p&&is[r].l<=w)inc(is[r++].r);
ans+=sum(w+xs[w])-sum(w);
}
std::sort(is2+,is2+p+);
++T;
for(int w=,r=;w<=p;++w){
while(r<=p&&is2[r].l<=w)inc(is2[r++].r);
ans+=sum(w+xs2[w])-sum(w);
}
}
}
printf("%d",ans);
return ;
}
bzoj1201: [HNOI2005]数三角形的更多相关文章
- BZOJ1201 [HNOI2005]数三角形 大力出奇迹
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1201 题意概括 题解 n3跑过去了,大力出奇迹!简单的,不多说了. 代码 #include < ...
- bzoj1201: [HNOI2005]数三角形----递推+bitset
-by bzoj http://www.lydsy.com/JudgeOnline/problem.php?id=1201 枚举所有交点,统计每个以每个点为顶点的正三角和和以每个点为左端点的反三角 ...
- 【BZOJ1201】[HNOI2005]数三角形(暴力)
[BZOJ1201][HNOI2005]数三角形(暴力) 题面 BZOJ 洛谷 题解 预处理每个点向四个方向可以拓展的最大长度,然后钦定一个点作为三角形的某个顶点,暴力枚举三角形长度,检查这样一个三角 ...
- bzoj 1201[HNOI2005]数三角形 1202 [HNOI2005]狡猾的商人 暴力 权值并查集
[HNOI2005]数三角形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 349 Solved: 234[Submit][Status][Disc ...
- 1201: [HNOI2005]数三角形 - BZOJ
Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...
- BZOJ 1201 [HNOI2005]数三角形:枚举 + 前缀和
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1201 题意: 有一个边长为n的正三角形网格,去掉其中一些线段,问你在这幅图中有多少个三角形 ...
- 数三角形 bzoj 1201
数三角形(1s 128MB)triangle [题目描述] 小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点.而整个三角形被连接两个不同边的等分点且 ...
- [CQOI 2014] 数三角形 & 机械排序臂
数三角形 bzoj 3505 要知道一个公式就是(a,b)和(x,y)两点所成线段上面的整点数是gcd(a-x,b-y)-1,通过枚举原点到map上任意一点所能成的三角形,再平移,得到要去掉的三点共线 ...
- [Usaco2010 OPen]Triangle Counting 数三角形
[Usaco2010 OPen]Triangle Counting 数三角形 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 394 Solved: 1 ...
随机推荐
- USB Packet Types
USB has four different packet types. Token packets indicate the type of transaction to follow, data ...
- mapreduce入门之wordcount注释详解
mapreduce版本:0.2.0之前 说明: 该注释为之前学习时找到的一篇,现在只是在入门以后对该注释做了一些修正以及添加. 由于版本问题,该代码并没有在集群环境中运行,只将其做为理解mapredu ...
- 冒泡排序(python版)
实现源码 def bubble(array): flag = len(array)- : iter = for i in range(flag): ]: array[i], array[i+]= ar ...
- [转]国内良心DNS汇集
http://www.changbizi.net/archives/664.html 长鼻子实验室 湖北电信的DNS服务器真是烂到掉渣,曾经有一年我给他们的售后打电话到人家都记住我的手机号码,但是DN ...
- P235 实战练习(集合类2)、摇奖程序和验证码(修改版)
1.分别向Set集合以及List集合中添加“A”.“a”.“c”.“C”.“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. package org.hanqi.practi ...
- HDU-1520 Anniversary party(树形DP)
题目大意:一棵树,每个节点都带权.从中取出一些节点,并且子节点不能与父节点同时取,求能取得的最大值. 题目分析:定义状态dp(u,0/1)表示u点不取/取.则状态转移方程为: dp(u,1)=sum( ...
- 越狱Season 1-Episode 8: The Old Head
Season 1, Episode 8: The Old Head -Michael: 17 days from now they strap my brother to an electric ch ...
- 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏
一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...
- 论文笔记之:RATM: RECURRENT ATTENTIVE TRACKING MODEL
RATM: RECURRENT ATTENTIVE TRACKING MODEL ICLR 2016 本文主要内容是 结合 RNN 和 attention model 用来做目标跟踪. 其中模型的组成 ...
- Netty系列之Netty可靠性分析
作者 李林锋 发布于 2014年6月19日 | 29 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单 1. 背景 1.1. 宕机的代价 1.1. ...