AcWing P164 可达性统计 题解】的更多相关文章

Analysis 这道题我一开始想到的是传递闭包,但是时间复杂度是n³,也开不下30000*30000的数组,所以我想到了拓扑+状态压缩(bitset),从后往前找,把能到达的点能到哪里用位运算赋到上一个中,最后调用.count()输出就好了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<…
给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能够到达的点的数量. 数据范围 1≤N,M≤30000 显然可以用拓扑排序+状态压缩来做, 用一个n位的二进制数存每一个f[x], 其中第i位是1表示x能到i,0则不能到i, 这样就相当于存在x 到 y的一条边,f[x] |= f[y], 再预处理处拓扑序, 反向枚举, 最后判断每个f[i]中的个数,…
牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 10 3 8 2 3 2 5 5 9 5 9 2 3 3 9 4 8 2 10 4 9 题解: 想要统计每个点能够出发到达的点数量,如果一个一个点来搜索计算的话,那么复杂度将会变成 \(O(n^2)\),所以我们要换个角度思考,在访问每一个点的时候,考虑由哪个点可以到达它,所以我们可以反向建边,按照图…
[题目描述] 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. [题目链接] 2101 可达性统计 [算法] 拓扑排序之后逆序计算(感觉dfs更好写而且应该更快一点),bitset状态压缩模拟集合的并操作. [代码] #include <bits/stdc++.h> using namespace std; int n,m,tot,cnt; struct edge{ int to,next; }e[30010]; int head[30010],t…
CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 共N行,表示每个点能够到达的点的数量. 样例输入 10 10 3 8 2 3 2 5 5 9 5 9 2 3 3 9 4 8 2 10 4 9 样例输出 1 6 3 3 2 1 1 1 1 1 思路 我们可以利用记忆化搜索,对于每个点,记录它能到达的点的集合. 至于怎么记…
给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能够到达的点的数量. 数据范围 1≤N,M≤300001≤N,M≤30000 输入样例: 10 10 3 8 2 3 2 5 5 9 5 9 2 3 3 9 4 8 2 10 4 9 输出样例: 1 6 3 3 2 1 1 1 1 1 算法:拓扑排序 + 状态压缩算法 题解:首先求出该有向无环图的拓扑…
题目链接:传送门 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 共N行,表示每个点能够到达的点的数量. 样例输入 10 10 3 8 2 3 2 5 5 9 5 9 2 3 3 9 4 8 2 10 4 9 样例输出 1 6 3 3 2 1 1 1 1 1 题解: 首先,如果用 $f(x)$ 代表从点 $x$ 出发所能到达的所有点的集合,应有…
题意 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 分析 有向无环图,可以按拓扑序逆序统计答案.可以用bitset维护可达性. 时间复杂度\(O(N (N+M)/32 )\),空间大小\(N^2/8\)字节. 代码 #include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ r…
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - PAT乙级(Basic Level)真题 之 1021.个位数统计_牛客网 在线提交: https://www.nowcoder.com/pat/6/problem/4047 或 PTA(拼题A,原PAT) https://pintia.cn/problem-sets/9948052602231029…
题目传送门 这道题暴力又让我过了...数据真的很水(luogu) 暴力枚举n~m的每个数,再统计一次,交付评测...AC #include<bits/stdc++.h> using namespace std; ]; int main(){ scanf("%d%d",&n,&m); for(int i=n;i<=m;i++){ ,fs; ){ ++k; fs=tmp%; tmp/=; a[fs]++; } } ;i<=;i++) printf(&…
https://www.lydsy.com/JudgeOnline/problem.php?id=3992 https://www.luogu.org/problemnew/show/P3321 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个…
http://www.lydsy.com/JudgeOnline/problem.php?id=1588 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出…
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 输入输出格式 输入格式: 输…
题目链接:https://www.luogu.org/problemnew/show/P5015 分析: 这道题大概是给个签到分吧.很显然的字符串操作.本篇题解主要帮助初学者,请大佬略过. 首先给大家介绍一个叫 gets(s)gets(s)gets(s) 的东东. s☞字符串的名称 他有什么作用呢? 将一行字符从文件或屏幕中读入,可以读空格,遇到换行跳出. -- by 本人 此题也明显告诉是读入仅一行,我们可以这么做. 哇!我们现在可以在计算机里进行操作了耶! 在这里告诉大家noip很重要的一点…
Content 有 \(t\) 组询问,每组询问给定一个长度为 \(n\) 的数列,请将出现次数最多的数按照从小到大的顺序输出,或者这些数在数列中出现的次数都相等. 数据范围:\(t\) 未知,\(n\leqslant 10^5,a_i\leqslant 10^9\). Solution 算是比较小清新的排序题. 我们直接用 map 开个桶,统计每个数出现的次数,然后排序看哪些数出现的次数最多,然后将这些数再次从小到大排序后输出即可,注意特判一下所有数出现的次数都相等的情况. Code int…
Update \(\texttt{2021.3.11}\) 修复了一个笔误. Content 太长了,请直接跳转回题面查看. 数据范围:\(n\leqslant 10^4\),\(0\leqslant a,b\leqslant 59\),\(0\leqslant c\leqslant 100\),\(m\leqslant 10^5\),\(0\leqslant l\leqslant 100\),\(0\leqslant s\leqslant 10^6\). 变量含义同原题面. Solution…
拓扑排序+状态压缩 考虑每一个点能够到达的所有点都是与该店相邻的点的后继节点,可知: 令f[u]表示u点可到达的节点个数,f[u]={u}与f[v](u, v)的并集 于是可以利用状态压缩,能够到达的节点用1表示,这样更新f的时候直接求并集即可 #include <bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; inline int lowbit(int x){ return x…
https://www.lydsy.com/JudgeOnline/problem.php?id=1058 https://www.luogu.org/problemnew/show/P1110#sub 实现三种操作: INSERT i k:在原数列的第i个元素后面添加一个新元素k:如果原数列的第i个元素已经添加了若干元素,则添加在这些元素的最后(见下面的例子) MIN_GAP:查询相邻两个元素的之间差值(绝对值)的最小值 MIN_SORT_GAP:查询所有元素中最接近的两个元素的差值(绝对值)…
Analysis 首先假设一天的第N小时与后一天的第一个小时不相连, 这种情况下DP转移比较好想 dp[i][j][0/1]dp[i][j][0/1]表示 考虑一天的前i个小时,已经休息了j小时,且第i个小时是否在休息 那么有状态转移方程: dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]); dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j-1][1]+a[i]); 初始化为dp[1][0][0]=dp[1][1][1]=…
每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] -> dp[i]dp[i][x][y][z] 代表为第i次选择的情况下,对应的1,2,3号服务员所对应的位置那么可以得知dp[i][arr[i]][y][z] = min(dp[i][arr[i]][y][z], dp[i - 1][x][y][z] + cost[x][arr[i]])dp[i]…
Analysis 就是一个裸的广搜,每次从是1的点开始找就好啦~~~ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxn 1010 using namespace std; inline int read() { ; ; char c=getchar(); ; )+(x<<)+c-'…
Analysis 这道题是搜索,类似于小木棍,加一些剪枝. 第一个剪枝是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可. 第二个剪枝是我们可以将小猫的体重从大到小排序,这样我们的搜索树就会缩短许多. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 18+10 using namespace std; typ…
Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 110 using namespace std; inline int read() { ; ; char c=getch…
Analysis 这是一个经典的二分图问题,我们将图进行奇偶染色,注意边界条件的判断.再跑一遍匈牙利算法就行了,跟上一题很像. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 110 using namespace std; inline int read() { ; ; char c=getchar(); ; )+(x<<…
阿轩在纸上写了两个字符串,分别记为A和B. 利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度. 不过阿轩是一个勤学好问的同学,他向你提出了Q个问题: 在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x. 例如:A=aabcde,B=ab,则A有aabcde.abcde.bcde.cde.de.e这6个后缀子串,它们与B=ab的匹配长度分别是1.2.0.0.0.0.…
给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. 输入格式 第一行输入两个整数N,M. 接下来N行每行输入一个字符串SiSi. 接下来M行每行一个字符串T用以询问. 输出格式 对于每个询问,输出一个整数表示答案. 每个答案占一行. 输入样例: 3 2 ab bc abc abc efg 输出样例: 2 0 题意:让你计算前面有多少个字符串是查询的这…
题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]:u为根的子树中节点总数: son[u]:u的重儿子: top[u]:u所在的重链的顶部节点: seg[u]:u在线段树中的位置: rev[u]:seg的倒置,即rev[seg[u]] == u. 然后套线段树模板实现区间最值.区间和,及单点更新操作. 实现代码如下: #include <bits/s…
看了好久才懂,我好菜啊-- 题意:给两个字符串 \(a\) 与 \(b\),对于 \(q\) 次询问,每次询问给出一个 \(x\),求存在多少个位置使得 \(a\) 从该位置开始的后缀子串与 \(b\) 匹配的长度恰好为 \(x\). 这题可以 Hash+二分 \(O(n\log n)\) 过,还有一个高端做法是扩展 KMP(然而并不会 正解的话,还是 KMP.但此题对 KMP 的理解还是要求很高啊. 对 \(b\) 求一遍 \(nxt\),再求 \(a\) 的 \(f\).那么根据定义,\(f…
前置知识点:二进制状态压缩,动态规划. 1. AcWing 91 最短Hamilton路径 (https://www.acwing.com/problem/content/93/) 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入格式 第一行输入整数n. 接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j]). 对于任意…
题面:P2234 [HNOI2002]营业额统计 题解:随便写写 注意:cmath中abs函数返回的是一个浮点数,在bzoj上会ce 代码: #include<cstdio> #include<cstring> #include<iostream> #include<set> #define abs(a) ((a)>=0?(a):(-a)) #define ll long long using namespace std; ll ans,N,x,a,b…