P14223 [ICPC 2024 Kunming I] 乐观向上

news/2025/10/15 20:47:42/文章来源:https://www.cnblogs.com/qwqSW/p/19144209

题目传送门

欢迎光顾我的博客

我们考虑如何从左往右的进行填数操作。当我们填到位置 \(i\) 时, \(p_{i}\) 这个数能被填进去需要满足的条件就是 \(p_{0} \oplus p_{1} \oplus \cdots \oplus p_{i-1} \neq p_{i}\)

先看看无解的情况。

我们经过一番思考后,发现无解的情况一定是填到最后一个数时填不进去,也就是 \(p_{0} \oplus p_{1} \oplus \cdots \oplus p_{n-2} = p_{n-1}\) ,即 \(p_{0} \oplus p_{1} \oplus \cdots \oplus p_{n-2} \oplus p_{n-1} = 0\)

这个也很好理解,因为如果从左往右填数时,只要不是第 \(n-1\) 位,其他位的备选项都有两个及以上,一个数如果填不进去总是会有另一个合法的数的。

然后就是有解的情况了。一种很直接的贪心思路就是,当填到第 \(i\) 位时,把那个最小的合法的数填进去。

但是这样就有一个问题:如果当前这个位置局部贪心填进去,是否会导致后续填数的时候无解?

当然是不会存在这种情况的,因为正如我们证明无解的情况一样,当你后续的备选项不止一个时,一个数不合适又会有另一个;当你后面只剩一个数时,也就是到了最后一位,直接填进去就好,因为这是有解的情况,最后一个数填进去一定合法。

而我们要求的是字典序最小,所以保障当前这一位最小是最重要的。综上,该种贪心策略是正确的。

然后就到了我们的乱搞时间

既然思路以及有了,那剩下的关键点就在于怎么找当前最小的合法的数了。

假设我们有一个数组 \(a\) ,下标为 \([1,n]\) ,我们让 \(a_{i}\) 初始等于 \(i-1\)

我们建一棵权值线段树,区间 \([l,r]\) 维护的是 \(a\) 数组对应区间的最小值。

若当前这个最小值合法,那么直接选走就行。

而当我们选择的最小数非法时,我们就去选次小值。具体来说,假设这个非法最小值是 \(num\) ,我们直接选 \(a\) 数组里 \([num+2,n]\) 这个区间的最小值。这个最小值一定是合法的。

(因为 \(num\) 这个数存在下标 \(num+1\) 处,现在我们不能选这个数了,所以下标还得加一)

每当我们选择一个数以后,就把 \(a\)数组里这个数原本的位置置为 \(inf\) ,表示这个数被选走了。

这样我们的时间复杂度就是 \(O(nlogn)\) 的,虽然不是很优,但是它无脑啊。

代码:

P14223
#include<bits/stdc++.h>
#define int long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}inline void write(int x){if(x<0) putchar('-'),x=-x;if(x<10) putchar(x+'0');else write(x/10),putchar(x%10+'0');
}const int N=1e6+6;
const int inf=1e16;
int T,n,ans[N];
struct sw{int id,l,r,mn;
}tr[4*N];inline void build(int id,int l,int r){tr[id].l=l,tr[id].r=r;if(l==r){tr[id].mn=l-1;return ;}int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);tr[id].mn=min(tr[ls].mn,tr[rs].mn);
}inline void update(int id,int pos,int k){if(tr[id].l==pos&&tr[id].r==pos){tr[id].mn=k;return ;}int mid=(tr[id].l+tr[id].r)>>1;if(pos<=mid){update(ls,pos,k);}else{update(rs,pos,k);}tr[id].mn=min(tr[ls].mn,tr[rs].mn);
}inline int query(int id,int l,int r){if(l<=tr[id].l&&tr[id].r<=r){return tr[id].mn;}int mid=(tr[id].l+tr[id].r)>>1,res=inf;if(l<=mid) res=min(res,query(ls,l,r));if(r>mid) res=min(res,query(rs,l,r));return res;
}signed main(){T=read();while(T--){n=read();int dq=0;//dq:前面填过的所有数的区间异或值 build(1,1,n);int chk=0;//chk:0~n-1的连续异或值 for(int i=0;i<n;i++){chk^=i;}if(chk==0){//判断无解 printf("impossible\n");continue;}for(int i=0;i<n;i++){//填第i位 int num=query(1,1,n);//找最小值 if(num==dq){//当前最小值不合法,找次小值 int num2=query(1,num+2,n);dq^=num2;ans[i]=num2;update(1,num2+1,inf);}else{//直接填最小值 dq^=num;ans[i]=num;update(1,num+1,inf);}}for(int i=0;i<n;i++){printf("%lld ",ans[i]);}printf("\n");}return 0;
}

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

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

相关文章

别再用均值填充了!MICE算法教你正确处理缺失数据

缺失数据处理一直是机器学习实践中的难点。MICE(Multivariate Imputation by Chained Equations)作为一种基于迭代思想的插补框架,可以处理复杂缺失值问题。因为它不是简单地用均值或中位数填补空缺,而是通过构建后…

P66实训题

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 from torchvision.transforms import Compose, ToTensor, Nor…

非主流网站程序IndexNow添加方法

第一步:生成API密钥 打开:https://www.bing.com/indexnow/getstarted#implementation 得到一个txt文件,例如:1ad7ba0***4b64b045fbb****0ac5bfd.txt 将这个文件上传到网站根目录,上传之后不要删除。 第二部:新增…

卷积神经网络视频读书报告

《卷积神经网络(CNN)学习感悟》读书报告 24信计2 刘雨坤 摘要 本报告围绕卷积神经网络(CNN)展开深入学习与探讨。通过研读相关资料及观看教学视频,系统梳理了 CNN 的基本概念、核心运算原理、关键组成部分、技术优…

C 语言 - 内存操作函数以及字符串操作函数解析

预先了解 "\0" 标志它是 一个转义字符(escape character),表示的是 数值为 0 的字符,\0 就是 一个字节值为 0 的字符。 char str[] = "ABC"; //在 C语言的字符串 中,\0 用来表示 字符串的结束…

以*this返回局部对象的两种情况

1、以值返回局部对象class Person { public:Person(int age) {this->age = age;}// 以值方式返回局部对象会调用拷贝构造生成一个新的对象返回Person PersonAddPerson(Person p) {this->age += p.age;return *th…

2025.10.15

今天早八上离散数学课,然后上马克思主义原理,老师讲的很好,中午吃了一份沙县小吃的鸡腿饭,然后睡了两个小时觉,起床洗澡,然后上音乐鉴赏课,上课的时候制作了学生会部长成员表。

Kali 自定义ISO镜像

简单自定义 Kali live ISO 简单自定义一下kali 镜像的开机菜单和背景图,没太多技术含量,记录一下留存 # 下载构建脚本,建议在kali系统上构建 git clone https://gitlab.com/kalilinux/build-scripts/live-build-con…

2025秋_12

今天学习了Java

nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/申威SW64架构)

nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/申威SW64架构)​ nginx-1.16.1-2.p01.ky10.sw_64.rpm是专门为 ​银河麒麟操作系统 Kylin V10(Ky10)​​ 以及 ​SW64 架构​ 编译打包的 ​…

感知节点@5@ ESP32+arduino+ 第三个程序FreeRTOS 上 LED灯显示 和 串口打印ASCII表

思路: 将 LED灯显示 作为 一个独立的 FreeROTS 任务将串口打印ASCII表 作为 一个独立的 FreeROTS任务 将已经调试好的 LED灯显示代码 和 串口打印ASCII表 可以复制使用。1)观看视频,理解FreeROTS 多任务运…

BIG-Bench:大规模语言模型能力的全面评估与挑战 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

pytorch实训题

代码 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np import time 1. 数据…

近期模拟赛汇总

S2OJ你真是好样的来让我们看看这个人到底在比赛中能干出什么呢 2025.10.8 国庆模拟赛二 T1 因为每个点只会被覆盖一次,所以倍增跳有标记的父亲然后暴力向下扩展就行。 来让我们看看这个人写的什么:点击查看代码 #inc…

实用指南:部署Tomcat11.0.11(Kylinv10sp3、Ubuntu2204、Rocky9.3)

实用指南:部署Tomcat11.0.11(Kylinv10sp3、Ubuntu2204、Rocky9.3)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

Hbase的安装与配置

HBase安装与配置 前提是jdk,zookeeper,ssh都配置完成了 1 安装 官网地址:Index of /hbase国内镜像: # 从华为云镜像下载 HBase wget https://repo.huaweicloud.com/apache/hbase/2.5.7/hbase-2.5.7-bin.tar.gz1.1 …

【Azure App Service】App Service是否支持PHP的版本选择呢?

问题描述 在一个古老的 Azure Web App 项目中,需要修改 PHP 版本,如何操作呢? 问题解答 Linux 版本的PHP修改可以通过门户上修改,但是如果所想要的版本已经不在列表之中,则可以通过PowerShell或Azure CLI命令修改…

OAuth/OpenID Connect 渗透测试完全指南

本文详细介绍了OAuth和OpenID Connect在现代Web应用中的安全测试案例,包括端点侦察、开放重定向、代码重放攻击、CSRF防护、令牌安全等关键测试点,帮助安全人员全面评估认证授权机制的安全性。Web应用渗透测试:OAut…

Problem K. 置换环(The ICPC online 2025)思路解析 - tsunchi

答案 最大权值: \[\begin{cases} \lfloor \frac{n+1}{2} \rfloor \cdot n,\; n\text{为奇数}, \\ \lfloor \frac{n+1}{2} \rfloor \cdot (n+1),\; n\text{为偶数}, \end{cases} \]把列 A:从 n 到 1 倒序输出 思路 题…