梦熊NOIP模拟赛

T1

这道题贪心,实际上做了很久。
我们首先可以将4个相同的拆成3+1,这样是正确的。
然后我们就可以贪心枚举3+1,3+3+2,3+2,34,33,3*2,3这样的顺序来贪心。
最重要的是细节和顺序。
想出贪心策略后,这道题还是很简单的。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int a[5];
signed main() {
//	freopen("card4.in","r",stdin);int t=read();while(t--) {memset(a,0,sizeof a);int n=read();for(int i=1; i<=n; i++) {int v=read();a[3]+=v/3;v%=3;a[2]+=v/2;v%=2;a[1]+=v;}
//		cout<<a[1]<<"  "<<a[2]<<"  "<<a[3]<<endl;int ans=0;while(a[3]) {if(a[1]) {int res=min(a[1],a[3]);a[1]-=res;a[3]-=res;ans+=res;} else if(a[2]) {int res=min(a[2],a[3]/2);if(res==0) {a[3]--;a[1]++;a[2]--;ans+=1;} else {a[2]-=res;
//				a[1]++;a[3]-=res*2;ans+=res*2;}} else if(a[3]>=4) {int res=a[3]/4;a[3]-=res*4;ans+=3*res;} else {int res=a[3]/3;a[3]-=res*3;ans+=3*res;int rs=a[3]/2;a[3]-=rs*2;ans+=rs*2; ans+=a[3]*2;a[3]=0;
//				ans+=2;}
//			cout<<"OPOP"<<a[1]<<"  "<<a[2]<<"  "<<a[3]<<endl;
//			cout<<ans<<endl;}
//		cout<<a[1]<<"  "<<a[2]<<"  "<<a[3]<<endl;ans+=a[2];ans+=a[1];printf("%lld\n",ans);}return 0;
}

T2

这道题目和之前我出的题目有相似之处,都是用到了换根DP‘
首先我们先明确自己需要求什么,然后换根DP。
换根DP一般分为三个步骤,我在之前的博客中说到过,这里再写一遍。

  1. 先指定一个根节点
  2. 一次DFS统计子树内的节点对当前节点的贡献
  3. 一次DFS统计父亲节点对当前节点的贡献并合并统计最终答案。

然后看这道题目:
肯定会用到LCA,所以我们可以直接写出树上LCA的板子,然后分析这道题目:

  • 考虑 z 距离 x 和 y 路径上最近的点为 p , 答案就是 max ⁡ p ∈ dis ⁡ ( x , y ) , z { c x + c y + c z − dist ⁡ ( x , y ) − 2 dist ⁡ ( p , z ) } \max _{p \in \operatorname{dis}(x, y), z}\left\{c_{x}+c_{y}+c_{z}-\operatorname{dist}(x, y)-2 \operatorname{dist}(p, z)\right\} maxpdis(x,y),z{cx+cy+czdist(x,y)2dist(p,z)}
  • 可以拆贡献,设 f u = max ⁡ z { c z − 2 dist ⁡ ( u , z ) } f_{u}=\max _{z}\left\{c_{z}-2 \operatorname{dist}(u, z)\right\} fu=maxz{cz2dist(u,z)} ,答案就是 c x + c y − dist ⁡ ( x , y ) + max ⁡ p ∈ dis ⁡ ( x , y ) f p c_{x}+c_{y}-\operatorname{dist}(x, y)+\max _{p \in \operatorname{dis}(x, y)} f_{p} cx+cydist(x,y)+maxpdis(x,y)fp

如何做换根DP呢?

d p s i dps_i dpsi 表示从父亲转移来的, d p f i dpf_i dpfi 表示从其他子树转移来的。

第一次 dfs求出 d p s i dps_i dpsi,第二次 dfs求出 d p f i dpf_i dpfi,这就是换根了。
d p s u = max ⁡ { c u , d p s v − 2 w } dps_u = \max\{c_u, dps_v − 2w\} dpsu=max{cu,dpsv2w}
d p f v = max ⁡ { c v , d p f u − 2 w , d p s u − 2 w } dpf_v = \max\{c_v, dpf_u − 2w, dps_u − 2w\} dpfv=max{cv,dpfu2w,dpsu2w}
然后这道题就可以写了:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
const int N=2e5+10;
int n,Q,fa[N][20],dep[N],lg[N];
int c[N],sum[N],sub[N],dp[N],mx[N][20];
struct edge{int v,nxt;int w;
}e[N<<1];
int hd[N],tt;
void init(){memset(hd,-1,sizeof(hd));for(int i=1;i<=n;i++)lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
void add(int x,int y,int z){e[++tt].v=y;e[tt].w=z;e[tt].nxt=hd[x];hd[x]=tt;
}
void dfs1(int u,int fath){sub[u]=c[u];for(int i=hd[u];~i;i=e[i].nxt){int v=e[i].v;if(v==fath) continue;sum[v]=sum[u]+e[i].w;dfs1(v,u);sub[u]=max(sub[u],sub[v]-2*e[i].w);}
}
void dfs2(int u,int fath){if(!fath) dp[u]=sub[u];for(int i=hd[u];~i;i=e[i].nxt){int v=e[i].v;if(v==fath) continue;dp[v]=max(sub[v],dp[u]-2*e[i].w);dfs2(v,u);}
}
void dfs(int u,int fath){fa[u][0]=fath,dep[u]=dep[fath]+1;mx[u][0]=max(dp[u],dp[fath]);for(int i=1;i<=lg[dep[u]];i++){fa[u][i]=fa[fa[u][i-1]][i-1];mx[u][i]=max(mx[fa[u][i-1]][i-1],mx[u][i-1]);}for(int i=hd[u];~i;i=e[i].nxt){int v=e[i].v;if(v!=fath) dfs(v,u);}
}
int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);while(dep[x]>dep[y])x=fa[x][lg[dep[x]-dep[y]]-1];if(x==y) return x;for(int i=lg[dep[x]]-1;~i;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}}return fa[x][0];
}
int query(int u,int k){int ans=dp[u];for(int i=19;~i;i--){if(k&(1<<i)){ans=max(ans,mx[u][i]);u=fa[u][i];}}return ans;
}
int solve(int x,int z){int lc=lca(x,z);int xx=query(x,dep[x]-dep[lc]);int zz=query(z,dep[z]-dep[lc]);return c[x]+c[z]+max(xx,zz)-(sum[x]+sum[z]-2*sum[lc]);
}
signed main(){n=read(),Q=read();init();for(int i=1;i<=n;i++) c[i]=read();for(int i=1,x,y,z;i<n;i++){x=read(),y=read(),z=read();add(x,y,z),add(y,x,z);}dfs1(1,0),dfs2(1,0),dfs(1,0);for(int i=1,x,z;i<=Q;i++){x=read(),z=read();printf("%lld\n",solve(x,z));}return 0;
}

T3

太简单了,不配我写

T4

太简单了,不配我写

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

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

相关文章

1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试 package mainimport ("fmt""golang.org/x/crypto/bcrypt" )func main() {password : []byte("mysecretpassword")hashedPassword, err : bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err ! nil {fmt.Println(err)…

CSS —— 子绝父相

相对定位&#xff1a;占位&#xff1b;不脱标 绝对定位&#xff1a;不占位&#xff1b;脱标 希望子元素相对于父元素定位&#xff0c;又不希望父元素脱标&#xff08;父元素占位&#xff09; 子级是 绝对定位&#xff0c;不会占有位置&#xff0c; 可以放到父盒子里面的任何一…

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计

风尚云网前端学习&#xff1a;一个简易前端新手友好的HTML5页面布局与样式设计 简介 在前端开发的世界里&#xff0c;HTML5和CSS3是构建现代网页的基石。本文将通过一个简单的HTML5页面模板&#xff0c;展示如何使用HTML5的结构化元素和CSS3的样式特性&#xff0c;来创建一个…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前&#xff0c;写了django制作简易登录系统&#xff0c;这次利用django内置的authentication功能实现注册、登录 提示&#xff…

ctfshow单身杯2024wp

文章目录 ctfshow单身杯2024wp签到好玩的PHPezzz_sstiez_inject ctfshow单身杯2024wp 签到好玩的PHP 考点&#xff1a;序列化反序列化 <?phperror_reporting(0);highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public …

ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案

在金融行业&#xff0c;银行营业厅的安全保卫工作至关重要&#xff0c;它不仅关系到客户资金的安全&#xff0c;也关系到整个银行的信誉和运营效率。随着科技的发展&#xff0c;传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…

【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法

课程链接 线性回归的从零开始实现 import random import torch from d2l import torch as d2l# 人造数据集 def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.01,y.shape) # 加入噪声return X,y.reshape…

zotero安卓测试版下载和使用

2023年年底&#xff0c;Zotero官方就已经推出了安卓版的测试版Zotero for Android (beta),&#xff0c;但名额有限且只能通过Google商店下载。此外&#xff0c;还有一些第三方开发的安卓应用&#xff0c;如Zoo for Zotero、ZotDroid等。 在首次使用Zotero安卓版时&#xff0c;用…

基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功

基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器&#xff0c;2FSK 的两个频率为:fI15KHz&#xff0c;f23KHz&#xff0c;波特率为 1500 bps,比特0映射为f 载波&#xff0c;比特1映射为 载波。 1&#xff09…

Matlab 深度学习 PINN测试与学习

PINN 与传统神经网络的区别 与传统神经网络的不同之处在于&#xff0c;PINN 能够以微分方程形式纳入有关问题的先验专业知识。这些附加信息使 PINN 能够在给定的测量数据之外作出更准确的预测。此外&#xff0c;额外的物理知识还能在存在含噪测量数据的情况下对预测解进行正则…

【JavaScript】JavaScript开篇基础(7)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

JavaScript的基础数据类型

一、JavaScript中的数组 定义 数组是一种特殊的对象&#xff0c;用于存储多个值。在JavaScript中&#xff0c;数组可以包含不同的数据类型&#xff0c;如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式&#xff1a; 字面量表示法&#xff1a;let fruits [apple…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议&#xff1a; webSocket协议&#xff1a; 1.2WebSocket协议&#xff1a; 1.3客户端&#xff08;浏览器&#xff09;实现 1.3.2 WebSocket对象的相关事宜&#xff1a; 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程

1、打开pycharm 没有pycharm的&#xff0c;在站内搜索安装教程即可。 2、点击“文件”“新建项目” 3、创建项目&#xff0c;Python版本中选择Python39。如果没有该版本&#xff0c;选择下面的Python 3.9下载并安装。 4、打开软件包&#xff0c;搜索“deep-forest”软件包&am…

ES 和Kibana-v2 带用户登录验证

1. 前言 ElasticSearch、可视化操作工具Kibana。如果你是Linux centos系统的话&#xff0c;下面的指令可以一路CV完成服务的部署。 2. 服务搭建 2.1. 部署ElasticSearch 拉取docker镜像 docker pull elasticsearch:7.17.21 创建挂载卷目录 mkdir /**/es-data -p mkdir /**/…

分布式kettle调度平台v6.4.0新功能介绍

介绍 Kettle&#xff08;也称为Pentaho Data Integration&#xff09;是一款开源的ETL&#xff08;Extract, Transform, Load&#xff09;工具&#xff0c;由Pentaho&#xff08;现为Hitachi Vantara&#xff09;开发和维护。它提供了一套强大的数据集成和转换功能&#xff0c…

力扣hot100-->排序

排序 1. 56. 合并区间 中等 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

滑动窗口最大值(java)

题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7]…

springboot项目使用maven打包,第三方jar问题

springboot项目使用maven package打包为可执行jar后&#xff0c;第三方jar会被打包进去吗&#xff1f; 答案是肯定的。做了实验如下&#xff1a; 第三方jar的项目结构及jar包结构如下&#xff1a;&#xff08;该第三方jar采用的是maven工程&#xff0c;打包为普通jar&#xf…