洛谷 P2315 [HNOI2005]数三角形 暴力

题目描述
这里写图片描述
输入输出格式

输入格式:
这里写图片描述

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

输入输出样例

输入样例#1:
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
输出样例#1:
19

分析:
我们维护每个点往左上( lu l u ),左下( ld l d ),右上( ru r u ),右下( rd r d ),往左( l l )最多能走多少步。
然后我们枚举每个点为正立的三角形的右下角,显然这个三角形最大边长是min(lu[i][j],l[i][j])
我们枚举这个长度 k k ,显然另一个顶点为(i,jk),然后判断 ru[i][jk] r u [ i ] [ j − k ] 是否大于 k k
这样做是O(n3)的,但是由于数据水,是能过的。
至于考虑优化,也就是要满足,

ru[i][jk]>=k r u [ i ] [ j − k ] >= k

也就是要查询一个区间 [jmaxk][j1] [ j − m a x k ] [ j − 1 ] 的大于 k k 的数的个数,这个可以用可持久化权值线段树做。
复杂度是O(n2logn)的,但是不想打。

代码:

#include <iostream>
#include <cmath>
#include <cstdio>

const int maxn=1007;

using namespace std;

int n,x,y,z,ans;
int lu[maxn][maxn],ru[maxn][maxn],ld[maxn][maxn],rd[maxn][maxn];

struct rec{
    int l,r,d;
}h[maxn][maxn];

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=i;j++)
        {
            scanf("%d%d%d",&h[i][j].l,&h[i][j].r,&h[i][j].d);
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=i;j++)
        {
            if (h[i][j].l) ru[i+1][j]=ru[i][j]+1;
            if (h[i][j].r) lu[i+1][j+1]=lu[i][j]+1;
        }
    }
    for (int i=n;i>0;i--)
    {
        for (int j=i;j>0;j--)
        {
            if (h[i][j].l) ld[i][j]=ld[i+1][j]+1;
            if (h[i][j].r) rd[i][j]=rd[i+1][j+1]+1;
        }
    }       
    for (int i=1;i<=n+1;i++)
    {
        for (int j=1;j<=i;j++)
        {
            for (int k=j-1;(k>0) && (h[i-1][k].d) && (j-k<=lu[i][j]);k--)
            {
                ans+=(j-k)<=ru[i][k];
            }
            for (int k=j-1;(k>0) && (h[i-1][k].d) && (j-k<=ld[i][j]);k--)
            {
                ans+=(j-k)<=rd[i][k];
            }
        }
    }
    printf("%d",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值