首页 > 其他分享 >8.21 模拟赛小记

8.21 模拟赛小记

时间:2023-08-21 18:23:11浏览次数:74  
标签:连边 idxn idx int 第三层 8.21 小记 模拟 edg

A.吃饭路上也要锻炼,原 P3505 [POI2010] TEL-Teleportation

咱现在思路通了,代码实现可能得鸽一鸽。

两个强强的博客:https://www.cnblogs.com/stoorz/p/12182770.htmlhttps://www.cnblogs.com/reywmp/p/14014611.html

是很难的思维题,涉及乘法原理和图论,用到了分层思想。统计答案时不重不漏导致细节巨多。

要求最大建边数,肯定不能暴力一个一个加。使用去想怎么划分成不同的集合进行统计。

考虑将图分层。

分为五层,第一层是起点,最后一层是终点。与第一层(起点)相连的放第二层,同理与终点相连的放第四层。其余剩下的点在第三层。

1.首先每一层之间的点可以相互连,因为依旧是从层内穿过,始终只能增加距离。

2.考虑中间第三层怎么连边:

(1)与第二层连边。

(2)与第四层连边。

(3)层内的点或未被任何边连的点相连。

显然第三层不能与起点、终点直接相连。

于是发现,与第二层连边的点,不能再与第四层的点直接连边,否则会出现一条长度为 4 的路径。反之亦然。

最后答案的统计:

1.层内的点都可以连。

2.第三层的点,若可以与第二层相连,则与第二层全部连一遍。

3.第三层的点,对于与第四层相连的情况同上。


B.可达家统计,原:P4306 [JSOI2010] 连通数

1.爆搜可以过。(但我的赛事爆搜只有 20pts。赛后尝试写的爆搜在洛谷可以完美的过第一个 sub,但 hack 数据根本跑不动。唯一一个不是 T 的是 WA,遂没再尝试爆搜)。

2.缩点变成有向无环图进行 dp。

3.bitset 有很多很实用的函数,+ floyd。

说一下 bitset 的做法:

如果 i 能到达 j,那么 j 所能到达的点 i 都能到达。

所以将需要维护的边存到 bitset 里就可以直接从 j 传给 i。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2010;
int n;
ll ans;
bitset<N> a[N];
void floyd()
{
	for(int i = 1; i <= n; i ++ )
		for(int j = 1; j <= n; j ++ )
			if(a[j][i]) a[j] |= a[i];
}
int main()
{
	scanf("%d", &n);
	char ch[N];
	for(int i = 1; i <= n; i ++ )
	{
		scanf("%s", ch + 1);
		for(int j = 1; j <= n; j ++ ) a[i][j] = ch[j] - '0';
		a[i][i] = 1;
	}
	floyd();
	printf("%lld", ans);
}

C.时空穿梭与高空滑索,原:P2573 [SCOI2012] 滑雪

考虑先建一个图,然后第一问用 dfs 扩展求能到达的个数。

第二问需要用最小生成树。为了最小生成树跑到的边都是能扩展到的,我们再重新建一个图,存从起点开始可以扩展到的点,来跑一遍 kruskal。

需要注意的是,再 kruskal 的排序中,我们以一条边的终点高度为第一关键字,以边权为第二关键字。这么做的目的,是因为你的终点高度越高才能扩展到更多的边。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e6 + 10;
const int inf = 0x7fffffff;
ll ans;
int n, m, sum = 1;
int h[N], vis[N], fa[N];
int idx, e[N], nxt[N], w[N], head[N];
int idxn;
struct node{int u, v, w;}edg[N];
bool cmp(node x, node y)
{
	if(h[x.v] == h[y.v]) return x.w < y.w;
	return h[x.v] > h[y.v];
}
void add(int x, int y, int z)
{
	e[++ idx] = y;
	w[idx] = z;
	nxt[idx] = head[x];
	head[x] = idx;
}
int fd(int x)
{
	if(fa[x] == x) return x;
	return fa[x] = fd(fa[x]);
}
void dfs(int x)
{
	for(int i = head[x]; i; i = nxt[i])
	{
		edg[++ idxn].u = x;
		edg[idxn].v = e[i];
		edg[idxn].w = w[i];
		if(! vis[e[i]])
		{
			sum ++;
			vis[e[i]] = 1;
			dfs(e[i]);
		}
	}
}
void kruskal()
{
	sort(edg + 1 , edg + idxn + 1 , cmp);
	for(int i = 1; i <= idxn; i ++ )
	{
		int xx = fd(edg[i].u), yy = fd(edg[i].v);
		if(xx == yy) continue;
		fa[xx] = yy;
		ans += edg[i].w ;
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i ++ ) scanf("%d", &h[i]), fa[i] = i;
	while(m -- )
	{
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		if(h[x] >= h[y]) add(x, y, z);
		if(h[x] <= h[y]) add(y, x, z);
	}
	vis[1] = 1;
	dfs(1);
	kruskal();
	printf("%d %lld", sum, ans);
	return 0;
}

需要思考:kruskal 的 sort 为什么要这么写。

以及本题另一个解法是用最小树形图,朱刘算法。


D.岗哨站在哨岗上,原:bzoj 4883.棋盘上的守卫

考察怎么把问题抽象建图的方法。怎样把网格图中,点的代价,变为二分图中边的代价。

最小生成树,但要特殊处理环:

如果选的边的两个点:

1.在同一连通块,且在一个环里,不能选。

2.如果两点都在环里,不能。

3,不连通,选,判断一侧有误环。

本题一些细节我现在还是不太懂,待实现。


本次模拟赛的 A、D 都是很有难度的。B、C 相对来说更典更好想。

标签:连边,idxn,idx,int,第三层,8.21,小记,模拟,edg
From: https://www.cnblogs.com/Moyyer-suiy/p/17646744.html

相关文章

  • 【考后总结】8 月 CSP 模拟赛 8
    8.21CSP模拟27晴天-周杰伦故事的小黄花从出生那年就飘着童年的荡秋千随记忆一直晃到现在ReSoSoSiDoSiLaSoLaSiSiSiSiLaSiLaSo吹着前奏望着天空我想起花瓣试着掉落为你翘课的那一天花落的那一天教室的那一间我怎么看不见消失的下雨天我好想......
  • 2023.8.21 模拟赛
    A多次询问\(l,r\),求\(\sum_{x=l}^r\sum_{y=x}^ra_x\otimes\gcd(a_x\sima_y)\),其中$\otimes$是异或。我们先拆解询问,\(Ans=\sum_{x=1}^r\sum_{y=x}^ra_x\otimes\gcd(a_x\sima_y)-\sum_{x=1}^{l-1}\sum_{y=x}^ra_x\otimes\gcd(a_x\sima_y)\)然后离线处理一下......
  • 模拟SSH爆破攻击
    第一步开启靶机的SSH服务开启步骤:打开终端并以root用户身份登录(第二步kali自带SSH服务器的可省略)使用以下命令安装SSH服务器apt-getupdateapt-getinstallopenssh-server安装完成后。SSH服务将自动启动。可使用以下命令检查SSH服务的状态servicesshstatus......
  • 8.21 随笔记录
    高速CAN和低速CAN的区别高速CAN和低速CAN的物理层电气特性不一样,因此不能互相连接高速CAN主要应用于发动机、变速箱等实时性要求高的场合低速CAN主要应用于车身控制系统等可靠性要求高的场合CAN_H和CAN_L任意一根导线损坏,高速CAN收发失效,而低速CAN收有效,因此低速CAN的可靠性......
  • 8.21集训笔记
    上午P1789【Mc生存】插火把点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=110;boola[N][N];intn,m,k,x,y;intdx[]={-1,-1,1,1};intdy[]={-1,1,-1,1};boolin(intx,inty){return(x>=1&&x<=n&&y>=1&......
  • 使用JMeter模拟设备通过MQTT发送数据
    需求:需要一个工具能够支持MQTT协议发送各种不同的数据。目的:模拟小型温室设备反馈,搭建一个测试环境,根据测试的数据显示硬件的状态和数值。工具:JMeter环境:需要配置Java运行环境。操作步骤:1.下载JMeter运行包下载地址:https://jmeter.apache.org/download_jmeter.cgi,下载后可以解压......
  • 模拟集成电路设计系列博客——1.1.6 输出阻抗增强电流镜
    1.1.6输出阻抗增强电流镜另一种常用的Cascode电流镜的变种是输出阻抗增强电流镜,一种简单电路形式如下图所示:其基本思路是利用一个反馈放大器来尽可能地保证\(Q_2\)两端地漏源电压尽可能地稳定,而不需要考虑输出电压。添加了这个放大器后,理想上将Cascode电流镜地输出阻抗增大了1......
  • 《串口篇》实现模拟串口通信(未验证)
    实现串口通信参考链接:https://www.jb51.net/article/279177.htm新建项目出于简单考虑,首先创建一个Winform项目,本文项目名称为portTest。串口通信,至少有两个串口才能通信,所以拖动两个GroupBox,一左一右,里面分别放置一个Combobox、一个按钮,以及两个TextBox用于发送和接收内容,第二......
  • CSP-J 模拟赛 C 题讲解
    前言鸣谢:感谢LHT大佬的推荐、GCK大佬的提醒以及LBJ大佬帮我接龙。原题链接随手给大家扔一份吧。题目大意给你一个\(1\)到\(n\)的数列,当\(a_i<a_{i-1}\)的时候(大于号和小于号其实不用管,因为最后所有方案都会遍历到,对答案没有影响)放置一个红色灯笼,否则放置一个绿......
  • java脚本模拟服务器内存溢出实战&服务器部署java项目
    一、背景:使用javaspringboot,实现linux服务器内存溢出情况。二、方案1、打包成war包,可以直接将war包部署在tomcat容器里2、springboot,打包成jar包。打的jar包,内置了tomcat,所以在服务器上,直接启jar包就行,没有必要放在tomcat容器里部署,在启动jar包时,可以配置线程池等。这......