首页 > 其他分享 >题解:P11372 「CZOI-R2」加训

题解:P11372 「CZOI-R2」加训

时间:2024-12-15 21:23:00浏览次数:10  
标签:障碍 int 题解 d% oier 加训 maxm include P11372

暴力

三重循环,枚举学生,障碍和老师,再判断是否合法。

时间复杂度:\(\Theta (mxy)\)。但是会 TLE。

暴力优化

用数组 \(oier\) 来存储二元组 \((x, y)\) 对应的坐标 \(z\)。

这样就省去的开三维数组的成本。

然后只用枚举学生和老师,再判断维度坐标不同数是否为 \(k-1\) 个,以及中间有没有障碍即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

const int maxm = 1003;
vector<int> oier[maxm][maxm]; // oier: 存储 (x, y) 的坐标 z 
int n, k, m, x, y;
int oi[maxm][5], bar[maxm][5], tea[maxm][5];
// oi: 学生,bar: 障碍,tea: 老师 
int ans[maxm], d[5]; // d: d[1], d[2], d[3] 存储 (x, y, z) 
// ans: 答案 
// check: 判断中间是否有障碍 
bool check() {
	int x = d[1], y = d[2], z = d[3];
	for (int i = 0; i < oier[x][y].size(); i++) {
		if (oier[x][y][i] == z) // 如果 z 坐标相同,说明撞到一起,也就是有障碍 
			return 1;
	}
	return 0;
}

int main() {
	scanf("%d%d%d%d%d", &n, &k, &m, &x, &y);
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= k; j++) 
			scanf("%d", &oi[i][j]);
		oier[oi[i][1]][oi[i][2]].push_back(oi[i][3]);
	}
	for (int i = 1; i <= x; i++) {
		for (int j = 1; j <= k; j++) 
			scanf("%d", &bar[i][j]);
		oier[bar[i][1]][bar[i][2]].push_back(bar[i][3]);
	}
	for (int i = 1; i <= y; i++) {
		for (int j = 1; j <= k; j++) 
			scanf("%d", &tea[i][j]);
		oier[tea[i][1]][tea[i][2]].push_back(tea[i][3]);
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= y; j++) {
			int cha = 0, l = 0;
			// l: 记录不同的那一个维度是在哪一位 
			for (int p = 1; p <= k; p++) { // 判断维度不同数量 
				if (oi[i][p] == tea[j][p])
					cha++;
				else
					l = p;
				d[p] = oi[i][p]; // d 存储学生的坐标 
			}
			if (cha != k - 1) continue;
			int cnt = 1;
			// 因为不存在 2 个坐标相同,所以可以直接比大小,确定从那个开始 
			int start = max(oi[i][l], tea[j][l]);
			int fin = min(oi[i][l], tea[j][l]);
			for (int p = fin + 1; p < start; p++) {
				d[l] = p; // d[l] 是不同的那一个维度,变为 p 就是在循环看这一位是不是障碍 
				if (check()) {
					cnt = 0;
					break;
				}
			}
			ans[j] += cnt; // 答案更新 
		}
	}
	for (int i = 1; i <= y; i++)
		printf("%d ", ans[i]);
	return 0;
}

标签:障碍,int,题解,d%,oier,加训,maxm,include,P11372
From: https://www.cnblogs.com/panda-lyl/p/18608745

相关文章

  • 题解:P11319 [NOISG2020 Qualification] Cryptography
    康托展开模版给大家一个式子,这个式子就是康托展开的模版。\(rank=1+\sum_{i=1}^{n}a_n\times(n-i)!\)然后我们对这个排列\(P\)进行离散化,最后直接来个康托展开的模版就行了。代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usi......
  • 题解:P11389 [COCI 2024/2025 #1] 等级 / Hijerarhija
    思路因为一棵树的本质是一个图,所以我们可以认为入度为\(0\)的节点就是这个树的根。所以我们统计有几个根,以及是已经作为根的。最后去统计有多少个根就行了。存储父子关系可以用unordered_map。代码#include<iostream>#include<cstdio>#include<cstring>#include<algori......
  • 题解:AT_abc032_d [ABC032D] ナップサック問題
    思路subtask1直接暴力搜索即可。subtask2普通的01背包,直接\(dp\)即可。subtask3改变\(dp\)的状态,设\(dp_i\)表示价值为\(i\)时用的最小体积,那么就直接在里面找最小值就行。代码#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>usi......
  • 题解:B4070 [GESP202412 五级] 奇妙数字
    思路可以考虑质因数分解,使得最后每一个奇妙数字以及它们的乘积是\(n\)的因数。奇妙数字的定义:\(x=p^a\)。所以在质因数分解的过程中,我们统计每个质因数有多少,然后统计可以分解成多少个奇妙数字。代码#include<iostream>#include<cstdio>#include<cstring>#include<algor......
  • 网站使用CDN出现ttf woff等字体跨域问题解决方案
    如果cdn域名+资源路径是可以通过浏览器url地址栏打开的那么一般是因为nginx配置的原因,找到nginx的配置文件添加以下代码: #允许指定域名访问;location~.*.(eot|ttf|ttc|otf|eot|woff|woff2|svg)(.*){ add_headerAccess-Control-Allow-Originhttp(s)://这里填写你的域名;......
  • [BZOJ3569] DZY Loves Chinese II 题解
    考虑不联通的情况。图不好做,就造一棵生成树出来,由于是无向图,所以只有树边和返祖边。发现在一条树边断开后,生成树会分成两个连通块,由覆盖这条树边的返祖边链接,只有这些返祖边也全部断开,原图才会不联通。想到异或的优良性质。我们给所有返祖边在\([0,2^{63})\)中随机一个值作为......
  • 问题解决:windows主机开机不插屏幕不能自动进入桌面
    操作系统一般都有这种设定,不论是windows还是Linux系统,那就是主机开机不插屏幕不能自动进入桌面操作系统一般都有这种设定,不论是windows还是Linux系统,那就是主机开机不插屏幕不能自动进入桌面。如何解决:给主机插上“屏幕欺骗器”操作系统在启动的过程中,在进入系统之前会读取......
  • P9311 [EGOI2021] Twin Cookies / 姐妹分饼干 题解
    题目传送门/ACrecord思路考虑随机化,前\(100\)次订单的美味值随机生成,最后一次的\(n\)个美味值为前\(100\)次送到的饼干中的任意三个饼干的美味值之和,此时的组合方案数去重后也远大于\(n\),故可以通过。选取饼干和最后的分配直接暴力计算就行,判重可以用map。代码#incl......
  • Java线程命名问题解决
    前言网上冲浪时刷到线程池的文章,想想看自己好像还没在实际场景中设置过线程名称,小小研究一下。研究过程默认命名创建的线程都会有自己的名字,如果不设置,程序会给线程默认的名字,如Thread-0Threadt=newThread(()->{System.out.println(Thread.currentThread().getNam......
  • 牛客周赛 Round 71 题解 更新至 F 题
    Preface随便v的一场,这场难度不高呢,感觉有些小水,不如前面几场的难度,反而字符串那题更难一些。我会在代码一些有必要的地方加上注释,签到题可能一般就不会写了.以下是代码火车头:#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<vector>......