Pinely Round 2 F. Divide, XOR, and Conquer

F. Divide, XOR, and Conquer

F

题意

给定一个非负整数数组 a a a,定义操作:

  • 对于区间 [ l , r ] [l,r] [l,r],选择一个分界点 l ≤ k < r l \leq k < r lk<r,将其分成 [ l , k ] [l,k] [l,k] [ k + 1 , r ] [k + 1, r] [k+1,r] 两部分,然后留下异或和更大的那一部分,丢弃小的那部分。如果异或和一样,可以随意选择留下哪部分。

问对于 ∀ i ∈ [ 1 , n ] \forall i \in [1,n] i[1,n],能否从一开始的数组到只留下 a i a_i ai,即 l = r = i l = r = i l=r=i

思路

这里比较明显的是区间的转移,可以考虑用区间 D P DP DP 来解决。对于当前的区间 [ l , r ] [l,r] [l,r],我们定义左边部分的异或和为 s 1 s_1 s1,右边部分的异或和为 s 2 s_2 s2,显然要能够实现 [ l , k ] [l,k] [l,k],必须有 s 1 ≥ s 2 s_1 \geq s_2 s1s2

如果我们直接采用传统区间 D P DP DP 的方法,枚举每一个长度的区间的分界点,时间复杂度会到达 O ( n 3 ) O(n^3) O(n3),记录状态的空间复杂度也过高。

进一步观察发现:

  • [ l , r ] [l,r] [l,r] 区间的异或和为 s s s s = 0 s = 0 s=0 的话,有 s = s 1 ⨁ s 2 = 0 s = s_1 \bigoplus s_2 = 0 s=s1s2=0,即 s 1 = s 2 s_1 = s_2 s1=s2 ,这时候我们区间的分界点可以任选,也就是说可以从区间 [ l , r ] [l,r] [l,r] 转移到任何从 l l l 开始的或者到 r r r 结束的长度小于 r − l + 1 r - l + 1 rl+1 的区间。
  • s ≠ 0 s \neq 0 s=0,我们只能留下异或和更大的那个部分,如果 s s s最高位 b i t bit bit 的话,(假设 s 1 > s 2 s_1 > s_2 s1>s2) 我们容易发现在 b i t bit bit 这一位一定是 s 1 [ b i t ] = 1 , s 2 [ b i t ] = 0 s_1[bit] = 1,s_2[bit] = 0 s1[bit]=1,s2[bit]=0,这样子 s 1 s_1 s1 才会大于 s 2 s_2 s2。所以对于那些 从 l l l 开始的或者到 r r r 结束的长度小于 r − l + 1 r - l + 1 rl+1 的区间,如果它们的异或和的最高位也是 b i t bit bit 的话,那么就可以从 [ l , r ] [l,r] [l,r] 转移到这些区间!

我们如果按照区间长度从大到小枚举区间,对于当前枚举的区间 [ l , r ] [l,r] [l,r],如果它可达的话,
可以对于区间端点维护四种信息:

  • s t [ l ] st[l] st[l] 表示从 l l l 开始的任意长度更短区间,如果它们要可达,异或和最高位必须存在于 s t [ l ] st[l] st[l] 里。
  • e d [ r ] ed[r] ed[r] 则表示到 r r r 结束的任意长度更短区间,如果它们要可达,异或和最高位必须存在于 s t [ l ] st[l] st[l] 里。
  • s t 0 [ l ] st0[l] st0[l] e d 0 [ r ] ed0[r] ed0[r] 则表示是否存在长度更大的区间异或和为 0 0 0 ,可以转移到这些端点的更小区间。

对于当前区间 [ l , r ] [l,r] [l,r] 的最高位 b i t bit bit ,如果它可达

  • 如果 s = 0 s = 0 s=0,那么后续任意长度更小的从 l l l 开始的或者到 r r r 结束的区间都可达(从 [ l , r ] [l,r] [l,r]转移过去),这时我们记录 s t 0 [ l ] = e d 0 [ r ] = t r u e st0[l] = ed0[r] = true st0[l]=ed0[r]=true
  • 如果 s ≠ 0 s \neq 0 s=0, 那么我们在 s t [ l ] st[l] st[l] e d [ r ] ed[r] ed[r] 加上 b i t bit bit 的标记,表示后续更短的从 l l l 开始的或者到 r r r 结束的区间的 m a s k mask mask,如果它们的异或和 s ′ ∧ m a s k > 0 s\prime \wedge mask > 0 smask>0,则说明它们可以从某个更长的区间转移过来,因为这个区间的异或和 s ′ s\prime s 的最高位 和 某个 s s s 重合

最终时间复杂度: O ( n 2 ) O(n^2) O(n2)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t;
    std::cin >> t;
    while(t--){
        int n;
        std::cin >> n;
        std::vector<ll> a(n + 1);
        std::vector<ll> st(n + 1, 0), ed(n + 1, 0);
        std::vector<bool> st0(n + 1, false), ed0(n + 1, false);
        std::vector<ll> sum(n + 1, 0);
        fore(i, 1, n + 1){
            std::cin >> a[i];
            sum[i] = sum[i - 1] ^ a[i];
        }
        std::vector<int> ans(n + 1, 0);
        for(int len = n; len >= 1; --len)
            fore(L, 1, n - len + 2){
                int R = L + len - 1;
                ll s = sum[R] ^ sum[L - 1];
                ll bit = 1ll << std::__lg(s);
                if(len == n || st0[L] || ed0[R] || (s & st[L]) || (s & ed[R])){
                    if(len == 1) ans[L] = 1;
                    if(!s) st0[L] = ed0[R] = true;
                    else{
                        st[L] |= bit;
                        ed[R] |= bit;
                    }
                }
            }
        fore(i, 1, n + 1) std::cout << ans[i];
        std::cout << endl;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师教程(十六)嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 16.1 嵌入式系统概述16.1.1 嵌入式系统发展历程16.1.2 嵌人式系统硬件体系结构16.2 嵌入式系统软件架构原理与特征16.2.1 两种典型的嵌入式系统架构模式16.2.2 嵌入式操作系统16.2.3 嵌入式数据库16.2.4 嵌入式中间件16.2.5 嵌入式系统软件开发环…

[GN] 设计模式—— 创建型模式

文章目录 创建型模式单例模式 -- 确保对象唯一性例子优化饿汉式懒汉式 优缺点使用场景 简单工厂模式例子&#xff1a;优化优缺点适用场景 工厂方法模式 -- 多态工厂的实现例子优缺点优化适用场景 抽象工厂模式 -- 产品族的创建例子优缺点适用场景 总结 创建型模式 单例模式 –…

嵌入式系统设计师之任务管理

目录 一、任务划分(II) 二、任务控制块&#xff08;TCB)(II) 三、任务的状态及状态转换(II) 四、任务队列(II) 五、任务管理机制(II) 六、任务调度(II) 6.1 调度时机 6.2 调度方式 6.3 调度算法性能指标和分类 6.4 任务调度算法&#xff08;II) 1、先来…

OpenHarmony—环境准备

JS SDK安装失败处理指导 问题现象 下载JS SDK时&#xff0c;下载失败&#xff0c;提示“Install Js dependencies failed”。解决措施 JS SDK下载失败&#xff0c;一般情况下&#xff0c;主要是由于npm代理配置问题&#xff0c;或未清理npm缓存信息导致&#xff0c;可按照如…

【Docker】linux、nginx、容器镜像三者基本概念

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

ISCTF wp

web 圣杯战争 题目源码 <?php highlight_file(__FILE__); error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择了对的武器!<br>";return $this->excalibuer->arrow;} }class pre…

第九篇【传奇开心果系列】beeware的toga开发移动应用示例:人口普查手机应用

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、实现应用雏形示例代码四、扩展功能和组件的考量五、添加更多输入字段示例代码六、添加验证功能示例代码七、添加数据存储功能示例代码八、添加数据展示功能示例代码九、…

Java基于SpringBoot+Vue的电影影城管理系统,附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

TypeScript实战系列之合理运用类型

目录 介绍any 和 unknownerve 的用途断言type 和 interfacedeclare 关键字的作用联合类型 和 类型守卫交叉类型 介绍 这篇主要介绍下ts 常用的基本类型和一些常用的技巧性技能 any 和 unknow any 和 unknown 是两个类型关键字&#xff0c;它们用于处理类型不确定或未知的情况…

AI绘画:PhotoMaker Win11本地安装记录!

昨天介绍一个叫PhotoMaker的AI绘画开源项目。挺不错的&#xff01; 通过这个项目可以快速制作特定人脸的AI绘画作品&#xff0c;相比传统的技术效果会好很多&#xff0c;效率也高很多。 今天趁热打铁&#xff0c;本地电脑装装看&#xff0c;并且记录&#xff0c;分享一下&#…

高效摄入英语信息的独门武器

经常有读者问我&#xff1a;日常看的都是什么样的信息&#xff1f; 简单来说&#xff0c;大致是这些&#xff1a;比较前沿的科研成果&#xff0c;心理学和神经科学的最新文献&#xff0c;一些综述性和总结性的文章&#xff0c;以及跟心理、大脑和其他科学领域相关的期刊杂志&am…

数据结构—栈实现前缀表达式的计算

前缀表达式计算 过程分析 中缀表达式&#xff1a;&#xff08;1 5&#xff09;*3 > 前缀表达式&#xff1a;*153 &#xff08;可参考这篇文章&#xff1a;中缀转前缀&#xff09; 第一步&#xff1a;从右至左扫描前缀表达式&#xff08;已存放在字符数组中&#xff09;&a…

最近公共祖先

最近公共祖先 概念 给定一棵有n个节点的树&#xff0c;树中的两个节点u和v的最近公共祖先lca&#xff0c;有以下定义 &#xff08;1&#xff09;lca既是u的祖先&#xff0c;又是v的祖先 &#xff08;2&#xff09;lca是所有u和v的公共祖先中深度最深的祖先&#xff0c;也就…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader&#xff0c;uboot是一个遵循GPL协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

CSS自适应分辨率 postcss-pxtorem(适用于 Vite)

前言 此篇是基于 Vite Vu3 项目的 CSS 自适应分辨率&#xff01; 如果想知道基于 Webpack Vue2 可移步 《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem&#xff08;适用于 Webpack&#xff09;》 项目对应的主要插件版本如下&#xff1a; "vite": "^4…

使用Win32API实现贪吃蛇小游戏

目录 C语言贪吃蛇项目 基本功能 需要的基础内容 Win32API 介绍 控制台程序部分指令 设置控制台窗口的长宽 设置控制台的名字 控制台在屏幕上的坐标位置结构体COORD 检索指定标准设备的句柄&#xff08;标准输入、标准输出或标准错误&#xff09; 光标信息结构体类型CONSOLE_CUR…

人人都可配置的大屏可视化

大屏主要是为了展示数据和酷炫的效果&#xff0c;布局大部分是9宫格&#xff0c;或者在9宫格上做的延伸&#xff0c;现在介绍下 泛积木-低代码 提供的大屏可视化配置。 首先查看效果展示 泛积木-低代码大屏展示。 创建页面之后&#xff0c;点击进入编辑页面&#xff0c;在可视…

电子液晶屏幕生产厂污废水处理需要哪些工艺设备

随着电子液晶屏幕行业的不断发展&#xff0c;污废水处理成为了一个重要的环保问题。为了达到合规性排放要求&#xff0c;并保护环境&#xff0c;厂家需要采取一系列工艺设备来处理污废水。 首先&#xff0c;常见的一种处理工艺是物理与化学处理。物理处理包括预处理与固液分离&…

Servlet过滤器个监听器

过滤器和监听器 过滤器 什么是过滤器 当浏览器向服务器发送请求的时候&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能&#xff0c;比如&#xff1a;编码设置、权限校验、日志记录等。 过滤器执行流程 Filter实例 package com.by.servlet;import jav…

看过来:大龄程序员转行的18个方向

程序员35岁后&#xff0c;无人问津、被下岗&#xff0c;说到底还是中国互联网企业普遍短命和中国程序员新人不断涌现导致的&#xff0c;前者是岗位的缩减&#xff0c;后者是供应的增加&#xff0c;两者一叠加&#xff0c;35岁程序员就成了背锅侠。 大龄程序员和老医生一样都是非…