2.22学习总结

news2024/12/22 19:56:58

1.营救
2.租用游艇
3.砍树
4.买礼物
5.刷题统计

砍树https://www.dotcpp.com/oj/problem3157.html

题目描述

给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对 (a1, b1), (a2, b2),

. . . , (am, bm),其中 ai 互不相同,bi 互不相同,ai ≠ bj(1 ≤ i, j ≤ m)。

小明想知道是否能够选择一条树上的边砍断,使得对于每个 (ai , bi) 满足 ai和 bi 不连通,如果可以则输出应该断掉的边的编号(编号按输入顺序从 1 开始),否则输出 -1.

输入格式

输入共 n + m 行,第一行为两个正整数 n,m。

后面 n − 1 行,每行两个正整数 xi,yi 表示第 i 条边的两个端点。

后面 m 行,每行两个正整数 ai,bi。

输出格式

一行一个整数,表示答案,如有多个答案,输出编号最大的一个。

样例输入

复制

6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5
4

样例输出

复制

4

提示

断开第 2 条边后形成两个连通块:{3, 4},{1, 2, 5, 6},满足 3 和 6 不连通,4 和 5 不连通。

断开第 4 条边后形成两个连通块:{1, 2, 3, 4},{5, 6},同样满足 3 和 6 不连通,4 和 5 不连通。

4 编号更大,因此答案为 4。

对于 30% 的数据,保证 1 < n ≤ 1000。

对于 100% 的数据,保证 1 < n ≤ 105,1 ≤ m ≤ 2/n。

思路:树上差分,树上差分需要结合LCA和差分的知识。

树上差分主要是应用于,在树上对多条路径进行加和的操作,其实现形式主要有点差分和边差分,边差分最后也会转化为点差分去看。

这个是LCA

void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for (int i=1;(1<<i)<=dep[n] ;++i){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for (int i=0; i<e[u].size() ; ++ i){
		edge v=e[u][i];
		if (v.to == fa) continue;
		dfs(v.to,u);
		id[v.to] = e[u][i].id;
	}
}

int lca(int x ,int y){
	if (dep[x] < dep[y]) swap(x,y);
	while (dep[x] > dep[y]){
		x=f[x][__lg(dep[x]-dep[y]-1)];
	}
	if (x==y) return x;
	for (int i=1;i<=20 ; ++ i){
		if (f[x][i] != f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}

下面是实现树上差分的函数

void add(int x, int y){
	s[x]++;
	s[y]++;
	s[lca(x,y)]-=2;
}

void cal_sum(int u,int fa){
	for (int i=0 ;i<e[u].size(); ++ i){
		edge y=e[u][i];
		if (y.to == fa) continue;
		cal_sum(y.to,u);
		s[u]+=s[y.to];
	}
}

点差分和变差分的区别主要在于:add函数

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
} 

const int N=1e5+5;

struct edge{
	int id;
	int to;
};

vector<edge>e[N];

int n,m,f[N][25],dep[N],id[N],s[N],ans;

void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for (int i=1;(1<<i)<=dep[n] ;++i){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for (int i=0; i<e[u].size() ; ++ i){
		edge v=e[u][i];
		if (v.to == fa) continue;
		dfs(v.to,u);
		id[v.to] = e[u][i].id;
	}
}

int lca(int x ,int y){
	if (dep[x] < dep[y]) swap(x,y);
	while (dep[x] > dep[y]){
		x=f[x][__lg(dep[x]-dep[y]-1)];
	}
	if (x==y) return x;
	for (int i=1;i<=20 ; ++ i){
		if (f[x][i] != f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}

void add(int x, int y){
	s[x]++;
	s[y]++;
	s[lca(x,y)]-=2;
}

void cal_sum(int u,int fa){
	for (int i=0 ;i<e[u].size(); ++ i){
		edge y=e[u][i];
		if (y.to == fa) continue;
		cal_sum(y.to,u);
		s[u]+=s[y.to];
	}
}

signed main(){
	n=read(),m=read();
	for (int i=1; i<n ; ++ i ){
		int u=read(),v=read();
		e[u].push_back({i,v});
		e[v].push_back({i,u});
	}
	dfs(1,0);
	for (int i=1 ;i<=m ; ++ i){
		int l=read(),r=read();
		add(l,r);
	}
	cal_sum(1,0);
	for (int i =1; i<=n ; ++i ){
		if (s[i]==m && id[i] >ans ) ans=id[i];
	}
	cout<<ans;
}

营救https://www.luogu.com.cn/problem/P1396

题目背景

“咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动得热泪盈眶,开起了门……

题目描述

妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 �t 区,而自己在 �s 区。

该市有 �m 条大道连接 �n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 �s 至 �t 的路线,使得经过道路的拥挤度最大值最小。

输入格式

第一行有四个用空格隔开的 �n,�m,�s,�t,其含义见【题目描述】。

接下来 �m 行,每行三个整数 �,�,�u,v,w,表示有一条大道连接区 �u 和区 �v,且拥挤度为 �w。

两个区之间可能存在多条大道

输出格式

输出一行一个整数,代表最大的拥挤度。

输入输出样例

输入 #1复制

3 3 1 3
1 2 2
2 3 1
1 3 3

输出 #1复制

2

说明/提示

数据规模与约定

  • 对于 30%30% 的数据,保证 �≤10n≤10。

  • 对于 60%60% 的数据,保证 �≤100n≤100。

  • 对于 100%100% 的数据,保证 1≤�≤1041≤n≤104,1≤�≤2×1041≤m≤2×104,�≤104w≤104,1≤�,�≤�1≤s,t≤n。且从 �s 出发一定能到达 �t 区。


样例输入输出 1 解释

小明的妈妈要从 11 号点去 33 号点,最优路线为 11->22->33。

思路:kruskal

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
} 

const int N=5e5+5;
struct edge{
	int from;
	int to;
	int w;
}e[N];

bool cmp(const edge& a,const edge& b){
	return a.w<b.w;
}

int f[N],n,m,s,t;

int find (int x){
	return f[x] == x? f[x]:f[x]=find(f[x]);
}

void unionn(int i,int j){
	f[find(i)]=find(j);
}

signed main(){
	n=read(),m=read(),s=read(),t=read();
	for (int i=1;i<=n; ++ i) f[i]=i;
	int manx=0;
	for (int i = 1 ;i <= m ; ++ i){
		e[i].from=read(), e[i].to=read(), e[i].w=read();
	}  
	sort(e+1,e+1+m,cmp);
	for (int i=1 ; i <= m ; ++ i){
		if (find(e[i].from)!= find(e[i].to)){
			unionn(e[i].from,e[i].to);
		}
		if (find(s) == find(t)){
			cout<<e[i].w;
			return 0;
		}
	}
}

租用游艇https://www.luogu.com.cn/problem/P1359

题目描述

长江游艇俱乐部在长江上设置了 �n 个游艇出租站 1,2,⋯ ,�1,2,⋯,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 �i 到游艇出租站 �j 之间的租金为 �(�,�)r(i,j)(1≤�<�≤�1≤i<j≤n)。试设计一个算法,计算出从游艇出租站 11 到游艇出租站 �n 所需的最少租金。

输入格式

第一行中有一个正整数 �n,表示有 �n 个游艇出租站。接下来的 �−1n−1 行是一个半矩阵 �(�,�)r(i,j)(1≤�<�≤�1≤i<j≤n)。

输出格式

输出计算出的从游艇出租站 11 到游艇出租站 �n 所需的最少租金。

输入输出样例

输入 #1复制

3
5 15
7

输出 #1复制

12

说明/提示

�≤200n≤200,保证计算过程中任何时刻数值都不超过 106106。

思路:DP

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
} 

const int N=5e5+5;

int f[N],n;

signed main(){
	n=read();
	for (int i=1;i<=n;i++)
        for (int j=i+1;j<=n;j++)
        {
            int x=read();
            if (f[j]==0||f[j]>f[i]+x) 
                f[j]=f[i]+x; 
        }
    cout<<f[n];
}

买礼物https://www.luogu.com.cn/problem/P1194

题目描述

又到了一年一度的明明生日了,明明想要买 �B 样东西,巧的是,这 �B 样东西价格都是 �A 元。

但是,商店老板说最近有促销活动,也就是:

如果你买了第 �I 样东西,再买第 �J 样,那么就可以只花 ��,�KI,J​ 元,更巧的是,��,�KI,J​ 竟然等于 ��,�KJ,I​。

现在明明想知道,他最少要花多少钱。

输入格式

第一行两个整数,�,�A,B。

接下来 �B 行,每行 �B 个数,第 �I 行第 �J 个为 ��,�KI,J​。

我们保证 ��,�=��,�KI,J​=KJ,I​ 并且 ��,�=0KI,I​=0。

特别的,如果 ��,�=0KI,J​=0,那么表示这两样东西之间不会导致优惠。

注意 ��,�KI,J​ 可能大于 �A。

输出格式

一个整数,为最小要花的钱数。

输入输出样例

输入 #1复制

1 1
0

输出 #1复制

1

输入 #2复制

3 3
0 2 4
2 0 2
4 2 0

输出 #2复制

7

说明/提示

样例解释 22。

先买第 22 样东西,花费 33 元,接下来因为优惠,买 1,31,3 样都只要 22 元,共 77 元。

(同时满足多个“优惠”的时候,聪明的明明当然不会选择用 44 元买剩下那件,而选择用 22 元。)

数据规模

对于 30%30% 的数据,1≤�≤101≤B≤10。

对于 100%100% 的数据,1≤�≤500,0≤�,��,�≤10001≤B≤500,0≤A,KI,J​≤1000。

思路:kruskal

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
} 

const int N=1e5+5;

struct edge{
	int from;
	int to;
	int w;
}e[250008];

bool cmp(const edge& a,const edge& b){
	return a.w<b.w;
}

int a,b,tot,f[10000];

int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}

void unionn(int i,int j){
	f[find(i)]=find(j);
}

signed main(){
	a=read(),b=read();
//	for (int i=1; i<=b; ++ i){
//		e[++tot].from=0;
//		e[tot].to=i;
//		e[tot].w=a;
//	}
	for (int i=1; i<=b; ++ i){
		for (int j=1; j<=b; ++ j){
			int m=read();
			if (m!=0){
				e[++tot].from=i;
				e[tot].to=j;
				e[tot].w=m;
			}
		}
	}
	sort(e+1,e+1+tot,cmp);
	int sum=0,cnt=0;
	for (int i=1;i<=b; ++i){
		f[i]=i;
	}
	for (int i=1; i<=tot; ++i){
		if (find(e[i].from) != find(e[i].to)){
			unionn(e[i].from,e[i].to);
			sum+=e[i].w;
			cnt++;
		}
		if (cnt==b-1) break;
	}
	if (b==1) cout<<a;
	else cout<<sum+a;
}

刷题统计https://www.dotcpp.com/oj/problem2656.html?sid=15387892&lang=1#editor

问题描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做a道题目,周六和周日每天做b道题目。请你帮小明计算,按照他将在第1道的计划几天实现做题数大于等于n的题?

输入格式

输入一行包含三个整数a、b和n。

输出格式

输出一个整数代表天数。

样例输入

复制

10 20 99

样例输出

复制

8

提示

对于 50% 的影片例子,1 ≤ a, b, n ≤ 10 6。对于 100% 的影片例子,1 ≤ a, b, n ≤ 10 18 .

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
} 


signed main(){
	int a=read(),b=read(),c=read();
	int w=a*5+b*2;
	int t=c/w,tt=c%w,day=0; 
	day=t*7;
	if (tt > a*5){
		tt-=a*5;
		day+=5;
		if (tt % b ==0) day+=tt/b;
		else day+=tt/b+1;
	}else if (tt <= a*5){
		if (tt % a ==0) day+=tt/a;
		else day+=tt/a+1;
	}
	cout<<day;
}

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

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

相关文章

Ansible 简介及部署 基础模块学习 ansible部署rsync 及时监控远程同步

Ansible介绍&#xff1a; Ansible 是一个配置管理系统&#xff0c;当下最流行的批量自动化运维工具之一&#xff0c;它是一款开源的自动化工具&#xff0c;基于Python开发的配置管理和应用部署的工具。 Ansible 是基于模块工作的&#xff0c;它只是提供了一种运行框架&#xff…

Spring之AOP源码解析(上)

Aop相关注解 EnableTransactionManagementEnableAspectJAutoProxyEnableAsync... 从注解切入来看看这些注解都干了什么 Import注解作用简述 注入的类一般继承ImportSelector或者ImportBeanDefinitionRegistrar接口 继承ImportSelector接口&#xff1a;selectImports方法返回…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f;1-2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f; 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f; JDK 是Java开发工具包&am…

lora网关智慧工厂三色灯安灯状态采集钡铼技术S281

LoRa网关结合钡铼技术S281模块在智慧工厂三色灯安灯状态采集方面具有广泛的应用前景。智慧工厂的安全生产管理对于企业生产经营至关重要&#xff0c;而三色灯安灯是工厂安全生产管理的重要指示灯&#xff0c;通过LoRa无线通信技术和钡铼技术S281模块&#xff0c;可以实现对三色…

网络安全-nc(Netcat)工具详解

经常在反弹shell的时候使用nc命令&#xff0c;但是从来没有了解过&#xff0c;今天翻书看到了&#xff0c;准备记录一下。 nc全称Netcat&#xff0c;是TCP/IP连接的瑞士军刀。哈哈我最喜欢瑞士军刀了。 有一个比较偏的知识点&#xff0c;nc还可以探测目标的端口是否开放&…

【springBoot】springAOP

AOP的概述 AOP是面向切面编程。切面就是指某一类特定的问题&#xff0c;所以AOP也可以理解为面向特定方法编程。AOP是一种思想&#xff0c;拦截器&#xff0c;统一数据返回和统一异常处理是AOP思想的一种实现。简单来说&#xff1a;AOP是一种思想&#xff0c;对某一类事务的集…

B端系统:工作台页面,如何从平庸走向出众

Hi&#xff0c;大家好&#xff0c;我是贝格前端工场&#xff0c;从事8年前端开发的老司机。大家看过很多平庸的工作台页面&#xff0c;但是仔细分析过平庸的表现吗&#xff0c;仔细思考过如何实现出众的效果吗&#xff1f;这篇文章为你解读。 一、工作台页面是什么&#xff0c;…

深信服技术认证“SCCA-C”划重点:深信服超融合HCI

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…

【STC8A8K64D4开发板】第2-13讲:SPI总线的应用

第2-13讲&#xff1a;SPI总线的应用 学习目的了解SPI总线的结构、特点以及4种通信模式。掌握通过SPI读、写和擦除SPI Flash W25Q128的方法以及代码编写。掌握通过SPI读、写铁电存储器FM25CL64B的方法以及代码编写。 SPI总线原理 SPI是串行外设接口(Serial Peripheral Interfa…

AI 视频 | Stable Video 开放公测了,免部署,免费使用!谁说 4 秒的 AI 视频不香?!

谁说 4 秒的视频不香&#xff1f;2.21 日&#xff0c;Stable Video 开放公测了&#xff0c;不需要自己部署了&#xff0c;直接在网页上就可以生成视频了。 下面这些视频&#xff0c;都是通过 Stable Video Diffusion 生成的&#xff0c;可以先来感受一下&#xff1a; Stable V…

JavaScript的内存管理与垃圾回收

前言 JavaScript提供了高效的内存管理机制&#xff0c;它的垃圾回收功能是自动的。在我们创建新对象、函数、原始类型和变量时&#xff0c;所有这些编程元素都会占用内存。那么JavaScript是如何管理这些元素并在它们不再使用时清理它们的呢&#xff1f; 在本节中&#xff0c;…

LED景观照明灯驱动电路串联、并联和恒流3款方案

LED景观照明灯是现代城市照明中常见的一种灯具。为了保证LED景观照明灯的正常工作&#xff0c;需要设计合适的驱动电路。LED景观照明灯的驱动电路可以采用串联、并联或恒流的方式来设计。 首先&#xff0c;串联驱动电路是指将多个LED灯串联在一起&#xff0c;然后接入电源进行…

不做内容引流,你凭什么在互联网上赚钱?

孩子们放寒假了&#xff0c;待在家里不是看电视&#xff0c;就是拿着手机刷视频&#xff0c;脸上是各种欢快和满足。只是一切换到写作业模式&#xff0c;孩子是各种痛苦表情包&#xff0c;家长则是使出浑身解数&#xff0c;上演亲子大战。可见娱乐常常让人愉悦&#xff0c;而学…

MyBatis-Plus框架(千峰学习笔记)

简介 MyBatis-Plus是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;主要作用 为简化开发、提高效率。 我们的愿景是成为 MyBatis 最好的搭档&#xff0c;就像 魂斗罗 中的 1P、2P&#xff0c;基友搭配&#xff0c;效率翻倍。 特性 ● …

XFF伪造 [MRCTF2020]PYWebsite1

打开题目 直接查看源码 看到一个./flag.php 访问一下 购买者的ip已经被记录&#xff0c;本地可以看到flag&#xff0c;那么使用xff或者client-ip伪造一下ip试试 bp抓包 加一个X-Forwarded-For头 得到flag

无线局域网(WLAN)简单概述

无线局域网 无线局域网概述 无限局域网&#xff08;Wireless Local Area Network&#xff0c;WLAN&#xff09;是一种短距离无线通信组网技术&#xff0c;它是以无线信道为传输媒质构成的计算机网络&#xff0c;通过无线电传播技术来实现在空间传输数据。 WLAN是传输范围在1…

2、Web攻防-SQL注入-联合查询注入

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 声明&#xff1a;只用于学习交流&#xff0c;点到为止&#xff0c;请勿非法测试。 概念&#xff1a; 联合查询注入&#xff1a;联合注入是回显注入的一种&#xff0c;也就是说联合注入的前…

关于Android下gralloc,hwcompoer以及surface模块的重新认识

关于Android下gralloc&#xff0c;hwcompoer以及surface模块的重新认识 引言 欠债还钱天经地义&#xff0c;知识的债也是如此&#xff01;这不必须得将我前面欠下来的债给补上&#xff01;对于任何复杂的知识点&#xff0c;我们都可以采用庖丁解牛的学习方式&#xff0c;一步步…

DSL Query基本语法

DSL Query基本语法 查询的基本语法如下&#xff1a; GET /indexName/_search {"query":{"查询类型":{"查询条件":"条件值"}} }查询所有 GET /indexName/_search {"query":{"match_all":{}} }match查询&#xf…

5分钟让你搞懂什么是Http协议

计算机网络基础课程是计算机专业方向非常重要的一门功课。 所有的互联网都通过网络协议来建立通信连接。 而http协议又是一种无状态的协议&#xff0c;也是工作中最常用的一种基于Web浏览器的网络通信协议。 如何学习http协议&#xff1f;提供三种方法供参考&#xff1a; 第…