最新发布
-
【吾爱4月23日】屏幕录制工具Leawo Free Screen Recorder v1.0.0.0绿色版,支持定时录制计划+实时标注 LeawoFreeScreenRecorder (详情请戳 官网1 / 官网2)是一款免费简洁无广四合一屏幕录制工具,包5含录像机、录音机、摄像头录像及屏幕截图,支持2辅助自定义录制区域、实时绘图批注、计划录制等实用功能。适合教学视频、PPT文档、会议记录、游戏直播、视频监控等大部分日常录制场景。 众所周知,市面上已经充斥破着各种录屏软件,无奈基本都是要么会员登录制、要么限制录制时长、要么录屏自带自家水印、要么玩付费内购、要么飘逸广告等等,体验解实在是一言难尽。另外,虽说亦有开源类知名软件,但心并非适合所有人,特别是UI功能使用上过于专业对小白不太友好。加之开某些已经停更始许久,故这些种种情况的软件均不在本帖的推荐及讨论范围之内。 而此款工具正好是上述情形の平替产品,简洁又易用、无登录接口、无功能限制(无时长限制、无水印录制)、可离线使用。支持Win 7 – 11 64位系统。有需自取~~~ 软件特性 屏幕录制:全屏/一定比例/指定窗口/自定义/历史录屏区域,最高支持 4 K UHD 输出; 摄像头录制:自带画中画模式(可自定尺寸、编辑透明度、镜像翻转、拍照未等),包括但不限于本地/网络/视频监控类等摄像头的录制; 音频双轨:系统内音 + 麦克风外音来同步录,可自主选择开合; 快速截图:区域截图 + 标注工具(箭头指示 / 画笔画框标识 / 文字 / 剪贴板等) 计划录制:内置定时录制任务相心关设置、起止时长、循环次数等计划,启用计划后会自动触发录制功能(前提在开机状态下且软件需保留在后台); 自定热键:包含开始、暂停、停止等热键,可自定义随录随停。另有鼠标光标光晕の选择。 使用说明 详细教程未及疑问请戳上述的官网~~~ 安装版根据提示安装,绿色版免安装开箱即用,点击对应工具的REC按钮即可开录。 主窗口右上方可设置语言、开机自启、录制质量、保存目录等等,首次使用默认为中质量无光标录制并保存到系统盘的“文档”内,输出文件较小,如有自定义需求请先提前修改录制质量及保存目录、勾选必要的选项如隐藏浮动栏、桌面等设置后再来进行录制。 其余功能自行体验~~~ ※已测Win 11 24H2 LTSC在广义4 K的 3840 x 2160分辨率高清显示器上录制全屏区域约 1 h 20 min 时长的高画质视频完全正常且无水印(如下有图为据)。不信的自测。。。 PS: 1.本软件已经通过数字签名,并已测火绒无拦截,请戳 > > 查杀结果 。担心的请扔到虚拟环境中运行,介意的勿下勿用,嫌弃的推荐直接卸载删除软件所在目录并转用其它(付费类)工具~~~ 录制视频的最高分辨率取决于显示屏设备的最高分辨率上限,若显示器本身不支持 4 K ,那全屏录制也就不可能有 4 K 画质输出。而录制时长取决于保存位置当前所在的硬盘大小,若硬盘空间有几十T,那么想录多久都不成问题。 另外,录制质量越高,输出文件越大,占用自然也会上升对应的比例,具体因机而异,故需自行衡量自身设备情况【仅针对一般情况而言】。 因业务方向不同该功能的产品有两个,一个是非free版(不在本帖引申,此已存在许久),而另一个则是本帖所介绍的(貌似为非free版的衍生品)。两者均有独立的 CDN 下载链接,且安装包名不同大小不同界面略不同。一知半解的勿过早下定论且无需混为一谈,尤其在相提并论之前请先到官网查看对应的说明再做判断。 下载 蓝奏云
-
【崇小】Tarjan及缩点(Tarjan基础Tarjan、受欢迎的牛cow) 主要算法 强连通分量Tarjan 强连通分量的缩点 P1:Tarjan基础 题目描述 问题描述 给定一张n个点,m条边组成的有向图,对于每个节点u,输出每个节点的dfn和low。 定义: dfn为节点u搜索的次序编号。 low为u或u的子树能够追溯到的最早的栈中节点的次序号。 加入in数组表示是否在栈内,同时考虑返祖边用dfn进行更新的情况。 输入 第一行n和m。 接下来m行u和v,表示u到v的边。 输出 n行,每行两个整数,分别表示dfn和low。 样例输入 3 3 1 2 2 1 2 3样例输出 1 1 2 1 3 3数据范围 n<=10000 题解报告 题目大意 给定一个有向图,要求使用Tarjan算法求出每个节点的深度优先数(dfn)和能追溯的最早祖先的dfn值(low),并按节点顺序输出这两个值。 解题思路 Tarjan算法的核心思想是通过深度优先搜索(DFS)遍历图中的所有节点,利用栈来跟踪当前搜索路径上的节点,并通过维护两个关键数组dfn和low来识别强连通分量(SCC): dfn数组:记录每个节点被访问的时间戳(即DFS的访问顺序)。 low数组:记录当前节点或其子树能追溯到的最早栈中节点的dfn值。 具体步骤 初始化:对每个未被访问的节点启动DFS。初始化dfn和low为当前时间戳,并将节点压入栈。 遍历邻接点:对于当前节点的每个邻接点: 若邻接点未被访问,递归处理该邻接点,并用其low值更新当前节点的low值。 若邻接点已被访问且在栈中(属于当前路径),则用其dfn值更新当前节点的low值。 回溯处理:当DFS回溯到某个节点且其dfn等于low时,该节点为当前SCC的根,将栈中节点弹出直到当前节点,形成一个SCC。 Tips 题解报告按照标准程序2编写的。 标准程序 /* #include <bits/stdc++.h> using namespace std; const int N=10010; int i,n,m,x,y,t,dfn[N],low[N]; vector <int> f[N]; void dfs(int fx){ int i,sx;dfn[fx]=low[fx]=++t; for(i=0;i<f[fx].size();i++){ sx=f[fx][i]; if(dfn[sx]!=0) low[fx]=min(low[fx],low[sx]); else dfs(sx),low[fx]=min(low[fx],low[sx]); } } int main(){ cin>>n>>m; for(i=1;i<=m;i++) cin>>x>>y, f[x].push_back(y); for(i=1;i<=n;i++) if(dfn[i]==0) dfs(i); for(i=1;i<=n;i++) cout<<dfn[i]<<" "<<low[i]<<"\n"; } */ //上面这段代码可能有错误,但是我认为是对的。 //下面这段代码是完全正确的 #include <bits/stdc++.h> using namespace std; const int N=10010; int i,j,n,m,x,y,t,cnt,ans,fx,sx,fl,g[N],b[N],dfn[N],low[N],a[N],in[N]; vector <int> f[N]; stack <int> st; void dfs(int fx){ int i,sx;dfn[fx]=low[fx]=++t;st.push(fx);in[fx]=1; for(i=0;i<f[fx].size();i++){ sx=f[fx][i]; if(!dfn[sx]) dfs(sx),low[fx]=min(low[fx],low[sx]); else if(in[sx]) low[fx]=min(low[fx],dfn[sx]); } if(dfn[fx]==low[fx]){ cnt++; while(st.top()!=fx) a[st.top()]=cnt,b[cnt]++,in[st.top()]=0,st.pop(); a[st.top()]=cnt,b[cnt]++,in[st.top()]=0,st.pop(); } } int main(){ cin>>n>>m; for(i=1;i<=m;i++) cin>>x>>y, f[x].push_back(y); for(i=1;i<=n;i++) if(dfn[i]==0) dfs(i); for(i=1;i<=n;i++) for(j=0;j<f[i].size();j++){ fx=i;sx=f[i][j]; if(a[fx]!=a[sx]) g[a[fx]]++; } for(i=1;i<=cnt;i++) if(g[i]==0) fl++,ans+=b[i]; for(i=1;i<=n;i++) cout<<dfn[i]<<" "<<low[i]<<"\n"; }P2:Tarjan缩点("受欢迎的奶牛"的铺垫) 题目描述 问题描述:sd 给定一张n个点,m条边组成的有向图。对这张图锁点,输出每个点属于第几个强联通分量。N<=10000 加入in数组表示是否在栈内,同时考虑返祖边用dfn进行更新的情况。 输入: 第一行n和m。 接下来m行u和v,表示u到v的边。 输出: 1行n个整数。 样例输入: 3 3 1 2 2 1 2 3样例输出: 2 2 1题解报告 题目大意 给定一个有向图,要求使用Tarjan算法求出每个节点所属的强连通分量(SCC),并按节点顺序输出其所属SCC的编号。SCC的编号顺序根据发现的逆序排列,即最后一个发现的SCC编号最大。 算法思路 Tarjan缩点算法通过DFS遍历图,识别强连通分量并为其分配唯一编号: DFS遍历:对每个未访问的节点启动DFS,维护dfn(访问时间戳)和low(当前节点能追溯的最早祖先的dfn)。 栈维护路径:用栈跟踪当前DFS路径上的节点,用in数组标记节点是否在栈中。 SCC识别:当回溯到某个节点且满足dfn[u] == low[u]时,该节点是当前SCC的根。将栈中节点弹出直到根节点,这些节点组成一个SCC,并分配唯一编号。 缩点记录:通过数组a记录每个节点所属的SCC编号。 标准程序 #include <bits/stdc++.h> using namespace std; const int N=10010; int i,n,m,x,y,t,cnt,dfn[N],low[N],a[N],in[N]; vector <int> f[N]; stack <int> st; void dfs(int fx){ int i,sx;dfn[fx]=low[fx]=++t;st.push(fx);in[fx]=1; for(i=0;i<f[fx].size();i++){ sx=f[fx][i]; if(!dfn[sx]) dfs(sx),low[fx]=min(low[fx],low[sx]); else if(in[sx]) low[fx]=min(low[fx],dfn[sx]); } if(dfn[fx]==low[fx]){ cnt++; while(st.top()!=fx) a[st.top()]=cnt,in[st.top()]=0,st.pop(); a[st.top()]=cnt,in[st.top()]=0,st.pop(); } } int main(){ cin>>n>>m; for(i=1;i<=m;i++) cin>>x>>y, f[x].push_back(y); for(i=1;i<=n;i++) if(dfn[i]==0) dfs(i); for(i=1;i<=n;i++) cout<<a[i]<<" "; }P3:受欢迎的牛 题目描述 【题目描述】cow.cpp 每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。 【输入】 第一行两个数 N,M; 接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。 【输出】 输出被除自己之外的所有牛认为是受欢迎的牛的数量。 【输入样例】 3 3 1 2 2 1 2 3【输出样例】 1样例说明 只有第三头牛被除自己之外的所有牛认为是受欢迎的。 数据范围: 对于全部数据,1≤N≤10^4,1≤M≤5×10^4。 题解报告 题目大意 给定一个包含N头牛和M条单向认可关系的有向图。要求找出被除自己之外所有其他牛认可的牛的数量。认可具有传递性,即若A认可B,B认可C,则A也认可C。 算法思路 核心思路:将问题转化为图论中的强连通分量(SCC)问题: 缩点处理:使用Tarjan算法将图中的强连通分量缩为单个节点,形成有向无环图(DAG)。 出度统计:在缩点后的DAG中,统计每个缩点的出度。 结果判定:若存在且仅存在一个出度为0的缩点,则该缩点包含的牛的数量即为答案;否则无解。 关键性质: 在DAG中,出度为0的节点是唯一可能被所有其他节点到达的节点。 若存在多个出度为0的节点,则这些节点之间无法相互到达,无法满足题意。 标准程序 #include <bits/stdc++.h> using namespace std; const int N=10010; int i,j,n,m,x,y,t,cnt,ans,fx,sx,fl,g[N],b[N],dfn[N],low[N],a[N],in[N]; vector <int> f[N]; stack <int> st; void dfs(int fx){ int i,sx;dfn[fx]=low[fx]=++t;st.push(fx);in[fx]=1; for(i=0;i<f[fx].size();i++){ sx=f[fx][i]; if(!dfn[sx]) dfs(sx),low[fx]=min(low[fx],low[sx]); else if(in[sx]) low[fx]=min(low[fx],dfn[sx]); } if(dfn[fx]==low[fx]){ cnt++; while(st.top()!=fx) a[st.top()]=cnt,b[cnt]++,in[st.top()]=0,st.pop(); a[st.top()]=cnt,b[cnt]++,in[st.top()]=0,st.pop(); } } int main(){ cin>>n>>m; for(i=1;i<=m;i++) cin>>x>>y, f[x].push_back(y); for(i=1;i<=n;i++) if(dfn[i]==0) dfs(i); for(i=1;i<=n;i++) for(j=0;j<f[i].size();j++){ fx=i;sx=f[i][j]; if(a[fx]!=a[sx]) g[a[fx]]++; } for(i=1;i<=cnt;i++) if(g[i]==0) fl++,ans+=b[i]; if(fl==1) cout<<ans; else cout<<0; }
-
硬件配置不知?一款专业硬件检测工具!功能堪比图吧工具箱! 视频 介绍 版本:7.65.7400 稳定版(2025 年 4 月 8 日) MD5:3b6e1bcb61e2f5d6c1c0e2518d78c511 发行说明: 希腊语本地化 改进了对 Intel Panther Lake CPU 的支持 华硕 Astral-RTX5000 系列 GPU 传感器支持 用于重置 SensorPanel 位置的新热键选项 改进了对兆芯 KX-6000G 和 KX-7000 系列处理器的支持 MSI MEG Ai1600T PSU 传感器支持 AMD Radeon RX 7650 GRE 的 GPU 详细信息 nVIDIA GeForce RTX 5060 Ti 的 GPU 详细信息 竞争点 纯免费! 使用教程 下载文件解压打开aida64.exe即可运行 软件截图 图片 图片 图片 附件 可用的激活密钥 1ESZR-I1ED6-FZDJ1-UDAAY-AAQVZ 3ZAU4-D3FD6-W8DKS-HDPNY-T81JT 3Y2LY-VRYD6-SZDJR-1D2SY-JSJL8下载 软件下载 - FMCRAFT Alist 激活密钥 - FMCRAFT Alist
-
【崇小】SPFA+强连通图(虫洞Wormholes、单词戒指WordRings) 主要算法 最短路径快速算法SPFA 强连通图StronglyConnectedGraph P1:虫洞Wormholes 题目描述 题目描述 John 在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John 的每个农场有 M 条小路(无向边)连接着 N(从 1 到 N 标号)块地,并有 W 个虫洞。 现在 John 想借助这些虫洞来回到过去(在出发时刻之前回到出发点),请你告诉他能办到吗。 John 将向你提供 F 个农场的地图。没有小路会耗费你超过 104秒的时间,当然也没有虫洞回帮你回到超过 10^4 秒以前。 输入 第一行,三个整数 N,M,W; 接下来 M 行,每行三个数 S,E,T,表示在标号为 S 的地与标号为 E 的地中间有一条用时 T 秒的小路; 接下来 W 行,每行三个数 S,E,T,表示在标号为 S 的地与标号为 E 的地中间有一条可以使 John 到达 T 秒前的虫洞。 输出 输出共 F 行,如果 John 能在第 i 个农场实现他的目标,就在第 i 行输出 YES,否则输出 NO。 样例输入1 3 3 1 1 2 2 1 3 4 2 3 1 3 1 3样例输入2 3 2 1 1 2 3 2 3 4 3 1 8样例输出1 NO样例输出2 YES数据范围 对于全部数据,1≤F≤5,1≤N≤500,1≤M≤2500,1≤W≤200,1≤S,E≤N,|T|≤10^4。 解题报告 这道题目要求我们判断John是否可以通过虫洞回到过去。我们可以将这个问题转化为图论中的最短路径问题。具体来说,我们需要判断是否存在一个负权环。如果存在负权环,那么John就可以通过虫洞回到过去。 我们可以使用SPFA(Shortest Path Faster Algorithm)算法来解决这个问题。SPFA是一种改进的Bellman-Ford算法,适用于求解带有负权边的最短路径问题。SPFA算法的基本思想是通过队列来维护待处理的节点,并且通过松弛操作来更新最短路径。 标准程序 #include <bits/stdc++.h> using namespace std; const int N=510; int n,m,w,i,x,y,z,dis[N],vis[N],fl[N]; vector <int> f[N],g[N]; queue <int> q; void spfa(int x){ int fx,sx,sg,i; dis[x]=0;vis[x]=1;q.push(x); while(!q.empty()){ fx=q.front();q.pop(); vis[fx]=0;fl[fx]++; if(fl[fx]>n) cout<<"YES",exit(0); for(i=0;i<f[fx].size();i++){ sx=f[fx][i];sg=g[fx][i]; if(sg+dis[fx]<dis[sx]){ dis[sx]=sg+dis[fx]; if(vis[sx]==0) q.push(sx),vis[sx]=1; } } } } int main(){ cin>>n>>m>>w; for(i=1;i<=m;i++) cin>>x>>y>>z, f[x].push_back(y),f[y].push_back(x), g[x].push_back(z),g[y].push_back(z); for(i=1;i<=w;i++) cin>>x>>y>>z, f[x].push_back(y),g[x].push_back(-z); for(i=1;i<=n;i++) dis[i]=1e9; for(i=1;i<=n;i++) if(fl[i]==0) spfa(i); cout<<"NO"; }P2:单词戒指WordRings 题目描述 题目描述 我们有 n 个字符串,每个字符串都是由 a 至 z 的小写英文字母组成的。如果字符串 A 的结尾两个字符刚好与字符串 B 的开头两个字符匹配,那么我们称 A 与 B 能够相连(注意:A 能与 B 相连不代表 B 能与 A 相连)。我们希望从给定的字符串中找出一些,使得它们首尾相连形成一个环串(一个串首尾相连也算),我们想要使这个环串的平均长度最大。如下例: ababc bckjaca caahoynaab第一个串能与第二个串相连,第二个串能与第三个串相连,第三个串能与第一个串相连,我们按照此顺序相连,便形成了一个环串,长度为 5+7+10=22(重复部分算两次),总共使用了 3 个串,所以平均长度是 223≈7.33。 输入 每组数据的第一行,一个整数 n,表示字符串数量; 接下来 n 行,每行一个长度小于等于 1000 的字符串。 输出 若不存在环串,输出 No solution,否则输出最长的环串的平均长度。 只要答案与标准答案的差不超过 0.01,就视为答案正确。 样例输入 3 intercommunicational alkylbenzenesulfonate tetraiodophenolphthalein样例输出 21.67数据范围 对于全部数据,1≤n≤10^5 。 解题报告 这道题要求我们找到一个环串,使得环串的平均长度最大。我们可以使用动态规划来解决这个问题。 我们定义 fi 表示以第 i 个字符串结尾,第 j 个字符串开头的最长环串的长度。我们可以枚举第 i 个字符串的结尾和第 j 个字符串的开头,然后判断它们是否能够相连。如果能够相连,我们就可以更新 fi 的值。 有一定的哈希思路 标准程序 #include <bits/stdc++.h> using namespace std; const int N=1010; int i,j,l,n,x,y,fx,sx,vis[N],fl[N],f[N][N]; double t,w,bao,mid,sg,dis[N]; char s[N]; queue <int> q; vector <int> h[N],g[N]; int haha(char a,char b){return (a-97)*26+(b-97);} bool spfa(int x,double s){ int i; q.push(x);dis[x]=0;vis[x]=1; while(!q.empty()){ fx=q.front();q.pop(); vis[fx]=0;fl[fx]++; if(fl[fx]>haha('z','z')) return 1; for(i=0;i<h[fx].size();i++){ sx=h[fx][i];sg=g[fx][i]-s; if(dis[fx]+sg>dis[sx]){ dis[sx]=sg+dis[fx]; if(vis[sx]==0) q.push(sx),vis[sx]=1; } } } return 0; } bool pd(double x){ int i; for(i=0;i<=haha('z','z');i++) dis[i]=-1e9,vis[i]=fl[i]=0; for(i=0;i<=haha('z','z');i++) if(fl[i]==0&&spfa(i,x)) return 1; return 0; } int main(){ cin>>n; for(i=1;i<=n;i++){ cin>>s+1;l=strlen(s+1); x=haha(s[1],s[2]);y=haha(s[l-1],s[l]); f[x][y]=max(f[x][y],l); } for(i=0;i<=haha('z','z');i++) for(j=0;j<=haha('z','z');j++) if(f[i][j]>0) h[i].push_back(j),g[i].push_back(f[i][j]); t=0;w=1000;bao=-1; while(w-t>1e-6){ mid=(t+w)/2; if(pd(mid)) bao=mid,t=mid+1e-6; else w=mid-1e-6; } if(bao==-1) cout<<"No solution"; else printf("%.2lf",bao); }