首页 > 其他分享 >noip模拟赛6

noip模拟赛6

时间:2024-11-05 17:47:33浏览次数:3  
标签:ch noip int ll 三维 mid inline 模拟

A 选彩笔(rgb)

一眼转三维坐标系搞。

但是最开始想歪了,以为要转曼哈顿距离,但是发现三维切比雪夫距离不支持转曼哈顿距离。

补充一个知识点
\(x\) 维的曼哈顿距离支持转到 \(2^{x-1}\) 维的切比雪夫距离
所以一维和二维可以直接转化,但是三维及以上就不行了。三维曼哈顿距离等同于某种坐标系下的四维切比雪夫距离。

然后想到题目就是在求最最的一个立方体满足立方体中点的个数为 \(k\) 个。

然后就想到了三维前缀和,值域 \([0,255]\) 可做。

但是总体复杂度是 \(O(n^2)\) 的,没多少分。

其实在三维前缀和的基础上改成二分答案,每次 check 搜索值域内全部边长为 \(mid\) 的立方体,用三维前缀和查个数是否大于等于 \(k\) 即可。

点击查看代码
//自己的没调出来崩溃了,这个是别人的。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+5,INF=1E9;
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
inline void write(ll x)
{
	if(x<0)x=-x,putchar('-');
	if(x>9)write(x/10);
	putchar((x%10)|48);
}
inline void write(ll x,char p){
	write(x);putchar(p);
}
int n,K;
struct ac
{
	int r,g,b;
}a[N];
int c[260][260][260];
inline int get(int a,int b,int C,int x,int y,int z){
	return c[x][y][z]-c[a-1][y][z]-c[x][b-1][z]-c[x][y][C-1]+c[a-1][b-1][z]+c[a-1][y][C-1]+c[x][b-1][C-1]-c[a-1][b-1][C-1];
}
inline bool check(int mid){
	for(int i=1;i+mid<=256;i++){
		for(int j=1;j+mid<=256;j++){
			for(int k=1;k+mid<=256;k++){
				if(get(i,j,k,i+mid,j+mid,k+mid)>=K){return 1;}
			}
		}
	}
	return 0;
}
inline void fen(int l,int r){
	int ans=0;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid)){
			ans=mid;r=mid-1;
		}else l=mid+1;
	}
	write(ans);
}
int main()
{
	freopen("rgb.in","r",stdin),freopen("rgb.out","w",stdout);
	n=read();K=read();
	for(int i=1;i<=n;i++){
		a[i]={read()+1,read()+1,read()+1};
		// v[a[i].r][a[i].g][a[i].b].pb(i);
		c[a[i].r][a[i].g][a[i].b]++;
	}
	for(int i=1;i<=256;i++){
		for(int j=1;j<=256;j++){
			for(int k=1;k<=256;k++){
				c[i][j][k]+=c[i-1][j][k];
			}
		}
	}
	for(int i=1;i<=256;i++){
		for(int j=1;j<=256;j++){
			for(int k=1;k<=256;k++){
				c[i][j][k]+=c[i][j-1][k];
			}
		}
	}
	for(int i=1;i<=256;i++){
		for(int j=1;j<=256;j++){
			for(int k=1;k<=256;k++){
				c[i][j][k]+=c[i][j][k-1];
			}
		}
	}
	fen(0,255);
	return 0;
}

B 兵蚁排序(sort)

非常好 \(gxyz OJ\) 我随便写的 \(dfs\) 都有 \(65\)。

这个题正解已经想出来了,但是没敢打。

考虑每一对失配的点,如果合法,一定是到最终位置为逆序,那么每次 swap 保证其它点相对位置不变,对于一个点最多移动 \(O(n)\),类似于冒泡排序。

意思就是忽略题目给的排序条件,每次只进行 swap 来保证正确性,然后每个点 \(O(n)\),总复杂度 \(O(n^2)\)。

其实我是考虑到移动次数会大于 \(n^2\),但是不会,最大才会 \(\frac{n^2}{2}\) 次左右(就是倒序转顺序的类型)

C 人口局 DBA(dba)

D 银行的源起(banking)

标签:ch,noip,int,ll,三维,mid,inline,模拟
From: https://www.cnblogs.com/ccjjxx/p/18528440

相关文章

  • [DMY]2024 NOIP 模拟赛 Day 4
    不会暴搜不会差分约束不会三维DP不会根号分治不会卡常……赛时电脑没网,换了一台。T1看不懂题面,还以为是\(n-x\),然后有人给我说根据题目名称可以推断是\(n\%x\)。……[从现在开始到T2,我写完了,但是被人用手势删了,没保存,不想重新写了,所以就这样了]……T2赛后发现差分约束......
  • 【洛谷 P3695 CYaRon!语】从一道大模拟入坑自制编程语言
    原题传送门本来是想投题解的,但是仔细阅读了一下主题库题解规范,发现这篇文章更加适合单独作为一篇blog阅读而非挂在题解区里污染环境,所以就这样了。0xff开始之前这道题我很早以前就开始看了,那时还只有星野梦美大佬的一篇题解。而到现在,我终于是有了时间和能力来切掉这道题,......
  • NOIP
    noip考前专训(来自弱省弱校的挣扎)T1专训38题,在一个小时内写出正解。P11186三目运算体现出我不会递归的牛逼情况。照着题目模拟,类似对一段区间进行染色。因为递归成一颗二叉树形状,故从最深处返回的下标为紧挨下一次递归开始的下标。点击查看代码#ifdefONLINE_JUDGE......
  • P1088 [NOIP2004 普及组] 火星人
    [NOIP2004普及组]火星人题目描述人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小......
  • 【c++篇】:深入剖析vector--模拟实现属于自己的c++动态数组
    ✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨✨个人主页:余辉zmh–CSDN博客✨文章所属专栏:c++篇–CSDN博客文章目录前言一.`vector`类的默认成员函数整体框架构造函数析构函数拷贝构造函数赋值运算符重载函数测试二.`vector`......
  • 超市模拟器msvcp140_atomic_wait.dll缺失?轻松解决超市模拟器中的msvcp140_atomic_wait
    面对超市模拟器中msvcp140_atomic_wait.dll缺失的问题,用户无需过于担心,因为有多种方法可以帮助轻松解决这一错误提示。以下是一些有效的解决方案:一、重新安装VisualC++Redistributablemsvcp140_atomic_wait.dll是MicrosoftVisualC++2015RedistributablePackage的一部......