区间异或和异或区间最大值异或区间最小值 --- 题解 --- (字典树好题)

 区间异或和异或区间最大值异或区间最小值 :

题目大意:

思路解析:

题目查询的是区间异或和 ^ 最小值 ^ 最大值,如果我们确定了最小值和最大值,[l,r],假设a[l]是最小值,a[r]是最大值,但是如果我们a[l-1] 比最小值大,也比最大值小,那我们就可以往附近扩展,所以在了最小值和最大值后,我们还要选择最有效的区间异或和。

        最大值最小值的分布也有多种情况,

                一 最大值在左边,最小值在左边

                二最大值在右边,最小值在右边

                三最大值在左边,最小值在右边

                四最大值在右边,最小值在左边

对于一二这两种情况,其实是等同的,那我们固定区间在 [i,mid],假设最大值和最小值都在这里面,看此时可选的区间能扩展到哪里,即最大值和最小值不变的区间有多少个,在这样的区间中找到最大的答案。这样i就可以从mid到l枚举,并且这样一定不会遗漏答案。

对于第三种和第三种情况,我们先预处理区间最小值,这样就枚举左边最大值的区间,并且将这个区间的最小值和右边能选择的最小值进行判断,又因为区间最小值一定是越靠近r越小,所以遍历不会回退。那我们就可以通过两个指针维护一个右边的区间 [j1,j2] 里面的元素都小于等于右边的最大值并且[j1,j2]里面的元素都大于等于右边的最大值。那我们就可以得到 [i,j1]....[i,j2]这些有效区间,然后利用字典树来寻优即可。

代码实现:

import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
    static int MAXN = (int) 1e5 + 5;
    static int[][] ch = new int[MAXN * 25][2];
    static int[] tag = new int[MAXN * 25];
    static int tot = 0;
    static int[] a = new int[MAXN];
    static int[] pref= new int[MAXN];
    static int[] suf = new int[MAXN];
    static int ans = 0;
    static int[] Min = new int[MAXN];
    static int INF = (int) 1e9 +100;


    public static void main(String[] args) {
        int n = f.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = f.nextInt();
        }
        for (int i = 1; i <= n; i++) {
            pref[i] = pref[i - 1] ^ a[i];
        }
        for (int i = n; i >= 1; i--) {
            suf[i] = suf[i + 1] ^ a[i];
        }
        divide(1, n);
        System.out.println(ans);

    }

    static void divide(int l, int r){
        if (l == r){
            ans = Math.max(ans, a[l]);
            return;
        }
        int mid = (l + r) >> 1;
        divide(l, mid); divide(mid+1, r);

        // max,min in [l,mid]
        init();
        for(int i=mid,mx=a[i],mn=a[i],j=mid+1,sum=0; i>=l; --i) {
            mx=max(mx,a[i]);mn=min(mn,a[i]);sum^=a[i];
            while(j<=r && a[j]>=mn && a[j]<=mx) {ins(pref[j]);++j;}
            ans=max(ans,query(mx^mn^sum^pref[mid]));
        }

        //max,min in [mid+1,r]
        init();
        for(int i=mid+1,mx=a[i],mn=a[i],j=mid,sum=0; i<=r; ++i) {
            mx=max(mx,a[i]);mn=min(mn,a[i]);sum^=a[i];
            while(j>=l && a[j]>=mn && a[j]<=mx) {ins(suf[j]);--j;}
            ans=max(ans,query(mx^mn^sum^suf[mid+1]));
        }

        //max in [l,mid], min in [mid+1,r]
        Min[mid]=INF;
        for(int i=mid+1; i<=r; ++i) Min[i]=min(Min[i-1],a[i]);
        init();
        for(int i=mid,mx=a[i],mn=a[i],j1=mid+1,j2=mid+1,sum=0; i>=l; --i) {
            mx=max(mx,a[i]);mn=min(mn,a[i]);sum^=a[i];
            while(j2<=r && a[j2]<=mx) {ins(Min[j2]^pref[j2]);++j2;}
            while(j1<j2 && Min[j1]>mn) {del(Min[j1]^pref[j1]);++j1;}
            ans=max(ans,query(mx^sum^pref[mid]));
        }

        // min in [l,mid],max in [mid+1,r]
        Min[mid+1]=INF;
        for(int i=mid; i>=l; --i) Min[i]=min(Min[i+1],a[i]);
        init();
        for(int i=mid+1,mx=a[i],mn=a[i],j1=mid,j2=mid,sum=0; i<=r; ++i) {
            mx=max(mx,a[i]);mn=min(mn,a[i]);sum^=a[i];
            while(j2>=l && a[j2]<=mx) {ins(Min[j2]^suf[j2]);--j2;}
            while(j1>j2 && Min[j1]>mn) {del(Min[j1]^suf[j1]);--j1;}
            ans=max(ans,query(mx^sum^suf[mid+1]));
        }
    }
    static int min (int x, int y){
        return Math.min(x, y);
    }
    static int max (int x, int y){
        return Math.max(x, y);
    }

    static int newNode(){
        int root = ++tot;
        ch[root][0] = 0;
        ch[root][1] = 0;
        tag[root] = 0;
        return root;
    }

    static void init(){
        tot = 0;
        ch[0][0] =0;
        ch[0][1] = 0;
        tag[0] = 0;
    }

    static void ins(int x){
        int p = 0;
        for (int i = 30; i >= 0; i--) {
            int c = (x >> i) & 1;
            if (ch[p][c] == 0) ch[p][c] = newNode();
            p = ch[p][c];
            tag[p]++;
        }
    }

    static void del(int x){
        int p = 0;
        for(int i = 30; i >= 0; i--){
            int c = (x >> i) & 1;
            p = ch[p][c];
            tag[p]--;
        }
    }

    static int query(int x){
        int res = 0;
        int p = 0;
        for (int i = 30; i >= 0; i--) {
            int c = (x >> i) & 1;
            if (tag[ch[p][c ^ 1]] != 0){
                res |= (1 << i);
                p = ch[p][c ^ 1];
            }else {
                p = ch[p][c];
            }
        }
        return res;
    }


    static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));
    static Input f = new Input(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public String nextLine() {
            String str = null;
            try {
                str = reader.readLine();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return str;
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public Double nextDouble() {
            return Double.parseDouble(next());
        }

        public BigInteger nextBigInteger() {
            return new BigInteger(next());
        }
    }
}

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

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

相关文章

【漏洞复现】金和OA viewConTemplate.action RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【linux中cd指令使用】cd进入与退出路径

【linux中cd指令使用】cd如何进入与退出路径 1、cd进入指定路径&#xff0c;比如我要进入下面这个路径中去运行setup.py文件&#xff0c;如果我不跳转到该路径下直接运行&#xff0c;会报错找不到该文件 cd空格路径&#xff0c;即可跳转到该路径 cd /public2/xxx/tiny-cuda…

【零基础学习05】嵌入式linux驱动中platform与设备树基本实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天主要学习一下,基于总线、设备和驱动进行匹配的平台驱动模型,这次将采用设备树的platform设备与驱动的编写方法,目前绝大多数的Linux内核已经支持设备树,这次主要来…

MyBatis-Plus学习记录

目录 MyBatis-Plus快速入门 简介 快速入门 MyBatis-Plus核心功能 基于Mapper接口 CRUD 对比mybatis和mybatis-plus&#xff1a; CRUD方法介绍&#xff1a; 基于Service接口 CRUD 对比Mapper接口CRUD区别&#xff1a; 为什么要加强service层&#xff1a; 使用方式 CR…

LEETCODE3

法一:记忆化递归 int climbStairsRecursive(int n, int* memo) {if (n < 2) {return n;}if (memo[n] > 0) {return memo[n];}memo[n] climbStairsRecursive(n - 1, memo) climbStairsRecursive(n - 2, memo);return memo[n]; }int climbStairs(int n) {int* memo (in…

2061:【例1.2】梯形面积

时间限制: 1000 ms 内存限制: 65536 KB 提交数:201243 通过数: 79671 【题目描述】 在梯形中阴影部分面积是150平方厘米&#xff0c;求梯形面积。 【输入】 (无&#xff09; 【输出】 输出梯形面积&#xff08;保留两位小数&#xff09;。 【输入样例】 &#xff…

redis在微服务领域的贡献,字节跳动只面试两轮

dubbo.registry.addressredis://127.0.0.1:6379 注册上来的数据是这样&#xff0c;类型是hash /dubbo/ s e r v i c e / {service}/ service/{category} 如 /dubbo/com.newboo.sample.api.DemoService/consumers /dubbo/com.newboo.sample.api.DemoService/providers has…

JOSEF约瑟 TQ-100同期继电器 额定直流电压220V 交流电压100V±10V

TQ-100型同期继电器 TQ-100同期继电器 ​ l 应用 本继电器用于双端供电线路的自动重合闸和备用电源自投装置中&#xff0c;以检查线路电压与母线电压的 相位差和幅值差。 2 主要性能 2 1采用进口集成电路和元器件构成&#xff0c;具有原理先进、性能稳定、可靠性高、动作值精…

mysql生成连续的日期

1.代码 例如&#xff1a;生成"2023-03-01"至"2023-03-10"之间的日期 WITH RECURSIVE date_range AS (SELECT "2023-03-01" AS date FROM dualUNION ALLSELECT DATE_ADD(date, INTERVAL 1 DAY) dateFROM date_rangeWHERE DATE_ADD(date, INTER…

windows系统提示msvcp120.dll丢失如何解决,如何找回dll文件?

如果你的电脑出现了关于msvcp120.dll丢失的情况那么大家一定要及时去解决msvcp140.dll丢失的问题&#xff0c;msvcp120.dll丢失可能会导致电脑出现各类的问题&#xff0c;今天就教大家四种关于msvcp120.dll丢失的解决办法&#xff0c;有效的解决msvcp120.dll丢失。 一、msvcp1…

php 对接Bigo海外广告平台收益接口Reporting API

今天对接的是Bigo广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到BIGO后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://www.bigossp.com/guide/sdk/reportingApi/doc?type1 接入这些第三方广告…

kangle一键安装脚本

Kangle一键脚本&#xff0c;是一款可以一键安装KangleEasypanelMySQLPHP集合的Linux脚本。 脚本本身集成&#xff1a;PHP5.38.2、MYSQL5.68.0&#xff0c;支持极速安装和编译安装2种模式&#xff0c;支持CDN专属安装模式。同时也对Easypanel面板进行了大量优化。 脚本特点 ◎…

十六、接口隔离原则、反射、依赖注入

接口隔离原则、反射、特性、依赖注入 接口隔离原则 客户端不应该依赖它不需要的接口&#xff1b;一个类对另一个类的依赖应该建立在最小的接口上。 五种原则当中的i 上一章中的接口&#xff0c;即契约。 契约就是在说两件事&#xff0c;甲方说自己不会多要&#xff0c;乙方会在…

Linux下安装Android Studio及创建桌面快捷方式

下载 官网地址&#xff1a;https://developer.android.com/studio?hlzh-cn点击下载最新版本即可 安装 将下载完成后文件&#xff0c;进行解压&#xff0c;然后进入android-studio-2023.2.1.23-linux/android-studio/bin目录下&#xff0c;启动studio.sh即可为了更加方便的使…

医药大数据案例分析

二、功能 &#xff08;1&#xff09;流量分析 &#xff08;2&#xff09;经营状态分析 &#xff08;3&#xff09;大数据可视化系统 配置tomcat vim /root/.bash_profile添加以下内容&#xff1a; export CATALINA_HOME/opt/tomcat export PATH P A T H : PATH: PATH:CATALIN…

程序员的三重境界:码农,高级码农、程序员!

见字如面&#xff0c;我是军哥&#xff01; 掐指一算&#xff0c;我在 IT 行业摸爬滚打 19 年了&#xff0c;见过的程序员至少大好几千&#xff0c;然后真正能称上程序员不到 10% &#xff0c;绝大部分都是高级码农而已。 今天和你聊聊程序员的三个境界的差异&#xff0c;文章不…

LDA主题模型学习笔记

&#xff08;1&#xff09;LDA的基本介绍&#xff08;wiki&#xff09; LDA是一种典型的词袋模型&#xff0c;即它认为一篇文档是由一组词构成的一个集合&#xff0c;词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题&#xff0c;文档中每一个词都由其中的一个主题…

鸿蒙Socket通信示例(TCP通信)

前言 DevEco Studio版本&#xff1a;4.0.0.600 参考链接&#xff1a;OpenHarmony Socket 效果 TCPSocket 1、bind绑定本地IP地址 private bindTcpSocket() {let localAddress resolveIP(wifi.getIpInfo().ipAddress)console.info("111111111 localAddress: " …

特殊类设计以及C++中的类型转换

1. 请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98&#xff1a; 将拷贝构造函数与赋值运算符重载只…

ruoyi-vue插件集成websocket

链接&#xff1a;插件集成 | RuoYi WebSocketServer.java&#xff1a;补充代码 /*** 此为广播消息* param message 消息内容*/public void sendAllMessage(String message) {LOGGER.info("【websocket.sendAllMessage】广播消息:"message);try {for(String sessionI…