雅礼培训day1 世界线 Worldline

题目大意:

给出一个有向无环图,要求对于图中的u,v,t三点,满足u->v,v->t,u->t,经过观察我们发现就是要将图中每一个点连接所有他可以达到的点,最后输出连接的边的数量。

对此我们可以dfs求出每一个点可以到达其他的点边,最后用求出的边数减去原来已经连接的边,其中用bitset优化。

代码送上:

 1 #include <cstdio>
 2 #include <bitset>
 3 #include <iostream>
 4 #define For(i, j, k) for(int i = j; i <= k; i++)
 5 using namespace std;
 6 const int N = 60010, M = 100010;
 7 int Begin[N], Next[M], to[M], e;
 8 void Add(int u, int v){
 9     to[++e] = v;
10     Next[e] = Begin[u];
11     Begin[u] = e;
12 }
13 bitset<N/2> G[N];//由于数据太大,要分两次来算
14 int n, m;
15 bool vis[N];
16 long long Ans;
17 void DFS(int o, bool flag){
18     vis[o] = true;
19     if(flag && o <= (n >> 1)) G[o][o] = true;
20     else if(!flag && o > (n >> 1)) G[o][o - (n >> 1)] = true;
21     for(int i = Begin[o]; i; i = Next[i]){
22         int u = to[i];
23         if(!vis[u]) DFS(u, flag);
24         G[o] |= G[u];
25     }
26     Ans += G[o].count();
27 }
28
29 int main(){
30     scanf("%d%d", &n, &m);
31     For(i, 1, m){
32         int u, v;
33         scanf("%d%d", &u, &v);
34         Add(u, v);
35     }
36     For(i, 1, n) if(!vis[i]) DFS(i, true);//第一次计算
37     For(i, 1, n) vis[i] = false, G[i].reset();
38     For(i, 1, n) if(!vis[i]) DFS(i, false);//第二次计算
39     printf("%lld\n", Ans - m - n);
40     return 0;
41 }

博主蒟蒻,自己写的代码找不到了,改天写了补上

再次感谢大佬的AC代码

时间: 2024-11-05 07:29:57

雅礼培训day1 世界线 Worldline的相关文章

雅礼集训——day1、day2

day1: 嗯上午考试拿了100分.第一题40,第二题60.看完题的时候我就觉得第二题的部分分是最好得到的,因为数据范围只有300,而且一眼看上去就是网络流的二分图多重匹配模型?然后就建了个网络流写了些,期望得分是70分,但是第1组数据有点劲,被卡掉了,就拿了60分.正解是map+set的贪心...并不会STL 写完T2去看T1,先用DFS乱搞了一下,结果样例都没过去,我手推了一下样例,得到了一个公式,就是从一个点出发需要加上的边数=这个点通过DFS能够遍历到的点的个数-与这个点直接相连的点的个

雅礼培训day2 时间机器 machine

题目大意: 给你两组区间,求覆盖问题. 对于这个问题我们可以针对每个区间的左端点进行排序,在枚举节点时,在左端点满足要求的情况下,是使右端点尽量靠近节点的右端点,使用map来优化 代码送上: 1 #include <cstdio> 2 #include <algorithm> 3 #include <map> 4 5 #define For(i, j, k) for(int i = j; i <= k; i++) 6 #define y second 7 8 9

2017雅礼集训 Day1

今日得分:60+0(忘记关调试输出)+50 = 110 今日题解: T1:std做法:直接暴力n^2枚举,搜索加最优性剪枝 做法2:O(17n)DP,记录匹配偏移量 T2:求出通项,把不同的幂次拆开计算,单独一项的幂次可以分治FFT 我的做法:分治矩乘,但我不知道矩阵怎么FFT T3:虚树+树链剖分维护,标程400行 感觉还行?明天会做得更好的

雅礼培训 1.2

模拟赛 串(string) [题目描述]给定一个由小写字母组成的字符串 s,每次你可以删去它的一个非回文子串,求删成空串的最小次数.[输入数据]第一行一个整数 t 表示数据组数.每组数据第一行一个整数 n 表示字符串长度,第二行一个字符串 s.[输出数据]每组数据输出一行一个整数表示答案,如果无法删成空串输出-1.[样例输入]27abcdcba3xxx[样例输出]2-1[样例解释]对于第一个样例,一种最优方案为 abcdcba->adcba->空串.[数据范围]对于 30%的数据,n<=

雅礼培训4.3 Problem A 【点分治】

题目简述 一个\(N\)个节点的树,有\(M\)个炸弹分布在一些节点上,有各自的威力,随着其他点距离增大对其他点的伤害呈等差减小,直至为0 问每个点受到的伤害 题解 QAQ考场代码没处理好有些炸弹威力很大这个事实,,数组爆掉... AC算法直接变暴力分,,, 点分治即可 我是每次将子树内所有的炸弹统计到根来,再用一个差分数组求出各个深度受到的伤害,累加入每个节点的答案 但是由于可能会出现伤害来自同一个子树的情况,我们再对每个子树做一遍撤销 常数略大,,经玄学优化强行卡入时限 #include<a

#6030. 【雅礼集训 2017 Day1】矩阵

#6030. 「雅礼集训 2017 Day1」矩阵 题目描述 有一个 n×n  的矩阵,每个位置 (i,j) 如果是 . 表示为白色,如果是 # 表示为黑色. 初始时,每个位置可以是黑色或白色的,(i,j)  位置的值会作为 ai,j 给你. 现在有一种操作,选择两个整数 i,j∈[1,n],记 (i,1),(i,2),…,(i,n) (i, 1), (i, 2)的颜色为 C1,C2,…Cn ??,将 (1,j),(2,j),…,(n,j)  的颜色赋为 C1,C2,…,Cn ??. 你的任务是

2017雅礼省选集训做题记录

嘛,最近在补雅礼省选前集训的题.都是我会做的题..那一定是最水的那些题啦 题目在loj.ac上都有.过段时间如果搬了雅礼NOI集训的题应该也会做做的吧.. Day1 T1 一道经典套路题,做法跟UOJ #228基础数据结构练习题类似. 使用线段树维护.考虑相邻两个数的差值最多变化log次.也就是说,对于每个区间,只要操作二进行大概log次就能使得这个区间内所有数完全一样.所以对于操作二,只要记录一下区间最大最小值,就能直接打标记或者暴力DFS下去. 和UOJ那个题一样,注意一个特殊情况,就是一个

常州培训 day1 解题报告

第一题: 题目大意:给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 100 .70% |S| ≤ 1000 .100% 1 ≤ |S| ≤ 1000000 . 解题过程: 1.考场上想不出AC算法,但是70分是很好拿的,最先想到先求出A,B,C出现次数的前缀和,枚举区间的两个端点,O(1)时间判断,枚举O(n^2). 2.一看后面的题目都不是很好写,就先来优化一下这题,由于只有A,B,C是有

雅礼学习10.2

雅礼学习10.2 上午考试解题报告 各题状况(爆零) T1 想了10多分钟,暴力只有一个极大复杂度的想法,显然不可过,但还是写了,然后就全TLE也是...意料之中 T2 暴力很好写,但是错误理解了Tim给的部分分的意思:先给了一个\(a_i\le 10^9\),然后部分分里面没有提到\(a_i\)的情况,我就忽略了\(a_i\)的大小对答案统计的影响... 换句话说,我当时要是写了离散化,就是\(43\)分到手. T3 题目要求的输出可以分成三个问题,第一个问题正确 的话可以得到这个点的\(25