Chip Factory HDU - 5536

题意:

给你n个数,让你从中选出i,j,k三个下标,求最大的 (a[i]+a[j])^ a[k]

题解:

这种查找最大异或一般有两个方向,一个是有公式推导规律可循,另一个可以联合01字典树。
如何用01字典树做呢?
我们先将所有所有数插入到字典树中,然后暴力枚举i和j,求出a[i]+a[j]的和sum,现在我们要求a[k],让sum和a[k]的值最大,我们可以将sum取反,然后在字典树上找最接近sum的值,那就是符合的k,当然在查找前要先删除i和j,因为i,j,k三者不能重复,查找完再加回去

好吧,这个题给了9s,直接暴力也能做!!

代码:

字典树

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e3+8;
int a[maxn],num[maxn];
int rtnum;
int root;
struct node{int cnt;int nxt[4];void init(){cnt=0;nxt[0]=nxt[1]=-1;}
}T[maxn*200];
void insert(int x){int now=0;for(int i=0;i<32;i++){a[i]=x&1;x>>=1;}for(int i=31;i>=0;i--){int x=a[i];if(T[now].nxt[x]==-1){T[rtnum].init();//开新点T[now].nxt[x]=rtnum++; //新点的编号 }now = T [now].nxt[x];T[now].cnt++;//这个点出现一次 }
}
ll search(int x){int now=0;ll ans =0;for(int i=0;i<=31;i++){a[i]=(x&1);x>>=1;}for(int i=31;i>=0;i--){int x=a[i];if(T[now].nxt[1-x]==-1||T[T[now].nxt[1-x]].cnt<=0){/*如果1-x无路可走,只能走x的路 */ now = T[now].nxt[x]; }else {ans+=1ll<<i;now=T[now].nxt[1-x];}}return ans;
}
void Trie_dele(int x){int now=0;for(int i=0;i<=31;i++){a[i]=x&1;x>>=1; }for(int i=31;i>=0;i--){int tmp=a[i];now = T[now].nxt[tmp];T[now].cnt--;}
}
int main()
{int t;t=read();while(t--){int n;ll ans=-1;rtnum=1;n=read();T[0].init();for(int i=1;i<=n;i++){num[i]=read();insert(num[i]);}for(int i=1;i<=n;i++){Trie_dele(num[i]);for(int j=1;j<=n;j++){if(i==j)continue;Trie_dele(num[j]);ans=max(ans,search(num[i]+num[j]));insert(num[j]);}insert(num[i]);}printf("%lld\n",ans);}return 0;
}

暴力

#include <set>
#include <map>
#include <deque>
#include <ctime>
#include <stack>
#include <cmath>
#include <queue>
#include <string>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;typedef long long LL;
typedef pair<LL, LL> pll;
typedef pair<LL, int> pli;
typedef pair<int, int> pii;
typedef unsigned long long uLL;#define lson rt<<1
#define rson rt<<1|1
#define name2str(name)(#name)
#define bug printf("**********\n");
#define IO ios::sync_with_stdio(false);
#define debug(x) cout<<#x<<"=["<<x<<"]"<<endl;
#define FIN freopen("/home/dillonh/CLionProjects/in.txt","r",stdin);const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1000 + 7;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const LL INF = 0x3f3f3f3f3f3f3f3fLL;int t, n;
int s[1007];int main() {#ifndef ONLINE_JUDGEFIN;
#endifscanf("%d", &t);while(t--) {scanf("%d", &n);LL ans = -1;for(int i = 1; i <= n; i++) {scanf("%d", &s[i]);}for(int i = 1; i <= n; i++) {for(int j = 1; j < i; j++) {for(int k = 1; k < j; k++) {ans = max(ans, (LL)(s[i] + s[j]) ^ s[k]);ans = max(ans, (LL)(s[i] + s[k]) ^ s[j]);ans = max(ans, (LL)(s[j] + s[k]) ^ s[i]);}}}printf("%lld\n", ans);}return 0;
}

Chip Factory HDU - 5536相关推荐

  1. HDU 5536 Chip Factory 字典树+贪心

    给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...

  2. HDU 5536 Chip Factory (01字典树)

    传送门:HDU 5536 题目大意: 在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i.j.k 各不相同. 前至技能:01字典树详解. 思路: 01字典树模板可以解决查找与 x ...

  3. HDU 5536 Chip Factory 01字典树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:数组中求 i,j,k 最大的(A[i] + A[j]) xor A[k] i != j ...

  4. Trie UVALive 7192 Chip Factory (15长春J)

    题目传送门 题意:从n个数中选出不同的三个数a b c,使得(a+b)^c 最大 分析:先将所有数字按位插入到字典树上,然后删除两个数字,贪心询问与剩下的数字最大异或值. /************* ...

  5. HDU 5536 字典树

    题意:就是公式. 这现场赛O(n^3)能过,觉得太没天理了. 做法:字典树,枚举两个数,然后在字典树上贪心的跑. #include <bits/stdc++.h>using namespa ...

  6. 区域赛铜牌专题(一)

    区域赛铜牌专题 题号 题目 知识点 HDU 5532 Almost Sorted Array 贪心,LIS HDU 5533 Dancing Stars on Me HDU 5536 Chip Fac ...

  7. 字典树,01字典树,可持续化01字典树(总结+例题)

    目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...

  8. 【套题】2015ACM/ICPC亚洲区长春站 HDU5532 5533 5534 5536 5538

    水几个题,熟悉一下键盘... HDU5532 Almost Sorted ArrayHDU5532\ Almost\ Sorted\ Array 题意:ASAASA定义为,仅去掉一个(One and  ...

  9. Trie(字典)树详解

    什么是Trie(字典)树 顾名思义,这棵树和字典类似,通过百度我们又能知道Trie树是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引 ...

最新文章

  1. Mybatis实现多对多关联组合查询
  2. Linux之父警告全球程序员:我刚发布的5.12内核有bug,你们千万别用
  3. vscode 编辑器常用快捷键
  4. JavaScript 逆向 ( 一 ) --- JavaScript 语法基础
  5. C#中通过代码控制IIS服务重启
  6. java 创建数组工具类_用Java创建数组工具类ArrayTool
  7. SQL数据库相关 FMDB框架的使用
  8. Debug Current Instruction Pointer 删除debug蓝色小箭头
  9. 2022年软考高级网络规划设计师备考指南
  10. MAML论文阅读笔记--回归实验
  11. jvm之java类加载机制和类加载器(ClassLoader)的详解
  12. 光耦主要参数和高速光耦如何选型
  13. 反弹球消砖块C语言重构函数封装
  14. 外星人入侵游戏(Python3)
  15. 身为UI设计师,如何应对失业的恐慌
  16. QCC514x-QCC304x(headset)系列(入门篇)之1.1-QCC3044之基本介绍
  17. 一文了解SAP Ariba是什么?
  18. 简说window操作系统
  19. win7美化_极致美化 | 我们如何把 Windows「改造」成 mac OS
  20. 177则经典名著名句

热门文章

  1. “对不起,我们只招父母毕业于名牌院校的孩子”:最可怕的,是你还以为学历不重要...
  2. 因为没钱买衣服,我女朋友不要我了......
  3. 快手春节活动奖励未到账,被羊毛党投诉上了全国12315平台
  4. 大数据时代,还不认识这些数据分析工具?
  5. 如何通过自学找到一份开发的工作?
  6. 什么是python扩展库_什么是目前比较常用的Python扩展库管理工具
  7. mysql数据恢复时显示多线程恢复_MySQL多线程备份恢复工具mydumper,myloder
  8. java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...
  9. 扩展mysql_扩展mysql - 手把手教你写udf
  10. php cbd架构,CBD模式