玲珑oj 1028 贪心
http://www.ifrog.cc/acm/problem/1028
很有趣的一道题,求从n个数里挑出不同的两个,使得他俩'|','&','^'后的值尽量大,求这个最大的结果。
求最大的异或值想到了trie树的一个经典操作,对于按位与,要两个位置都是1才会出现1,我们肯定要贪心操作,优先使高位为1,
这也可以在trie上完成,如果这个位置1的个数>=2,至少有两个以这个前缀开头的数字,我们就认为这个位置可以为1,再往下走考虑下一位,
如果1的个数不满足得话,说明这一位肯定是0了,此时要进行一步合并操作,将0下面的部分合并到1上,因为此位不必要是1所以0/1都可以。
对于'|',有点复杂我感觉,我们考虑遍历每个数字,是1得位我们就不必管了,然后从最高位的0开始看看是否能变为1.
例如,对于1000(2),我们首先找有没有x100(2),如果有再找x110(2),高位如果找不到了就找低位,最后得到的就是最大值,
我们预处理出每个数能拆出来的数,1001->1000,0001,1001。。。依次类推,用一个标记数组。
之后循环每一个数的时候,记录由高位到低位'0'出现的位置,之后贪心高位找到最大的,只要标记过这个数就表示可以进行或操作。
#include<bits/stdc++.h>
using namespace std;
int num[],a[];
int ch[][],cnt[],sz;
void irt(int x)
{
int p=;
for(int i=;i>=;--i){
int bit=(x&(<<i))?:;
if(ch[p][bit]==-)
{
ch[sz][]=ch[sz][]=-;
cnt[sz]=;
ch[p][bit]=sz++;
}//cout<<p<<endl;
p=ch[p][bit];
cnt[p]++;
}
}
void uno(int &x,int y)
{
if(y==-) return;
if(x==-) {ch[sz][]=ch[sz][]=-;cnt[sz]=;x=sz++;}
cnt[x]+=cnt[y];
uno(ch[x][],ch[y][]);
uno(ch[x][],ch[y][]);
}
int solve1(int n)
{
int p=,ret=;
for(int i=;i>=;--i){
if(ch[p][]!=-&&cnt[ch[p][]]>=)
ret|=(<<i);
else uno(ch[p][],ch[p][]);
p=ch[p][];
}
return ret;
} int solve2(int x)
{
int ret=,p=;
for(int i=;i>=;--i){
int bit=(x&(<<i))?:;
if(ch[p][bit^]!=-) {p=ch[p][bit^];ret|=(<<i);}
else p=ch[p][bit];
if(p==-) break;
}
return ret;
}
bool dp[(<<)];
int solve3(int n)
{
int i,j,ret=;
memset(dp,,sizeof(dp));
for(i=;i<=n;++i) dp[a[i]]=;
for(i=(<<);i>=;--i)
{
for(j=;j>=;--j)
{
if(!(i&(<<j))) dp[i]|=dp[i|(<<j)];
}
}
int t[],p=;
for(i=;i<=n;++i)
{
p=;
for(j=;j>=;--j)
if(!(a[i]&(<<j))) t[p++]=(<<j);
int x=;
for(j=;j<p;++j)
{
if(dp[x|t[j]]) x|=t[j];
}
ret=max(ret,x|a[i]);
}
return ret;
}
int main()
{
int i,j,k,n,m,t,op; // freopen("in.txt","r",stdin);
cin>>t;
for(int cas=;cas<=t;++cas)
{
sz=;
int xo=;
cin>>n>>op;
memset(num,,sizeof(num));
ch[sz][]=ch[sz++][]=-;cnt[]=;
for(i=;i<=n;++i)
{
scanf("%d",a+i);
if(op==) xo=max(xo,solve2(a[i]));
irt(a[i]);
}
printf("Case #%d: ",cas);
switch(op){
case :cout<<solve1(n)<<endl;break;
case :cout<<xo<<endl;break;
case :cout<<solve3(n)<<endl;break;
}
}
return ;
}
玲珑oj 1028 贪心的更多相关文章
- 玲珑学院OJ 1028 - Bob and Alice are playing numbers 字典树,dp
http://www.ifrog.cc/acm/problem/1028 题解处:http://www.ifrog.cc/acm/solution/4 #include <cstdio> ...
- Light OJ 1028 - Trailing Zeroes (I) (数学-因子个数)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1028 题目大意:n除了1有多少个因子(包括他本身) 解题思路:对于n的每个因子 ...
- 玲珑oj 1117 线段树+离线+离散化,laz大法
1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异 ...
- 九度OJ 1028:继续畅通工程 (最小生成树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3140 解决:1338 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有 ...
- oj教程--贪心
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...
- SWUST OJ(1028)
特定字符序列的判断 #include <iostream> #include <cstdlib> #include <stack> #include <str ...
- 玲珑OJ 1129 - 喵哈哈村的战斗魔法师丶坏坏い月
1129 - 喵哈哈村的战斗魔法师丶坏坏い月 Time Limit:3s Memory Limit:256MByte Submissions:315Solved:71 DESCRIPTION 坏坏い月 ...
- 玲珑oj 1121 思维
1121 - Reverse the lights Time Limit:2s Memory Limit:256MByte Submissions:376Solved:111 DESCRIPTION ...
- 玲珑oj 1128 RMQ模板
1128 - 咸鱼拷问 Time Limit:3s Memory Limit:128MByte Submissions:380Solved:118 DESCRIPTION 给你两个序列A,B.每个序列 ...
随机推荐
- 记录:正确率、召回率、F值
因为不理解召回率,所以去查看了一些资料.特此记录一下自己的理解,以便以后查看. 说明 正确率=查出来正确的样本数/全部查出来的样本数 (也可以理解为查准率) 召回率=查出来正确的样本数/数据集里全部正 ...
- python将图片转化为字符图
最近看到将图片转化为字符图的小实验,我觉得很有趣,所以决定自己实现一下. 步骤和原理如下: 读取图片的灰度值矩阵(0-255之间),灰度值矩阵主要反映的是图片的黑白程度,越黑越接近与0,越白越接近于2 ...
- 5.MySQL必知必会之过滤数据-WHERE
本章将讲授如何使用SELECT语句的WHERE子句指定搜索条件. 1.使用WHERE子句 数据库表一般包含大量的数据,很少需要检索表中所有行.通常只 会根据特定操作或报告的需要提取表数据的子集.只检索 ...
- Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game
地址:http://codeforces.com/contest/811/problem/D 题目: D. Vladik and Favorite Game time limit per test 2 ...
- Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A Is it rated?
地址:http://codeforces.com/contest/807/problem/C 题目: C. Success Rate time limit per test 2 seconds mem ...
- [随记][asp.net基础]Page_Load和OnLoad
标题:[随记][asp.net基础]Page_Load和OnLoad 一.前言 东西好久不用.不想,就会忘,所以没办法,只好记下来. 二.正文 aspx页面加载的时候会自动执行Page_Load,也会 ...
- Eclipse配置多个jdk
Eclipse配置多个jdk 步骤: 1,打开windows > Preferences: 2,点击“Add”,新增jdk,选择“Standard VM”: 3,下一步,选择对应版本的jer: ...
- Jquery13 Ajax 进阶
学习要点: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的问题 ...
- Caffe学习笔记(二):Caffe前传与反传、损失函数、调优
Caffe学习笔记(二):Caffe前传与反传.损失函数.调优 在caffe框架中,前传/反传(forward and backward)是一个网络中最重要的计算过程:损失函数(loss)是学习的驱动 ...
- intellij idea rearrange code
reformat code的时候,无法将filed放在method前边,很恶心. 那么先去