题解 LA5846

Posted whx1003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 LA5846相关的知识,希望对你有一定的参考价值。

题目大意 多组数据,每组数据给定一个有 (n) 个点的圆,每两点之间连一条线段,每条线段只能为红蓝两色。给定线段的颜色,求单色三角形的个数。

分析 不难想到找出不单色三角形的个数。考虑一个不单色三角形,则其有且仅有两个顶点连出了两条不同颜色的线段。那么可以枚举每个顶点,由该顶点组成的不单色三角形个数为该顶点连出的红边个数乘以蓝边个数。将答案累加后除以二,再用总个数去减它即为答案。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1005;

int T, n, ans;
int red[maxn];

inline int Read()
{
    int x = 0, op = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9') {
        if(ch == '-') op = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + (ch - '0');
        ch = getchar();
    }
    return x * op;
}

int main()
{
    T= Read();
    while(T--) {
        memset(red, 0, sizeof red);
        
        n = Read(), ans = 0;
        for(int i = 1; i <= n; ++i) {
            for(int j = i + 1; j <= n; ++j)
                if(Read()) ++red[i], ++red[j];
            ans += red[i] * (n - red[i] - 1);
        }
        printf("%d
", n * (n - 1) * (n - 2) / 6 - ans / 2);
    }
}

以上是关于题解 LA5846的主要内容,如果未能解决你的问题,请参考以下文章

题解 LA3708 Graveyard

UVALive5846

LA3905

题解Casting Spells LA 4975 UVa 1470 双倍回文 SDOI 2011 BZOJ 2342 Manacher

la4394

从android中的片段更改自定义ActionBar标题