51nod1674:区间的价值2(分治,利用&和|的收敛性)
lyk拥有一个区间。
Input第一行一个数n(1<=n<=100000)。
接下来一行n个数ai,表示这n个数(0<=ai<=10^9)。Output一行表示答案。Sample Input
3
3 4 5
Sample Output
70
题意:求所有区间的&值乘|值。
思路:分治,利用这两个逻辑运算的收敛性,用map记录相应个数,然后累加即可。
(和前面利用gcd的收敛性分治的一样的。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
const int Mod=;
ll ans;
ll a[maxn],And[maxn],Or[maxn];
map<pair<ll,ll>,ll>mp;
map<pair<ll,ll>,ll>::iterator it;
void solve(int L,int R)
{
if(L>R) return ;
int Mid=(L+R)>>; mp.clear();
And[Mid]=a[Mid]; Or[Mid]=a[Mid];
mp[make_pair(And[Mid],Or[Mid])]++;
for(int i=Mid-;i>=L;i--){
And[i]=And[i+]&a[i];
Or[i]=Or[i+]|a[i];
mp[make_pair(And[i],Or[i])]++;
}
for(int i=Mid;i<=R;i++){
for(it=mp.begin();it!=mp.end();it++)
ans+=(ll)(And[i]&(*it).first.first)*(Or[i]|(*it).first.second)%Mod*(*it).second%Mod;
}
solve(L,Mid-); solve(Mid+,R);
}
int main()
{
int N,i,j;
scanf("%d",&N);
for(i=;i<=N;i++) scanf("%lld",&a[i]);
solve(,N);
printf("%lld\n",ans);
return ;
}
小小优化:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
const int Mod=1e9+;
int a[maxn],And[maxn],Or[maxn]; ll ans;
map<pair<int,int>,int>mp,tp;
map<pair<int,int>,int>::iterator it1,it2;
void solve(int L,int R)
{
if(L>R) return ;
int Mid=(L+R)>>;
mp.clear(); tp.clear();
And[Mid]=a[Mid]; Or[Mid]=a[Mid];
mp[make_pair(And[Mid],Or[Mid])]++;
for(int i=Mid-;i>=L;i--){
And[i]=And[i+]&a[i];
Or[i]=Or[i+]|a[i];
mp[make_pair(And[i],Or[i])]++;
}
tp[make_pair(And[Mid],Or[Mid])]++;
for(int i=Mid+;i<=R;i++){
And[i]=And[i-]&a[i]; Or[i]=Or[i-]|a[i];
tp[make_pair(And[i],Or[i])]++;
}
for(it1=mp.begin();it1!=mp.end();it1++)
for(it2=tp.begin();it2!=tp.end();it2++)
ans=(ans+(ll)((*it1).first.first&(*it2).first.first)*((*it1).first.second|(*it2).first.second)%Mod*(*it1).second*(*it2).second)%Mod;
solve(L,Mid-); solve(Mid+,R);
}
int main()
{
int N,i,j;
scanf("%d",&N);
for(i=;i<=N;i++) scanf("%d",&a[i]);
solve(,N);
printf("%lld\n",ans);
return ;
}
51nod1674:区间的价值2(分治,利用&和|的收敛性)的更多相关文章
- 1674 区间的价值 V2(分治)
1674 区间的价值 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有 ...
- [hdu] 5696 区间的价值 || 序列分治
原题 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 求长度分别为1-n的区间的最大价值. 保证数据随机 因 ...
- 【51nod1674】区间的价值 V2(算法效率--位运算合并优化+链表实现)
题目链接: 51nod1674 题意:规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积.现在l有一个 N 个数的序列,问所有n*(n+1)/2个区间的贡献的和对1 ...
- 51nod 1564 区间的价值 | 分治 尺取法
51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. ...
- hdu5696 区间的价值
区间的价值 我们定义"区间的价值"为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R-L+1). 现在聪明的杰西想要知道,对于长度为k的区间,最大 ...
- hdu 5696 区间的价值 单调栈+rmq
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- 【51nod】1564 区间的价值
题解 这个要注意到一个长度大的区间的最大价值一定比长度小的区间的价值要大 然后我们以每个点为最小值,显然区间越长最大值越大,然后我们更新最大区间长度的取值,这个可以用单调栈求这个最小值能更新到的左右端 ...
- 51nod 1674 区间的价值V2(思维+拆位+尺取法)
最近被四区题暴虐... 题意:lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值 ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
随机推荐
- xamarin.IOS App闪退日志----crash
一.查找日志文件位置:通过xcode/windows/device/你的IPhone/crash 二.拿到日志可以直接查看,但是日志记录太乱看不懂,需要转换处理,查找.DSYM文件,文件位置:/Use ...
- iOS -- 设置label的自适应
- (void)AutoLabel { //准备工作 self.font = [UIFont systemFontOfSize:]; self.textColor = [UIColor whiteCo ...
- python 列表结构更新的奇妙问题
使用python + plt 画图遇到了一个奇怪的问题 应该出来的是这样: 结果做出来以后是这样: 为什么画到一起了...... 这个锅python列表背 a=[1,2]b=a 这样 改变b ,a ...
- from: 关于RabbitMQ
from: http://lynnkong.iteye.com/blog/1699684 1 什么是RabbitMQ? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种, ...
- python(31)- 模块练习
1. 小程序:根据用户输入选择可以完成以下功能: 创意文件,如果路径不存在,创建文件夹后再创建文件 能够查看当前路径 在当前目录及其所有子目录下查找文件名包含指定字符串的文件 ...
- UITableView 自带编辑删除 自己定义button
一:UITableView 自带编辑删除 1:实现两个方法就可以 #pragma mark tableView自带的编辑功能 -(void)tableView:(UITableView *)tab ...
- ElasticSearch 分页检索
在ElasticSearch的多索引和多类别里说到我们在集群中有14个文档匹配我们的(空)搜索语句.单数仅仅有10个文档在hits数组中.我们怎样看到其它文档? 和SQL使用LIMITkeyword返 ...
- Django+uwsgi+nginx+angular.js项目部署
这次部署的前后端分离的项目: 前端采用angular.js,后端采用Django(restframework),他俩之间主要以json数据作为交互 Django+uwsgi的配置可以参考我之前的博客: ...
- Linux 中权限的再讨论( 上 )
前言 在Linux系统中,用户分为三个部分( 所有者 同组人 其他 ).每个部分的权限又可以赋予读/写/执行权限.这样,文件的权限标记一共包含 9 个权限位.好了,很多朋友对于Linux权限的了解就仅 ...
- sap保存时小写字母自己主动转大写字母的解决方法
在实际应用中.ABAP保存数据到后台数据库表中时.会自己主动把前台输入的小写字母自己主动转换为大写字母来保存.有时候客户可能不须要转换,就须要用到以下的方法: 1.找到相应字段的Data ...