首页 > 其他分享 >P7045 「MCOI-03」金牌

P7045 「MCOI-03」金牌

时间:2024-08-30 14:53:30浏览次数:13  
标签:P7045 MCOI sta 03 int 元素 众数 include define

题意简述

给你 \(n\) 个数,你不知道每个数的权值。

每次可以查询 \(x,y\) 表示查询 \(x,y\) 的权值是否相等,0 是 1 否。

你需要在 \(2n-2\) 次查询之内将这些数排成一个相邻两个数的权值不同的数列,并构造出来,或者报告无解。

分析

考虑在什么情况下会无解。

如果存在一数使得等于该种数的数量超过了 \(\lceil\dfrac{n}{2}\rceil\),容易发现你此时把剩下的数比这些数形成的空隙数量还要小,所以肯定无解,等价于 \(cnt-1>n-cnt\)。

这跟绝对众数的定义很相似啊!

使用摩尔投票法找到可能的绝对众数,询问次数 \(n-1\)。

然后把绝对众数依次和剩余的数查询一下,就能得出该绝对众数的出现次数了,然后就能判断有无解情况了。

那么如何构造合法答案呢?

第一轮做摩尔投票的时候,我们维护一个栈,表示暂时没法插入进去的下标的集合。初始把 \(1\) 压入栈内。显然,若栈非空,那么栈中的所有元素值相等,且当前数列的最后一个值就等于栈中的元素值(数列为空除外)。

现在要插进来一个元素,若该元素和栈中的元素不同,那么把栈顶弹出来,把当前下标和栈顶插到数列后面(两者插入顺序有先后关系);若相同则直接压入栈内。

如果栈为空,那么与数列最后一个元素比较,执行上述流程。

算法结束后,栈中还会剩下零个或多个元素,且元素值等于候选众数。由于验证候选众数需要让该数和所有其他数都比较一遍,此时如果发现了数列中两个相邻的元素都不等于候选众数,那么把栈顶插入到这两个数之间并弹栈。注意你可以把元素插到最前或最后。

若栈中依然还有元素,那么无解;

证明:如果栈中的元素没有找到一个合适的位置插入,此时数列一定形如 12121,其中 1 为候选众数,2 为其他元素。容易发现此时已经达到了极限情况,且跟第一轮摩尔投票的决策无关。

否则一定有解,且当前解即为合法解。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#include<cassert>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define un using namespace
#define all(x) x.begin(),x.end()
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) (x&-x)
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mem(x,y) memset(x,y,sizeof x)
//#define double long double
//#define int long long
//#define int __int128
using namespace std;
typedef long long i64;
typedef unsigned long long u64;
using pii=pair<int,int>;
bool greating(int x,int y){return x>y;}
bool greatingll(long long x,long long y){return x>y;}
inline int rd(){
	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<<1)+(x<<3)+ch-48;ch=getchar();}return x*f;
}
inline void write(int x,char ch='\0'){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[40];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);if(ch!='\0')putchar(ch);
}
bool Mbg;
const int maxn=5e4+5,maxm=4e5+5,inf=0x3f3f3f3f;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,Jiaohucishu;
inline int ask(int x,int y){
	if(!x||!y||x==n+1||y==n+1)return 1;
	cout<<x-1<<' '<<y-1<<endl;
	return rd();//0 = 1 !=
}
int lft[maxn],rht[maxn];
void answer(){
	cout<<n<<endl;
	int r=rht[0],cnt=0;
	while(r<=n)write(r-1,32),++cnt,r=rht[r];
	assert(cnt==n);
	cout<<endl;
}
vector<int>sta;
//将x插入到ed前面 
inline void ins(int x,int ed=n+1){
	rht[x]=ed,lft[x]=lft[ed];
	lft[rht[x]]=x,rht[lft[x]]=x;
}
void init(){
	sta.clear();
	rht[0]=n+1,lft[n+1]=0;
	rep(i,1,n)lft[i]=0,rht[i]=n+1;
}
inline void solve_the_problem(){
	n=rd(),Jiaohucishu=rd();
	init();
	sta.emplace_back(1);
	rep(i,2,n){
		if(sta.empty()){
			int x=lft[n+1];
			int p=ask(x,i);
			if(!p)sta.pb(i);
			else ins(i);
			continue;
		}
		int p=ask(sta.back(),i);
		if(!p)sta.pb(i);
		else{
			ins(i);
			ins(sta.back());
			sta.pop_back();
		}
	}
	int r=0,ok=1;
	while(r<=n&&!sta.empty()){
		int qr=rht[r];
		int p=ask(qr,sta.back());
		if(ok&&p)ins(sta.back(),qr),sta.pop_back();
		r=qr,ok=p;
	}
	if(sta.empty())return answer();
	cout<<-1<<endl;
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
//	fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);
	int _=rd();
	while(_--)solve_the_problem();
}
/*
5
1 2 1 2 1
*/

标签:P7045,MCOI,sta,03,int,元素,众数,include,define
From: https://www.cnblogs.com/dcytrl/p/18388512

相关文章

  • 第103期 车牌数据集
    引言在数字化和智能化浪潮的推动下,数据集的寻找和应用已成为众多研究者、开发者和工程师关注的焦点。特别是在智能交通、安全管理以及停车场管理等领域,车牌检测技术的重要性日益凸显。本文旨在深入探讨车牌检测的研究意义、重要性以及其在多个领域内的应用,以期为相关领域的研究和......
  • BZOJ 4403序列统计题解
    缅怀zxc......
  • day03-面向对象-内部类&泛型&常用API
    一、内部类内部类是类中的五大成分之一(成员变量、方法、构造器、代码块、内部类)如果一个类定义在另一个类的内部,这个类就是内部类。场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类内部类分为四种:成员内部类[了解]......
  • 机器学习新手入门笔记03#AI夏令营#Datawhale X 李宏毅苹果书#夏令营
    深度学习实践方法论在应用机器学习算法时,实践方法论能够帮助我们更好地训练模型。如果在Kaggle上的结果不太好,虽然Kaggle上呈现的是测试数据的结果,但要先检查训练数据的损失。看看模型在训练数据上面,有没有学起来,再去看测试的结果,如果训练数据的损失很大,显然它在训练集上面......
  • IDEA报错:Error running 'XXXApplication' Error running XXXXApplication. Command li
     IDEA启动SpringBoot项目报错Errorrunning'XXXApplication'ErrorrunningXXXXApplication.Commandlineistoolong.ShortenthecommandlineviaJARmanifestorviaaclasspathfileandrerun   点击在高版本IDEA下只需要点击就会自动选择  低版本......
  • 关于关于STM32F103芯片RTC模块的一些注意事项
    1、首先是晶振的问题,只有外部低速晶振LSE支持VBAT供电时持续运行,LSI或者HSE均不行,所以若要求设备断电后,RTC时钟可以继续运行,一定要使用LSE晶振。2、关于LSE晶振的干扰问题,本次调试设备的过程中发现,LSE虽然正常起振,RTC也正常走时,但刚开机的时候会走的比较慢,之后逐渐稳定,通过抓取LS......
  • 数分基础(03-3)客户特征分析--Tableau
    文章目录客户特征分析-Tableau1.说明2.思路与步骤3.数据准备和导入3.1用EXCEL初步检查和处理数据3.1.1打开3.1.2初步检查(1)缺失值检查缺失值处理(2)格式化日期字段(3)其他字段数据类型(4)冗余数据检查(5)其他3.2导入Tableau4.数据探索和准备分析例如创建基本的客户......
  • FANUC A06B-6220-H030#H600 驱动器的优缺点
    优点:高性能:采用先进的数字信号处理器(DSP)作为控制核心,能够实现复杂的控制算法,提供高精度和高响应速度的运动控制。高可靠性:内置多种故障检测和保护电路,如过电压、过电流、过热、欠压等,确保在异常情况下能够自动保护,避免设备损坏。软启动功能减小了启动过程对驱动器的冲击,延长......
  • Java面试题--1基础篇-03 __八股文 备战春招,秋招
    八、泛型Java中的泛型是什么?泛型是JDK1.5的一个新特性,**泛型就是将类型参数化,其在编译时才确定具体的参数。**这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。使用泛型的好处是什么?远在JDK1.4版本的时候,那时候是没有泛型的概......
  • 03-docker&mysql相关练习
    1、在docker中分别以后台方式和交互方式启动centos,对比启动后的容器状态,实现退出容器也能保持其运行状态。[root@CentOS~]#dockerrun-dcentos //后台方式76e8d53e483a1d53ad18c78ce4075fd9d72ecf01616d243f52218e1f40d03859[root@CentOS~]#dockerrun-itcentos //交互方......