【过题记录】 7.25

Friends

所有的方案减去非法的方案就是合法的方案
对于一个人,找到他往后的最早出现的非法位置,后面所有的串都是非法
从后往前维护一个最小非法后缀即可。

#include<bits/stdc++.h>
using namespace std;#define int long longconst int N = 1e6+100;
int cnt[N];
int n,m;
typedef pair < int , int > pii;
map < pii , bool > M;
#define mp make_pair
vector < int > a[N];
#define pb push_back
bool vi[N];signed main(){cin>>n>>m;for (int i = 1; i <= n; i++) cnt[i] = n-i+1;for (int i = 1; i <= m; i++){int x,y; cin>>x>>y;if (x > y) swap(x,y);if (!M[mp(x,y)]) cnt[x]--,M[mp(x,y)] = 1,a[x].pb(y);}for (int i = 1; i <= n; i++) sort(a[i].begin(),a[i].end());int now = n+1;int ans = n*(n+1ll)/2ll;for (int i = n; i >= 1; i--){int noww = i;for (int j = 0; j < a[i].size(); j++)if (a[i][j] == noww+1) noww = a[i][j];else break;now = min(now,noww+1);ans-=(n-now+1);}cout<<ans<<endl;return 0;
}

Yet Another Origami Problem

将所有的数从小到大排序之后得到若干相邻区间
对于一个相邻的区间而言,一次操作实际上就是将小的区间翻转到大的区间里面,这个时候原本长度为(x,y)的区间就变成长度为(x,y-x)的区间。
不难发现这个就是辗转相减法的过程。
对于每个区间求一个gcd即可

思路分析有点像之前做的crash的题目

#include<bits/stdc++.h>
using namespace std;#define int long longconst int N = 1e5+100;
int t;
int n;
int a[N];int gcd(int x,int y){return y == 0?x:gcd(y,x%y);
}void Work(){cin>>n;for (int i = 1; i <= n; i++) cin>>a[i];if (n == 1){cout<<0<<endl;return;}sort(a+1,a+n+1);int ans = 0;for (int i = 2; i <= n; i++)if (a[i]-a[i-1]!=0)if (ans == 0) ans = a[i]-a[i-1]; else ans = gcd(ans,a[i]-a[i-1]);cout<<ans<<endl;
}signed main(){cin>>t;while (t--) Work();return 0;
}

LCT

其实就是一个带权并查集模板题。
维护每一个节点的fa和他的深度d
合并的时候对于当前的跟记录一个深度最大值
M a x d [ x ] = m a x ( M a x d [ x ] , M a x d [ y ] + d [ x ] + 1 ) Maxd[x] = max(Maxd[x],Maxd[y]+d[x]+1) Maxd[x]=max(Maxd[x],Maxd[y]+d[x]+1)

#include<bits/stdc++.h>
using namespace std;const int N = 1e6+1;
int fa[N];
int t;
int n;
int d[N];
int Maxd[N];vector < int > a[N];int getfa(int x){if (x == fa[x]) return fa[x];int rt = getfa(fa[x]);d[x] = d[x]+d[fa[x]];fa[x] = rt; return fa[x];
}void Merge(int x,int y){int xf = getfa(x) , yf = getfa(y);fa[yf] = xf; d[y] = d[x]+1;Maxd[xf] = max(Maxd[xf],d[x]+Maxd[y]+1);return;
}void Work(){scanf("%d",&n);for (int i = 1; i <= n; i++) fa[i] = i;for (int i = 1; i <= n; i++) Maxd[i] = 0,d[i] = 0;for (int i = 1; i < n; i++){int x,y,z; scanf("%d %d %d",&x,&y,&z);Merge(x,y);cout<<Maxd[z]<<' ';}for (int i = 1; i <= n; i++) getfa(i);cout<<endl;return;
}int main(){cin>>t;while (t--) Work();return 0;
}

Good Tree

懒得写推导过程了
本题需要注意一个点,求一个数最接近的完全平方数
不能直接sqrt…会有精度损失
可以用二分去找

#include<bits/stdc++.h>
using namespace std;
long long T,now,nowx;
double x;
int main(){scanf("%lld",&T);while (T--){scanf("%lld",&now);x=1.0*now;long long l = 1 , r = 1e9;while (l+1 < r){long long Mid = l+r>>1;if (Mid*Mid > now) r = Mid; else l = Mid;}long long nowx;if (r*r <= now) nowx = r; else nowx = l;if (nowx*nowx==now){printf("%lld\n",nowx*2ll+1ll);}else{if (nowx*(nowx+1ll)>=now){if (nowx%2ll==(now-nowx*nowx)%2ll)printf("%lld\n",nowx*2ll+2ll);else printf("%lld\n",nowx*2ll+3ll);}else printf("%lld\n",nowx*2ll+3ll);}}return 0;
}

排兵布阵


分析:

枚举每一个城堡的人数。
不难发现,对于每一个城堡,只有s种排兵方式
nms暴力转移即可。

#include<bits/stdc++.h>
using namespace std;#define int long longconst int N = 150 , M = 2e4+10;
int n,m,s;
int v[N][M];
int f[N][M];
vector < int > a[N];
#define pb push_backsigned main(){cin>>s>>n>>m;for (int i = 1; i <= s; i++){for (int j = 1,x; j <= n; j++) cin>>x,a[j].pb(x);}for (int i = 1; i <= n; i++){sort(a[i].begin(),a[i].end());}for (int i = 1; i <= n; i++)for (int j = 0; j <= m; j++){for (int k = 0; k < a[i].size();k++){if (2*a[i][k]+1 > j) break;f[i][j] = max(f[i][j],f[i-1][j-a[i][k]*2-1]+i*(k+1));}f[i][j] = max(f[i-1][j],f[i][j]);if (f) f[i][j] = max(f[i][j],f[i][j-1]);}int Max = 0;cout<<f[n][m];return 0;
}

道路

分析:

我们发现,这是一颗完全二叉树
所以树的深度很小
也就是路径长度很小
而题目所本质要求的正是两种不同路径的数量
所以我们可以得到如下dp设置:
f [ x ] [ i ] [ j ] f[x][i][j] f[x][i][j]表示到x号节点,不合法的左边路径有i条,不合法的右边路径有j条的最小值
对于子节点(也就是农村)
f [ x ] [ i ] [ j ] = c [ x ] ∗ ( a [ x ] + i ) ∗ ( b [ x ] + j ) f[x][i][j]=c[x]*(a[x]+i)*(b[x]+j) f[x][i][j]=c[x](a[x]+i)(b[x]+j)
而对于非叶节点(城市),他可以修两条路径中的一条
可以得到以下方程:
f [ x ] [ i ] [ j ] = m i n ( f [ l x ] [ i + 1 ] [ j ] + f [ r x ] [ i ] [ j ] , f [ l x ] [ i ] [ j ] + f [ r x ] [ i ] [ j + 1 ] ) f[x][i][j]=min(f[lx][i+1][j]+f[rx][i][j],f[lx][i][j]+f[rx][i][j+1]) f[x][i][j]=min(f[lx][i+1][j]+f[rx][i][j],f[lx][i][j]+f[rx][i][j+1])

如果光这样只能得到本题90分
因为这样开数组会mle

所以我们要考虑优化空间
我们发现树的路径其实是一条链,而链与链之间的答案不会产生影响。
或者说,一个点的左子树以及右子树的答案之间不会有影响。
所以我们可以采纳类似滚动数组的方式,尽可能高效的利用每一个空间
可以用 d f n 序 dfn序 dfn去代表当前节点的编号。
访问左子树就是 d f n [ x ] + 1 dfn[x]+1 dfn[x]+1右子树就是 d f n [ x ] + 2 dfn[x]+2 dfn[x]+2
由于路径长度最多只有40
所以f数组的第一维只需要开80即可
这样子我们就解决了空间问题


#include<bits/stdc++.h>
using namespace std;#define ll long longconst int N = 4e4 , inf = 1e18;
int n;
ll f[5000][45][45];
int l[N],r[N];
int cnt[N];
int a[N],b[N],c[N];void Dfs(int x,int num){cnt[x] = num;if (l[x] == 0){for (int i = 0; i <= 40; i++)for (int j = 0; j <= 40; j++)f[cnt[x]][i][j] = c[x-n+1]*1ll*(a[x-n+1]+i)*(b[x-n+1]+j);return;}Dfs(l[x],num+1); Dfs(r[x],num+2); for (int i = 0; i <= 40; i++)for (int j = 0; j <= 40; j++)f[cnt[x]][i][j] = min(f[cnt[l[x]]][i+1][j]+f[cnt[r[x]]][i][j],f[cnt[l[x]]][i][j]+f[cnt[r[x]]][i][j+1]);
}signed main(){scanf("%d",&n);cnt[1] = 1;for (int i = 1; i <= 100; i++)for (int j = 0; j <= 40; j++)for (int k = 0; k <= 40; k++) f[i][j][k] = inf;for (int i = 1; i < n; i++){int x,y; cin>>x>>y;if (x > 0) l[i] = x; else l[i] = -x+n-1;if (y > 0) r[i] = y; else r[i] = -y+n-1; }for (int i = n; i <= n*2-1; i++)scanf("%d %d %d",&a[i-n+1],&b[i-n+1],&c[i-n+1]);Dfs(1,cnt[1]);cout<<f[cnt[1]][0][0];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——常见命令

Linux常用命令是Linux系统操作的基础&#xff0c;掌握这些命令能够极大地提高系统管理和文件操作的效率。以下是一些常用的Linux命令及其基本用法&#xff1a; 一、文件与目录操作 ls&#xff1a;列出目录内容 基本用法&#xff1a;ls [选项] [目录名]常用选项&#xff1a;-a…

【Web开发手礼】探索Web开发的魅力(十二)-Vue(2)用户动态页面

前言 主要介绍了用vue框架创建用户动态页面的具体过程&#xff0c;可以帮助学习vue框架的基本知识&#xff01;&#xff01;&#xff01;&#xff01; 用户动态页面 用户信息 用户头像 通过 Bootstrap 所提供的 .img-fluid 类让图片支持响应式布局。其原理是将 max-width: 10…

stm32 在qemu运行

stm32基础工程配置 生成stm32代码 通过cubemx 选择 stm32f407 调试功能关闭&#xff0c;设置外部时钟&#xff0c;设置串口1&#xff0c;选择makefile 工程&#xff0c;生产代码 屏蔽系统时钟配置 // SystemClock_Config 添加 发生代码 HAL_UART_Transmit(&huart1,&quo…

RocketMQ Broker组件

Apache RocketMQ 是一款分布式消息中间件&#xff0c;具有高性能、低延迟、高可靠等特点。RocketMQ 的核心组件之一是 Broker&#xff0c;它负责消息的存储、过滤、事务处理以及定时/延时消息的管理。在本文中&#xff0c;我们将详细探讨 RocketMQ Broker 的这些关键功能。 消…

在Spring Boot中使用自定义过滤器和MDC实现高级日志记录

在现代Web开发中&#xff0c;日志记录是必不可少的。通过记录日志&#xff0c;开发者可以追踪请求的流程、定位问题并进行性能调优。本文将介绍如何在Spring Boot项目中使用自定义过滤器结合MDC&#xff08;Mapped Diagnostic Context&#xff09;技术&#xff0c;实现高级日志…

三子棋小程序

一.自定义头文件(game.h) 放入源文件需要用到的标准库头文件和函数的声明 ROW 和COL为棋盘的行和列&#xff0c;三子棋嘛&#xff0c;肯定为3啦 #pragma once #include<stdio.h> #include<String.h> #include<stdlib.h> #include<time.h> #define ROW…

Redis(三)事务、管道、主从复制

事务 事务是可以执行一个命令&#xff0c;也可以执行多个命令&#xff0c;事务本质上是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化地执行而不会被其他命令插入 Redis事务和传统数据库的区别 单独的隔离操作&#xff1a;Redis的事务仅仅是保证…

Robot Operating System——深度解析监控Parameters修改的底层实现

大纲 AsyncParametersClientParameterEventHandler监控全部Parameters监控Node上Parameters的变动触发 总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》和《Robot Operating System——ParameterEventHandler监控Parameters的增删改行为…

《Java初阶数据结构》----10.<Map和Set---TreeSet和TreeMapHashSet和HashMap >

前言&#xff1a; 大家好&#xff0c;我目前在学习java。我准备利用这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论&#xff01;&#xff01;&#xff01; 喜欢我文…

Linux守护进程daemon与服务service及systemctl命令的作用

在 Linux 系统的服务管理中会经常提到 daemon&#xff08;守护进程&#xff09; 与 service&#xff08;服务&#xff09;&#xff0c;守护进程 daemon 是指后台运行的进程&#xff0c;随系统启动而为应用程序提供支持&#xff0c; 而服务 service 则用于提供某种功能。 简单的…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码&#xff0c;一起来看看吧&#xff01; 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…

C#实现数据采集系统-Mqtt实现采集数据转发

在数据采集系统中,通过ModbusTcp采集到数据之后,再通过MQTT转发到其他应用 MQTT操作 安装MQTT mqtt介绍和环境安装 使用MQTT 在C#/Net中使用Mqtt MQTT类封装 MQTT配置类 public class MqttConfig{public string Ip {get; set;

每日任务:网络协议对比:HTTPS/HTTP与TCP/UDP

1.HTTPS和HTTP有哪些区别 HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相对简单&#x…

【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构 &#x1f4da;本系列文章为个人学…

网站如何从0-1搭建部署蓝图介绍

第一步&#xff1a;网站规划 确定网站目的&#xff1a;明确网站的目标和预期的受众。内容规划&#xff1a;决定网站将包含哪些内容和功能。技术需求分析&#xff1a;确定所需的技术栈&#xff0c;例如前端和后端技术。 第二步&#xff1a;设计 草图和布局&#xff1a;绘制网…

AI学习记录 - 本地知识库实现的相关知识

在公司内部实现了个知识库&#xff0c;但这里只介绍在实现知识库的过程中用到的知识。 1、分词器 先分词&#xff0c;中文可以使用jieba分词 2、构造数据集 将词汇向量化是自然语言处理中的重要任务&#xff0c;它可以将文本数据转化为计算机能够理解和处理的向量形式。以…

在react中如何计算本地存储体积

1.定义useLocalStorageSize钩子函数 // 计算localStorage大小 function useLocalStorageSize() {const [size, setSize] useState(0);useEffect(() > {const calculateSize () > {let totalSize 0;for (let key in localStorage) {//过滤掉继承自原型链的属性if (loc…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

接口测试工具:yapi和postman、Apifox 对比选型

在接口测试工具领域&#xff0c;YApi、Postman和Apifox都是备受推崇的工具&#xff0c;它们各有特点&#xff0c;适用于不同的测试场景和需求。以下是对这三款工具的详细对比选型分析&#xff1a; 一、YApi 1. 概述 YApi是一个可本地部署的、打通前后端及QA的、可视化的接口…