CS Round#53 E Maxor
题意:给你N个数,你可以从中选出两个数将它们or起来得到M,求M的最大值及得到最大值的方案数。
刚了半个小时得到了一个貌似时O(N log max(Ai)^2)的方法,想了想发现貌似只能做出第一问,但好像改一下就能搞掉第二问,等等,复杂度炸了。。。无奈之下跑去看题解,然而题解的解法看起来十分玄妙,而且是英文我并不能读懂。。。于是我就跑去翻别人的代码,看到了Blue Mary的代码,发现很短,就去研究了一下。
我的眼睛,这特么不是暴力么。。。
#include<bits/stdc++.h>
using namespace std;
int c[<<],c2[<<];
int main(){
int n,x;
for(scanf("%d",&n); n--;){
scanf("%d",&x);
c[x]++;
}
for(int i=; i<(<<); i++)c2[i] = c[i];
for(int i=; i<; i++)for(int mask=(<<)-; mask>=; mask--)
if(mask&(<<i))c2[mask-(<<i)] += c2[mask];
for(int x = (<<)-; x >= ; x--){
int b = ;long long int all = ;
do{
int A = c[b], B = c2[x-b];
if(A!=&&B!=)all += (long long int)A*B;
}while(b = (b-x)&x);
if(all){
cout << x << " " <<(all - c[x])/ <<endl;
break;
}
}
return ;
}
// By Blue Mary
我至今都不知道它为什么跑那么快。。。。
不过其中用到了一种枚举二进制子集的方法,这里就稍微提一下,就此题看来,相比于直接枚举集合后判断是否为子集,直接枚举子集还是能使程序效率大大提高的
Blue Mary用到的是这一种,是从小到大枚举:
int b=;
do{
......
}while(b=(b-s)&s);
在ssttkkl大佬的博客中,提到了另外一种,是从大到小枚举:
for(int x=s;x;x=(x-)&s){
......
}
虽然只是很小的优化,但在循环嵌套时如此枚举子集能使程序的效率翻倍提升,此题就是明证
正解我有空补上。。。
CS Round#53 E Maxor的更多相关文章
- CS Round#53 C Histogram Partition
题意:给定一个数组A,以及一个初始值全为0的空数组B,每次可以对数组B的任意一个区间内的所有数+x,问至少几次操作能把B数组变成A数组 NOIP原题(积木大赛)升级版,话说CS怎么那么多跟NOIP原题 ...
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
- BestCoder Round #53 (div.1)
Problem A: 题目大意: 给出以节点1为根的一棵树A,判断它是否是特殊的.一棵树是特殊的当且仅当不存在和它不完全相同的一棵树B,使得A中点i到点1的距离和B中相等. 题解: 假设一个点x的深度 ...
- hdu 5424 Rikka with Graph II (BestCoder Round #53 (div.2))(哈密顿通路判断)
http://acm.hdu.edu.cn/showproblem.php?pid=5424 哈密顿通路:联通的图,访问每个顶点的路径且只访问一次 n个点n条边 n个顶点有n - 1条边,最后一条边的 ...
- HDU 5432 Rikka with Tree (BestCoder Round #53 (div.2))
http://acm.hdu.edu.cn/showproblem.php?pid=5423 题目大意:给你一个树 判断这棵树是否是独特的 一颗树是独特的条件:不存在一颗和它本身不同但相似的树 两颗树 ...
- CH Round #53 -GCD Path
描述 给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边.有Q个询问,每个询问包含两个数x和y,求x到y的最短距离. 输入格式 第一行包含两个用空格隔开的整数,N和Q. 接下 ...
- CH Round #53 -密室
描述 有N个密室,3种钥匙(红色,绿色,白色)和2种锁(红色,绿色),红色钥匙只能开红色的锁,绿色钥匙只能开绿色的锁,白色钥匙可以开红色的锁和绿 色的锁,一把钥匙使用一次之后会被扔掉.每个密室由一扇门 ...
- CH Round #53 -【Nescafé 32】杯NOIP模拟赛
A.GCD Path http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D ...
随机推荐
- (转)Spark JAVA RDD API
对API的解释: 1.1 transform l map(func):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集 l ...
- Leetcode题解(十五)
42.Trapping Rain Water 题目 这道题目参考http://www.cnblogs.com/felixfang/p/3713197.html 观察下就可以发现被水填满后的形状是先升后 ...
- visual studio 2013使用github获取代码
如图点击"视图""团队资源管理器". 点击主页上方的那个插头形状按钮"连接到团队项目".点击"克隆" 然后在克隆 ...
- 对象作为 handleEvent
elem.addEventListener("click", obj, false); //用对象作为处理函数 var obj = { handleEvent: ...
- 全球领先的redis客户端:SFedis
零.背景 这个客户端起源于我们一个系统的生产问题. 一.问题的发生 在我们的生产环境上发生了两次redis服务端连接数达到上限(我们配置的单节点连接数上限为8000)导致无法创建连接的情况.由于这个系 ...
- JS中有关数组Array的常用方法函数
Array对象的方法主要有如下几种(我所知道的): concat()连接两个或多个数组,并返回结果,但是值得注意的是该方法并不改变数组本身,而仅仅返回一个数组连接的副本. push()在数组后面添加一 ...
- WPF 简易的喷泉效果
这两天领导让我做个喷泉的效果,要把一个个UserControl从一个位置喷出,然后,最后落在最终需要在的位置. 喷泉效果说白了,就是两个步骤:1.放大,从0放大到需要的倍数:2.缩小,平移,从放大的倍 ...
- C#获取存储过程的 Return返回值和Output输出参数值
1.获取Return返回值 程序代码 //存储过程//Create PROCEDURE MYSQL// @a int,// @b int//AS// return @a + ...
- C#编写的艺术字类方法
代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing ...
- MarkdownPad2使用高亮插件
MarkdownPad 2有插入代码块的功能,但样式却不尽人意,但又不想换个编辑器,找了挺多相关资料,最后在MarkdownPad 2集成prettify高亮插件. 如下相关资料: [HTML] Pr ...