这道题真的把我秀到了,我首先猜了一波结论,打了一个可持久化 \(\text{Trie}\) 加二分的两只 \(\log_2\) 的做法,发现不能 \(PP\) ,然后就一直改到比赛结束还没改过。

然后比完赛的时候改出来了,发现 \(WA\) \(on\) \(51\) ,心想好像比赛时改没改出来好像没什么区别啊。

然后就看了一波别人的题解,发现是一道结论题。。。

我是 \(sb\) 。

题解

你发现如果任意相邻的三个数中存在最高位相同,那么必然可以通过合并后两个来达到目的,也就证明了如果长度大于 \(60\) ,答案就必定为 \(1\) ,小于 \(60\) 的直接暴搜就可以了。

代码如下

可持久化 Trie

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],b[N];
struct Trie
{
int now,rt[N];
struct Node{int data,son[2];}tr[N<<5];
Trie(){now=0,memset(tr,0,sizeof(tr));}
void add(int u,int v,int x)
{
for(int i=30;i>=0;--i)
{
tr[v]=tr[u],tr[v].data++;
int tmp=(bool)(x&(1<<i));
tr[v].son[tmp]=++now;
u=tr[u].son[tmp],v=tr[v].son[tmp];
}
tr[v]=tr[u],tr[v].data++;
}
int query1(int u,int v,int x)
{
int res=0;
for(int i=30;i>=0;--i)
{
int tmp=(bool)(x&(1<<i));
int data=tr[tr[v].son[tmp^1]].data-tr[tr[u].son[tmp^1]].data;
if(data) u=tr[u].son[tmp^1],v=tr[v].son[tmp^1],res+=(1<<i);
else u=tr[u].son[tmp],v=tr[v].son[tmp];
}
return res;
}
int query2(int u,int v,int x)
{
int res=0;
for(int i=30;i>=0;--i)
{
int tmp=(bool)(x&(1<<i));
int data=tr[tr[v].son[tmp]].data-tr[tr[u].son[tmp]].data;
if(data) u=tr[u].son[tmp],v=tr[v].son[tmp];
else u=tr[u].son[tmp^1],v=tr[v].son[tmp^1],res+=(1<<i);
}
return res;
}
}t;
int main()
{
cin>>n;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i) b[i]=b[i-1]^a[i];
// for(int i=1;i<=n;++i) printf("%d ",b[i]);
// printf("\n");
t.rt[0]=++t.now;
for(int i=1;i<=n;++i)
{
t.rt[i]=++t.now;
t.add(t.rt[i-1],t.rt[i],b[i]);
}
int res=1e9+7;
for(int i=1;i<n;++i)
{
int l=1,r=i-1,tmp=-1;
while(l<=r)
{
int mid=(l+r)>>1;
int data=t.query1(t.rt[mid-1],t.rt[i-1],b[i]);
// printf("-------\n");
// printf("%d %d\n",mid,data);
if(data>a[i+1]) l=mid+1,tmp=mid;
else r=mid-1;
}
if(b[i]>a[i+1]&&tmp==-1) tmp=0;
// printf("---%d %d\n",i,tmp);
if(tmp>=0) res=min(res,i-tmp-1);
}
for(int i=2;i<=n;++i)
{
int l=i+1,r=n,tmp=-1;
while(l<=r)
{
int mid=(l+r)>>1;
int data=t.query2(t.rt[i],t.rt[mid],b[i-1]);
// printf("---%d %d\n",mid,data);
if(data<a[i-1]) r=mid-1,tmp=mid;
else l=mid+1;
}
if((b[n]^b[i-1])<a[i-1]&&tmp==-1) tmp=n;
// printf("%d\n",tmp);
if(tmp>=0) res=min(res,tmp-i);
}
if(res>=1e9+7) printf("-1\n");
else printf("%d\n",res);
return 0;
}

正解

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],b[N],res=1e9+7;
int main()
{
cin>>n;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i) b[i]=b[i-1]^a[i];
for(int i=1;i<n;++i)
{
for(int j=0;j<=32&&i-j>=1;++j)
{
for(int k=0;k<=32&&i+1+k<=n;++k)
if((b[i]^b[i-j-1])>(b[i]^b[i+1+k]))
res=min(res,j+k);
}
}
if(res>=1e9+7) printf("-1\n");
else printf("%d\n",res);
}

CF1457D XOR-gun的更多相关文章

  1. php获取汉字的拼音 拼音首字母

    /***获取汉字的拼音*/function pinyin($s, $isfirst = false) { static $pinyins; $s = trim($s); $len = strlen($ ...

  2. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  3. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  5. xor和gates的专杀脚本

    前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xo ...

  6. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  7. Xor && 线性基练习

    #include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...

  8. BC之Claris and XOR

    http://acm.hdu.edu.cn/showproblem.php?pid=5661 Claris and XOR Time Limit: 2000/1000 MS (Java/Others) ...

  9. 异或链表(XOR linked list)

    异或链表(Xor Linked List)也是一种链式存储结构,它可以降低空间复杂度达到和双向链表一样目的,任何一个节点可以方便的访问它的前驱节点和后继结点.可以参阅wiki 普通的双向链表 clas ...

  10. hdu 5661 Claris and XOR

    Claris and XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

随机推荐

  1. 一:NOSQL

    NOSQL =not only SQL 意即为不仅仅是SQL 传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的社交网络服务类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克 ...

  2. python之路《八》装饰器

    装饰器是个好东西啊 那么装饰器是个什么样的东西呢,他又能做些什么呢? 1.为什么装饰器 当我们一个程序已经构建完成,并且已经发布出去了,但是现在需要增加一个活动,例如淘宝给你发送一个今日优惠,或者开启 ...

  3. oracle的迁移工作

    1.创建新数据库用户 1).创建用户和分配权限 sqlplus / as sysdba create user ENFRC_TEST_GZ_TMP identified by ENFRC_TEST_G ...

  4. 对App应用架构搭建的一些思考

    当下随着App开发技术的越来越成熟,多人协同开发必不可少,一个团队中每个人的代码风格.技术栈都存在差异,因此统一一套成熟的开发架构必不可少,可以提高开发效率.统一代码风格.为项目维护提供便利. 当下A ...

  5. mysql之事物

    1.事物,在事物中的sql语句,要么全部执行成功,要么全部执行失败,不会出现一条sql执行成功了,一条sql执行失败的问题. 2.开启事物:就是关闭mysql自己的自动提交事物的方式 3.commit ...

  6. Java项目读取resources资源文件路径那点事

    今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑.正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径, ...

  7. iczer的vue-antd-admin项目,逐步平滑迁移mock的url

    这个需求,在实战中蛮有用的.但没有看到网上太多文档,就自己hack了一个思路.供指正. 需求 在前后端分离的项目开发中,前后端的开发步骤和进度是不一致的.有时,前端为了不等待后端的API开发进度,会自 ...

  8. [原题复现][2020i春秋抗疫赛] WEB blanklist(SQL堆叠注入、handler绕过)

    简介 今天参加i春秋新春抗疫赛 一道web没整出来 啊啊啊 好垃圾啊啊啊啊啊啊啊  晚上看群里赵师傅的buuoj平台太屌了分分钟上线 然后赵师傅还分享了思路用handler语句绕过select过滤.. ...

  9. [COCI2016-2017#1] Mag

    [COCI2016-2017#1] Mag 题解 题目TP门 题目描述 你将获得一棵由无向边连接的树.树上每个节点都有一个魔力值. 我们定义,一条路径的魔力值为路径上所有节点魔力值的乘积除以路径上的节 ...

  10. 微课制作软件Camtasia中如何添加并编辑字幕?

    除了能录制视频以外,Camtasia还能直接把录制下来的视频进行剪辑,并添加视频字幕等等一些后期效果.今天我们就来看一看字幕的添加方法. 导入视频 微课制作软件Camtasia录制的视频,默认在软件& ...