HDU 6016 - Count the Sheep

题意:

  男羊和女羊之间有朋友关系,找出关系满足A->B->C->D,且A,B,C,D都不同的关系的个数(排列)

分析:

   枚举B,对于每一个B枚举C

   每一个B->C的贡献 = (B.size - 1) * (C.size - 1)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 const int MAXN = 100005;
 5 int t, n, m, k;
 6 int C[MAXN];//女羊的朋友
 7 vector<int> G[MAXN]; //男羊->女羊
 8 int main()
 9 {
10     scanf("%d", &t);
11     while (t--)
12     {
13         memset(C, 0, sizeof(C));
14         scanf("%d%d%d", &n, &m, &k);
15         for (int i = 1; i <= n; i++) G[i].clear();
16         memset(C, 0, sizeof(C));
17         for (int i = 1; i <= k; i++)
18         {
19             int x, y; scanf("%d%d", &x, &y);
20             C[y]++;
21             G[x].push_back(y);
22         }
23         LL ans = 0;
24         for (int x = 1; x <= n; x++)
25         {
26             LL A = G[x].size()-1;
27             for (int j = 0; j < G[x].size(); j++)
28                 ans += A*(C[G[x][j]]-1);
29         }
30         printf("%lld\n", 2*ans);
31     }
32 }
时间: 2024-12-21 13:01:42

HDU 6016 - Count the Sheep的相关文章

hdu 1705 Count the grid(皮克定理)

题目链接:hdu 1705 Count the grid 题意: 给定一个三角形三点坐标,问三角形内有多少个坐标均为整数的点. 题解: 给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积 S 和内部格点数目 n.边上格点数目 s 的关系:S = n +s/2+1 三角形两向量叉积/2=面积. 向量上整数点数为gcd(v.x,v.y)(此公式对于一条边上的结果不准确,但是三条边加在一起的和是准确的) 1 #include<bits/stdc++.h> 2 #define F(

Count the Sheep 二分图+思维

Count the Sheep 题意: 问题描述 开学翘课固然快乐,然而也有让呃喵抓狂的事,那当然就是考试了!这可急坏了既要翘课又想要打BC还要准备考试的呃喵. 呃喵为了准备考试没有时间刷题,想打BC又不想跌分,只得求助于BCround92的出题人snowy_smile,让他说点什么 ~~>_<~~. snowy_smile实在没有办法,但是又不好意思透题,只好告诉呃喵,当务之急是好好休息. "如果你按照下面这个办法睡着,那么第二天就绝对不会在BC的赛场上跌分-- 想象一片一望无际.

HDU 4916 Count on the path

题意: 给定一棵树和m个询问  每个询问要求回答不在u和v两节点所形成的路径上的点的最小标号 思路: 一开始以为是LCA-  不过T了好几次-  后来发现不用LCA也可做 考虑每个询问u和v  如果他们的lca不是1  则1一定是答案  不过求lca会T  那么我们只需要在遍历树的时候给节点染色  染的颜色就是1的儿子的颜色  如果x这个点在y的子树中(y是1的儿子)那么他的颜色就是y 染完色后我们考虑答案是如何构成的 如图所示  答案即是  红色  蓝色  绿色的子树中节点的最小值  那么我们

HDU 4588 Count The Carries(找规律,模拟)

题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <stack> #include <vector> using namespace std; int main() { int

hdu 3336 Count the string

Count the stringTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4239    Accepted Submission(s): 1977 Problem Description It is well known that AekdyCoin is good at string problems as well as num

HDU 4588 Count The Carries 数位DP || 打表找规律

2013年南京邀请赛的铜牌题...做的很是伤心,另外有两个不太好想到的地方....a 可以等于零,另外a到b的累加和比较大,大约在2^70左右. 首先说一下解题思路. 首先统计出每一位的1的个数,然后统一进位. 设最低位为1,次低位为2,依次类推,ans[]表示这一位上有多少个1,那么有 sum += ans[i]/2,ans[i+1] += ans[i]/2; sum即为答案. 好了,现在问题转化成怎么求ans[]了. 打表查规律比较神奇,上图不说话. 打表的代码 #include <algo

hdu 3336 Count the string(KMP)

一道应用kmp算法中next数组的题目 这其中vis[i]从1加到n vis[i]=[next[i]]+1; #include<string.h> #include<stdlib.h> #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; char s[200005]; int b; int next[200005]; int vis[20000

hdu 1812 Count the Tetris polya计数

哈哈哈,简单polya,公式自己推导. 不过这题需要用到大数,很久没写Java,调了好久. import java.math.*; import java.util.*; import java.io.*; public class Main{ public static void main(String args[]){ Scanner cin=new Scanner(System.in); int n; BigInteger c; while(cin.hasNextInt()) { BigI

hdu 4750 Count The Pairs 最小生成树

题意就是给出一个f值,然后假如两个点u,v间的所有路径上的最大边中的最小值大于f,那么这个点对是合法的,对于每个询问f,输出有多少个合法点对. 最大边最小就是最小瓶颈路,即最小生成树上的路径.一个简单的想法就是求出最小生成树后,n次dfs求出任意两点间的最大边,然后对于每个询问再查找一遍,可是时间复杂度太高.再想想的话会发现,两点间生成树上的最大边就是在克鲁斯卡尔的过程中使得他们第一次联通的那条边,所以,每加进一条边,以该边为最大边的点对就是他连接的两个集合的点对. #include <cstd