2017.10.17 CF#441 F题 思考记录
。果然没有题解做题感觉是不一样的。
这个F题可能是最像往常B题的题了(往常B题就是dp,还一般都不难)
首先这个是|,所以|的数越多,它一定是不降的
那么合法的一定是一个数到一个数往后的数所构成的所有区间
那么不停地往后|,直到>其中最大的一个值就可以了,但最大值是随|不断变化的,那最大值是多少?
这时可以考虑枚举(化动为静的思想),,当前作为最大值的区间最大是多少(单调栈,前几天刚做过)
然后剩下的就是在左右区间各找一个位置,使 |和 >枚举的最大值
显然其他数位数不可能比最大值大,不然他就成为最大值了
所以考虑把最大值按位取反,然后&这个最大值>0的第一个出现的数
&>0只有最大值这一位是0,而有一个数这一位是1时出现
所以可以用线段树维护这一位是1的最左边的位置和最右边的位置,分别取max和min
因为具体数字满足几个要求无所谓,所以可以直接按位离散,
但线段树会爆空间,所以可以用dp求
f【这个数是啥】【二进制位】=最靠右的位置
g【这个数是啥】【二进制位】=最靠左的位置
半个插数dp。。
然后要注意,数字相同的区间也要算一个,所以可以往后算,
码:
#include<iostream>
#include<cstdio>
using namespace std;
#define zzzz o<<1,l,mid
#define yyyy o<<1|1,mid+1,r
#define N 200005
#define ll long long
int zz[N*32],zy[N*32],c,a,b,er[35],top,n,op,aa[N],sta[N],tong[35],f[N][35],g[N][35],lin[N];
ll zuo[N],you[N],ans,i,j;
bool nozuizuo[N];
int main()
{scanf("%d",&n);er[0]=1;for(i=1;i<=30;i++)er[i]=er[i-1]*2;for(i=1;i<=n;i++){scanf("%d",&aa[i]);}top=0;for(i=1;i<=n;i++){zuo[i]=1;while(top&&aa[sta[top]]<aa[i])zuo[i]+=zuo[sta[top]],top--;sta[++top]=i; }top=0;for(i=n;i>=1;i--){you[i]=1;while(top&&aa[sta[top]]<aa[i])you[i]+=you[sta[top]],top--;if(aa[sta[top]]==aa[i])nozuizuo[sta[a]]=1; sta[++top]=i; }top=0;for(i=n;i>=1;i--){lin[i]=1;while(top&&aa[sta[top]]<=aa[i])lin[i]+=you[sta[top]],top--;if(nozuizuo[i]!=1)you[i]=lin[i]; sta[++top]=i; }for(i=1;i<=n;i++){ for(j=0;j<=30;j++){f[i][j]=tong[j]; } for(j=0;j<=30;j++){if(er[j]&aa[i])tong[j]=i; }}for(i=0;i<=30;i++)tong[i]=9999999;for(i=n;i>=1;i--){ for(j=0;j<=30;j++){g[i][j]=tong[j]; } for(j=0;j<=30;j++){if(er[j]&aa[i])tong[j]=i; }}for(i=1;i<=n;i++){ int lin=aa[i],o=0,j=0; ll l1=0,l2=9999999;while(lin){if(!(lin&1)){if(f[i][j]>=i-zuo[i]+1)l1=max(f[i][j],int(l1)); if(g[i][j]<=you[i]+i-1)l2=min(g[i][j],int(l2)); }
lin/=2;
++j;}
if(l1!=0&&l2!=9999999)
{ans+=(l1-(i-zuo[i]+1)+1)*(you[i]);ans+=(i-l1)*((you[i]+i-1)-l2+1);
}
if(l1!=0&&l2==9999999)
{ans+=(l1-(i-zuo[i]+1)+1)*(you[i]);
}
if(l1==0&&l2!=9999999)
{ans+=zuo[i]*((i+you[i]-1)-l2+1);
}
}
printf("%I64d",ans);
}
2017.10.17 CF#441 F题 思考记录相关推荐
- 2017.10.7 最长上升子序列 思考记录
由于他添加的数字单调上升,所以答案只会在插入的那个数的f值上更新.. 由于之前插入的数都比这个数小,所以直接找区间f最大值.. 这题splay比上个play题好写太多了 不调不试1A splay辣 ...
- 2017.4.22 hankson的趣味题 思考记录
这个题非常的不容易 ,第一遍交爆零了 首先根据最大公约数和最小公倍数可知: 这个数x一定包含a1的所有质因数 这个数x一定不包含a0/a1的所有质因数 这个数一定包含b1/b0的所有质因数 这个数可能 ...
- 2017.10.8 球形空间产生器sphere 思考记录
圆心上的点到各点之间的距离相等,所以根据距离公式 sqrt ( (x-x1)^2 +(y-y1)^2 + (z-z1)^2) 可以由相邻两个式子列等式拆平方得到一元一次方程 然后消元求方程的解 ...
- 2017.10.17 蜘蛛难题 思考记录
强烈建议不要做此题,此题描述差到极点!毒瘤出题人 首先有想法就是从起点往后按照出水管依次满足,但多个水域需要合起来求下一个最低出水口,所以并不是很好维护 所以最好按照时间模拟 先求出当前状态下的最低水 ...
- 2017.5.28 codeforce h题思考记录
并没有报codeforce 但有人想让我帮他看题,于是就做了 大概意思就是,给你200个空,让你在200个空中放字母, 再自己设计一个串,要求自己设计的这个串在这放着200个字母的串中作为子串出 ...
- 2017.10.17 Codechef MARCH14 GERALD07加强版 失败总结
以前做这个题简直是噩梦的难度 有个很神的做法就是 利用最简联通形式来统计联通块 把一个要求的区间写成一颗等价的树,,就有了统一的标准 然后考虑怎么构造这棵树,看每次加入的边,如果已经联通,则考虑把这个 ...
- 2017.10.10 狼和羊的故事 思考记录
二集合划分问题,,花费最小,果断最小割 首先狼和羊可能会被分割,所以不能直接在原图上跑 所以可以考虑羊向狼建边,,但流量是受图的限制的,所以把0也考虑进来,一次只向相邻的一格连边 直接跑dinic即可 ...
- 2017.3.6~2017.3.7 Harry And Magic Box 思考记录(特别不容易)
英文题,看翻译做 看到这个题竟然一下找到了思路: 组合数+容斥:: 但是容斥不太懂 好像要做这个题必须先推容斥.... 试一试吧. 然并卵,花了一个晚上,还是求不出来. 根据题目的重复关系,确实 ...
- usaco题思考记录
1. 修理牛棚 Barn Repair 思路:反向,枚举所有间隔,从大到小排序,依次+板子不填它,直到板子数够了为止,拿总长去减::: 结论:逆向思维. 2.丢失的牛 思路:BFS::: 结论:有后效 ...
最新文章
- 技术以外的功夫 ----作者:李天平
- js读取外部json指定字段值完整代码_前端工程化 剖析npm的包管理机制(完整版)...
- Yii2语言国际化配置
- javascript学习随笔(编写浏览器脚本 Navigator Scripting )
- 用Word2007写Blog
- OpenStack KVM环境搭建
- 基于麻雀搜索算法的极限学习机(ELM)分类算法-附代码
- python写算法注册机_用python 写 Atlantis Word Processor 注册机
- 2008年顶尖 Web 设计师访谈
- 软文推广丨什么是软文推广?
- windows检查磁盘命令
- python使用代理ip访问网站_python使用代理ip访问网站的实例
- reviewer中文_中文审稿意见怎么写
- (转载)关于C#的fixed
- 物联网平台 ThingsBoard 3.3 发布
- 如何建立用户之间的邀请关系 / 邀请注册机制
- 如何用 js 获取虚拟键盘高度?(适用所有平台)
- 南昌大学 计算机面试题,南昌大学计算机应用技术专业调剂生复试经验
- Python的注释快捷键方法
- 计算机专业同济大学和华科,学计算机专业是去华中科技大学还是同济大学好?学霸教你选择...
热门文章
- MATLAB二维数组的创建与元素提取
- 再谈注意力机制 | 运用强化学习实现目标特征提取
- WORD如何设置第X页,共Y页页码设置?
- wepy小程序分包的版本
- jQuery学习之五---效果
- 邮件服务器收件人数量限制,Exchange限制每封邮件的收件人数
- linux增加 inode空间,linux 增加inode 的方法
- python中嵌套函数的应用实例-实例详解python函数的对象、函数嵌套、名称空间和作用域...
- mysql原子性和乐观锁_乐观锁 VS 悲观锁
- php上老师查看作业,请老师查阅俺的作业效果,看还满意不