NOIP 模拟 $11\; \rm english$
题解
本题有一定代码难度
对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解
那么对于第一问,我们记录一个数组 \(bit\),\(bit_{i,j}\) 表示前 \(i\) 个数二进制下第 \(j\) 位为 \(1\) 的有多少
对于每一个数,设其左边界为 \(l_i\),右边界为 \(r_i\),则我们将这个区间分成两部分 \(l_i~i\),\(i~r_i\),选取数少的枚举
枚举每一位,若这个数这一为不为 \(1\),则贡献为 \(r_i-i+1-(bit_{r_i,j}-bit_{i-1,j})\),为 \(0\) 同理。
那么对于第二问,我们可以建一颗 \(01trie\)。
个人认为,可持久化 \(01trie\) 就相当于 \(01trie\) 前缀和,可以方便得求区间值
所以,我们这一问求得就是对于一个在 \(num_j,j\in [l_i,i]\) 有多少 \(k\) 满足 \({num_j}\;\;xor\;\;{num_k} > num_i\),\(01trie\) 求解即可
Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define FM(x) x>=MOD?x-MOD:x
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
typedef long long ll;
static const int N=1e5+7,MOD=1e9+7;
int que[N],num[N],l[N],r[N],bit[N][21],cm[21],pce,n,opt;
ll tmp[21],nmc[21],ans1,ans2;
struct Trie{
#define ls(x) T[x].ch[0]
#define rs(x) T[x].ch[1]
struct trie{int ch[2],nm;}T[N*22];
int rt[N],tot;
inline void insert(int x,int pre,int &nw) {
nw=p(tot);ri cur=nw;
for (ri i(20);~i;--i) {
int p=(x>>i)&1;
T[cur].nm=T[pre].nm+1;
T[cur].ch[p^1]=T[pre].ch[p^1];
T[cur].ch[p]=p(tot);
cur=T[cur].ch[p],pre=T[pre].ch[p];
}
T[cur].nm=T[pre].nm+1;
}
inline int query(int sl,int pre,int cur) {
ri res=0,nm=0;
for (ri i(20);~i;--i) {
if (sl&cm[i]) {
if (nm+cm[i]>pce) {
int k=res;
res+=T[ls(cur)].nm-T[ls(pre)].nm;
cur=rs(cur),pre=rs(pre);
} else {
nm+=cm[i];
cur=ls(cur),pre=ls(pre);
}
} else {
if (nm+cm[i]>pce) {
int k=res;
res+=T[rs(cur)].nm-T[rs(pre)].nm;
cur=ls(cur),pre=ls(pre);
} else {
nm+=cm[i];
cur=rs(cur),pre=rs(pre);
}
}
}
return res;
}
}T;
inline void add(int x,int p) {
for (ri i(0);i<=20;p(i)) {
bit[p][i]=x&1;x>>=1;
if (!x) return;
}
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n),read(opt);
cm[0]=1;
for (ri i(1);i<=20;p(i)) cm[i]=cm[i-1]<<1;
for (ri i(1);i<=n;p(i)) read(num[i]);
ri tl=0;
for (ri i(1);i<=n;p(i)) {
add(num[i],i);
T.insert(num[i],T.rt[i-1],T.rt[i]);
while(tl&&num[que[tl]]<=num[i]) r[que[tl--]]=i-1;
l[i]=que[tl]+1;
que[p(tl)]=i;
for (ri j(0);j<=20;p(j)) bit[i][j]+=bit[i-1][j];
}
while(tl) r[que[tl--]]=n;
for (ri i(1);i<=n;p(i)) {
register ll res1=0,res2=0;
pce=num[i];
if (i-l[i]<=r[i]-i) {
for (ri j(0);j<=20;p(j)) nmc[j]=bit[r[i]][j]-bit[i-1][j];
ri len=r[i]-i+1;
for (ri j(l[i]);j<=i;p(j)) {
for (ri k(0);k<=20;p(k)) {
if (num[j]&(1<<k)) tmp[k]=len-nmc[k];
else tmp[k]=nmc[k];
res1+=tmp[k]*cm[k]%MOD;
res1=FM(res1);
}
res2+=T.query(num[j],T.rt[i-1],T.rt[r[i]])%MOD;
res2=FM(res2);
}
} else {
for (ri j(0);j<=20;p(j)) nmc[j]=bit[i][j]-bit[l[i]-1][j];
ri len=i-l[i]+1;
for (ri j(i);j<=r[i];p(j)) {
for (ri k(0);k<=20;p(k)) {
if (num[j]&(1<<k)) tmp[k]=len-nmc[k];
else tmp[k]=nmc[k];
res1+=tmp[k]*cm[k]%MOD;
res1=FM(res1);
}
res2+=T.query(num[j],T.rt[l[i]-1],T.rt[i])%MOD;
res2=FM(res2);
}
}
ans1+=res1*num[i]%MOD,ans1=FM(ans1);
ans2+=res2*num[i]%MOD,ans2=FM(ans2);
}
if (opt==1) printf("%lld\n",ans1);
else if (opt==2) printf("%lld\n",ans2);
else if (opt==3) printf("%lld\n%lld\n",ans1,ans2);
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $11\; \rm english$的更多相关文章
- NOIP 模拟 $11\; \rm biology$
题解 首先对 \(a\) 离散化,则可推出转移方程 \[dp_{i,j}=\max\{{dp_{{i^{'}},{j^{'}}}+|i-i^{'}|+|j-j^{'}|}\}+b_{i,j} \;\; ...
- NOIP 模拟 $11\;\rm math$
题解 签到题(然而还是不会) 考虑所有可能的值一定是 \(\in [0,k)\),且一定为 \(gcd(a_1,a_2,...a_n,k)\) 的倍数. 证明: 设 \(tmp=b_1a_1+b_2a ...
- 8.1 NOIP模拟11
8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...
- 6.11考试总结(NOIP模拟7)
背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- NOIP 模拟 $24\; \rm matrix$
题解 \(by\;zj\varphi\) 发现 \(\rm n,m\) 都很小,考虑分行状压. 但是上一行和下一行的按钮状态会对当前行造成影响,所以再枚举一个上一行的按钮状态. 因为对于两行,只有如下 ...
- NOIP 模拟 $20\; \rm y$
题解 \(by\;zj\varphi\) 首先发现一共最多只有 \(2^d\) 种道路,那么可以状压,(不要 \(dfs\),会搜索过多无用的状态) 那么设 \(f_{i,j,k}\) 为走 \(i\ ...
- noip第11课作业
1. 数字比较 定义一个函数check(n,d),让它返回一个布尔值,如果数字d在正整数n的某位中出现则返回true,否则返回false. 例如:check(325719,3)==true:ch ...
随机推荐
- 【故障公告】redis 服务器宕机引发博客站点故障
非常抱歉,今天下午 17:10~17:40 左右,由于博客系统所使用的 redis 服务器宕机,造成博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 我们会针对这次故障改进 redis 服务器 ...
- kong的管理UI选择-konga
目录 npm方式安装 1. 准备依赖环境 2. 安装konga 3. 配置 4. 环境变量(more) 5. 数据库 配置 初始化/迁移 6. 运行 Docker方式安装 关于Kong-Dashboa ...
- 1.在配置XML文件时出现reference file contains errors (http://www.springframework.org/schema/beans/...解决方案
解决方案: 第一步:将 Preferences > XML > XML Files > Validation中"Honour all XML schema location ...
- Three.js-任意平面的镜像矩阵
1. 什么是镜像变换 直接看下面这张图: 这张图很好的诠释了镜像变化,关于y轴的变化,关于x轴的变化.这种关于任意轴的变化,就是镜像了. 2d下的镜像矩阵变化 我们以图像关于Y轴镜像为例子:原图形和结 ...
- 深入源码理解Spring整合MyBatis原理
写在前面 聊一聊MyBatis的核心概念.Spring相关的核心内容,主要结合源码理解Spring是如何整合MyBatis的.(结合右侧目录了解吧) MyBatis相关核心概念粗略回顾 SqlSess ...
- 爬取房价信息并制作成柱状图XPath,pyecharts
以长沙楼盘为例,看一下它的房价情况如何url = https://cs.newhouse.fang.com/house/s/b91/ 一.页面 二.分析页面源代码 我们要获得的数据就是名字和价格,先来 ...
- elastic query match_all 数据目标超过10000条出错 Result window is too large
起因 elastic做文本索引,match_all目标索引超过10000条时,出错 { "error": { "root_cause": [ { "t ...
- 用 JavaScript 刷 LeetCode 的正确姿势【进阶】
之前写了篇文章 用JavaScript刷LeetCode的正确姿势,简单总结一些用 JavaScript 刷力扣的基本调试技巧.最近又刷了点题,总结了些数据结构和算法,希望能对各为 JSer 刷题提供 ...
- [WUSTCTF2020]朴实无华
[WUSTCTF2020]朴实无华 考点:1.MD5碰撞 2.命令执行绕过 打开题发现编码有些问题,修改编码为utf-8 看了源码和请求包没发现什么东西,看到title想到了robots.txt文件, ...
- Mac卸载软件真不省心啊
最近看看磁盘觉得有点小, 就整理了一下, 经过一番折腾, 发现MacOS卸载软件可真是不省心啊. 从应用里移到垃圾桶仅仅是第一步, 当然对于不读写任何文件的应用也许就可以了. 咱们看看赶紧卸载一个软件 ...