这道题真的把我秀到了,我首先猜了一波结论,打了一个可持久化 \(\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. nginx&http 第三章 ngx http ngx_http_process_request_headers

    HTTP 请求行正确处理完成后,针对 HTTP/1.0 及以上版本紧接着要做的就是请求 HEADER 的处理与解析了 /** * 用于处理http的header数据 * 请求头: * Host: lo ...

  2. mysql 触发器的创建和使用

    什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持.该对象与编程语言中的函数非常类似,都需要声明.执行等.但是触发器的执行不是由程序调用,也不是由手工启动,而 ...

  3. 老板让只懂Java基本语法的我,基于AQS实现一个锁

    10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多 ...

  4. JLC PCB 嘉立创自动确认生产稿,不讲武德?耗子尾汁!!!

    首先,开局一张图,嘉立创又不做人的一天.嘉立创不讲武德,耗子尾汁!!! 之前下单,勾选了确定生产稿和不加客编,结果生产稿出来还是给我加了客编.那我出10元的意思何在?让我自己花3元看我花的10元有没有 ...

  5. HTTP请求响应信息字段总结(长期更新)

    http头的Location和Conten-Location HTTP响应细节--常用响应头 HTTP响应中的常用响应头(消息头) Location: 服务器通过这个头,来告诉浏览器跳到哪里 Serv ...

  6. phpmyadmin远程代码执行漏洞(CVE-2016-5734)

    简介 环境复现:https://github.com/vulhub/vulhub 线上平台:榆林学院内可使用协会内部的网络安全实验平台 phpMyAdmin是一套开源的.基于Web的MySQL数据库管 ...

  7. bWAPP----HTML OS Command Injection - Blind

    OS Command Injection - Blind 先上代码,他判断了win还是linux然后进行了ping但是结果并没有返回. 1 <div id="main"> ...

  8. 一次看完28个关于ES的性能调优技巧,很赞,值得收藏!

    因为总是看到很多同学在说Elasticsearch性能不够好.集群不够稳定,询问关于Elasticsearch的调优,但是每次都是一个个点的单独讲,很多时候都是case by case的解答,本文简单 ...

  9. guitar pro系列教程(二十三):如何使用Guitar Pro制作扫弦

    前面的章节小编和大家讲解了很多关于Guitar Pro的使用功能,本章节我们将还是采用图文结合的方式和大家讲解如何使用Guitar Pro 制作扫弦,感兴趣的朋友可以进来看看哦. 扫弦的概念 对于很多 ...

  10. css万能清除原理

    如果现在能有清理浮动的办法,但不至于在文档中多一个没有用的空标记,这时的效果是最好的!引入:after伪元素选择器,可以在指定的元素的内容添加最后一个子元素 .container:after{ } 如 ...