E - Numbers on the blackboard

最后的答案肯定为\(\sum_{l\leq i\leq r} 2^{p_i}\times a_i\)

然后这个\(p\)满足以下限制:

  • \(p_i=0\)(\(i=l\))

  • \(1\leq p_i\leq p_{i-1}+1\)(\(l<i\leq r\))

以下不特别考虑\(i=1\)

那么若\(a_i>0\),那么我们肯定是希望它的\(p_i\)尽可能大也就是取\(p_{i-1}+1\),即在\(i-1\)合并到前面去之前,\(i\)就合并到\(i-1\)了

步骤一:那么先不考虑询问,我们要使得答案最大,肯定是从最右端开始向左合并,直到当前合并出来的值为负数,就停下,然后向前找,直到找到下一个为非负数的点,然后又从它开始向前合并

步骤二:那么最后就只剩下了一堆权值为负的点(也有可能只剩下一个非负的点),那么对于这些点我们希望它们的\(p_i\)尽可能小,所以现在从左往右合并,那么每个点的\(p_i\)都等于\(1\)

现在考虑能不能从左往右加点的进行步骤一,显然是可以的

假设我们已经处理好了当前已经加进来了的所有点最后缩成的负点,那么加入一个新点\(t\),若它是负数,就不管,否则就将它与目前最后一个负点融合,它的贡献就是\(2^{sz}\times a_t\),其中\(sz\)表示最后一个负点所代表的原来的点的数量

若这个负点又变成正的了,就继续向前融合

这样的话,我们就可以将询问离线,对所有询问按右端点从小到大排序,然后考虑怎么处理询问,即怎么进行步骤二

我们先加点加到\(r\),这样就不用考虑右边界,接下来考虑\(l\)

找到\(l\)所处的点,那么对于这个点之后的所有点,它们都可以用上述步骤二的方式解决,即它们的\(p_i\)都是1,对于\(l\)处于的这个点,将它拆成原来的样子,舍去\(l\)左边多余的原来的点,剩下的原来的点,因为都是这个点所代表的一个区间的点的右边部分,所以它们一定可以全部按照步骤一的方式合并

于是就做完了,撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★*

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5,MOD=1e9+7;
const ll INF=1e14+114514;
int n,q,a[N],ans[N];
struct node{
int l,r,id;
bool operator < (const node &other) const{
return r<other.r;
}
}cn[N];
int pos=1,st[N],top;
ll block[N],sumb[N];
ll p2[N],sum[N],inv2[N];
void merge(){
if((1ll<<st[top]-st[top-1])>=INF||((1ll<<st[top]-st[top-1])>(INF-block[top-1])/block[top])) block[--top]=INF;
else block[top-1]=block[top-1]+(block[top]<<st[top]-st[top-1]),--top;
}
void go(int goal){
while(pos<=goal){
block[++top]=a[pos],st[top]=pos;
while(top>1&&block[top]>0) merge();
if(block[top]>=INF) sumb[top]=sum[pos];
else sumb[top]=((sumb[top-1]+block[top]%MOD)%MOD+MOD)%MOD;
++pos;
}
}
int ask(int l,int r){
st[top+1]=r+1;
int t=upper_bound(st+1,st+top+2,l)-st;
return (((sumb[top]-sumb[t-1])%MOD+MOD)%MOD*2%MOD+((sum[st[t]-1]-sum[l-1])%MOD+MOD)%MOD*inv2[l]%MOD)%MOD;
}
int main(){
scanf("%d%d",&n,&q);
p2[0]=inv2[0]=1;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
p2[i]=p2[i-1]*2%MOD,inv2[i]=inv2[i-1]*500000004%MOD;
sum[i]=(sum[i-1]+a[i]*p2[i]%MOD)%MOD;
}
for(int i=1;i<=q;++i) scanf("%d%d",&cn[i].l,&cn[i].r),cn[i].id=i;
sort(cn+1,cn+q+1);
for(int i=1;i<=q;++i) go(cn[i].r),ans[cn[i].id]=ask(cn[i].l,cn[i].r);
for(int i=1;i<=q;++i) printf("%d\n",ans[i]); return 0;
}

[CF878E]Numbers on the blackboard的更多相关文章

  1. 【CF878E】Numbers on the blackboard 并查集

    [CF878E]Numbers on the blackboard 题意:给你一个长度为n个数列,你每次可以进行如下操作: 选取两个相邻的数x,y(x在y左面),然后将这两个数去掉,用x+2y替换它. ...

  2. Codeforces 878 E. Numbers on the blackboard

    Codeforces 878 E. Numbers on the blackboard 解题思路 有一种最优策略是每次选择最后面一个大于等于 \(0\) 的元素进行合并,这样做完以后相当于给这个元素乘 ...

  3. CF 878E Numbers on the blackboard 并查集 离线 贪心

    LINK:Numbers on the blackboard 看完题觉得很难. 想了一会发现有点水 又想了一下发现有点困难. 最终想到了 但是实现的时候 也很难. 先观察题目中的这个形式 使得前后两个 ...

  4. Codeforces878E. Numbers on the blackboard

    $n \leq 100000$的数列,数字范围$-1e9,1e9$,现$q \leq 1e5$个每次问在一个区间玩游戏,能得到的最大的数.“游戏”:选相邻两个数$a_x,a_y$,然后把他们删掉,变成 ...

  5. Codeforces Beta Round #51 B. Smallest number dfs

    B. Smallest number Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/pro ...

  6. ZOJ 3529 A Game Between Alice and Bob(博弈论-sg函数)

    ZOJ 3529 - A Game Between Alice and Bob Time Limit:5000MS     Memory Limit:262144KB     64bit IO For ...

  7. ZOJ 3529 A Game Between Alice and Bob 博弈好题

    A Game Between Alice and Bob Time Limit: 5 Seconds      Memory Limit: 262144 KB Alice and Bob play t ...

  8. ural1682 Crazy Professor

    Crazy Professor Time limit: 1.0 secondMemory limit: 64 MB Professor Nathan Mathan is crazy about mat ...

  9. [HDU - 5170GTY's math problem 数的精度类

    题目链接:HDU - 5170GTY's math problem 题目描述 Description GTY is a GodBull who will get an Au in NOI . To h ...

  10. BestCoder Round #29——A--GTY's math problem(快速幂(对数法))、B--GTY's birthday gift(矩阵快速幂)

    GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

随机推荐

  1. 【Java】字符串常用操作

    字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...

  2. js 小数取整

    小数取整 var num = 123.456; // 常规方法 console.log(parseInt(num)); // 123 // 双重按位非 console.log(~~num); // 1 ...

  3. Web前端入门第 24 问:CSS 单位

    单位就是那个形容长度大小的东西.比如身高180cm(厘米),cm就是单位. css 也不例外,要描述一个盒子的大小,就必须要用到单位. css 单位根据其作用分为几大类:绝对单位.相对单位.视口单位. ...

  4. 2025dsfz集训Day7: KMP与Trie树

    Day7: KMP与Trie树 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling KMP算法 ...

  5. 解密prompt系列53. 再谈大模型Memory

    上一章畅想里面我们重点提及了大模型的记忆模块,包括模型能否持续更新记忆模块,模型能否把持续对记忆模块进行压缩更新在有限的参数中存储更高密度的知识信息,从而解决有限context和无限知识之间的矛盾.这 ...

  6. 高度混淆和多层嵌套的JSP案例免杀思路

    免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任. 01 分析特征 目前webshell检测 ...

  7. 1.3K star!VisActor团队开源神器,3秒生成商业级图表,程序员直呼真香!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 项目速览 VChart 是VisActor团队推出的高性能可视化解决方案,GitHub斩获2 ...

  8. W.js ,一个超级小的三维 WebGL 引擎的使用方法

    目录 前言 它的特点 API 入门使用 内置模型 导入自己的模型 动画 自定义投影矩阵 摄像机与主角绑定 解除绑定 前言 我们知道,在网页上搞三维,three.js 和 babylon.js 都是成熟 ...

  9. FastAPI与Tortoise-ORM开发的神奇之旅

    title: FastAPI与Tortoise-ORM开发的神奇之旅 date: 2025/05/05 00:15:48 updated: 2025/05/05 00:15:48 author: cm ...

  10. 【HUST】网络攻防实践|TCP会话劫持+序列号攻击netcat对话

    文章目录 一.前言 1. 实验环境 2. 攻击对象 3. 攻击目的 4. 最终效果 docker的使用 新建docker docker常用指令 二.正式开始 过程记录 1. ARP欺骗 2. 篡改数据 ...