正题

题目链接:https://www.luogu.com.cn/problem/CF878E


题目大意

nnn个数字,每次可以把两个相邻的数字x,yx,yx,y变为x+2yx+2yx+2y。

mmm次询问一个区间合成一个数字后最大是多少。


解题思路

答案可以把每个数字变成xicix_i^{c_i}xici​​,其中ci≤ci−1+1c_i\leq c_{i-1}+1ci​≤ci−1​+1。

我们可以把数字变成一个个联通的块,对于同一个块中的,有ci=ci−1+1c_i=c_{i-1}+1ci​=ci−1​+1,考虑合并两个块的贡献,如果前面的块为正,那么这两个块一定合并更优。

所以我们离线询问,枚举右端点,加入一个数字后我们一直合并并且统计块答案的前缀和,然后注意左端点的位置不能取整一个块。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=1e5+10,inf=2e9+5,P=1e9+7;
ll n,m,a[N],b[N],pw[N],f[N],ans[N];
ll fa[N],siz[N],s[N],sum[N];
vector<pair<ll,ll> > q[N];
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void merge(ll x,ll y){fa[y]=x;if(siz[x]>30&&s[x]>0||s[x]+(s[y]<<siz[x])>=inf)s[x]=inf;else s[x]+=s[y]<<siz[x];f[x]=(f[x]+f[y]*pw[siz[x]])%P;siz[x]+=siz[y];return;
}
ll seek(ll l,ll r)
{return (b[l]-b[r+1]*pw[r-l+1]%P+P)%P;
}
int main()
{scanf("%lld%lld",&n,&m);pw[0]=1;for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);f[i]=s[i]=a[i];fa[i]=i;siz[i]=1;pw[i]=(pw[i-1]<<1)%P; }for(ll i=n;i>=1;i--)b[i]=(b[i+1]*2+a[i])%P;for(ll i=1;i<=m;i++){ll l,r;scanf("%lld%lld",&l,&r);q[r].push_back(make_pair(l,i));}for(ll i=1;i<=n;i++){while(find(i)>1&&s[find(i)]>=0)merge(find(find(i)-1),find(i));sum[find(i)]=(sum[find(find(i)-1)]+f[find(i)])%P;for(ll j=0;j<q[i].size();j++){ll l=q[i][j].first,id=q[i][j].second;ans[id]=(sum[find(i)]-sum[find(l)]+P)*2%P;(ans[id]+=seek(l,find(l)+siz[find(l)]-1))%=P;}}for(ll i=1;i<=m;i++)printf("%lld\n",(ans[i]+P)%P);return 0;
}

CF878E-Numbers on the blackboard【并查集,贪心】相关推荐

  1. CF 1253D-Harmonious Graph-并查集+贪心

    Description You're given an undirected graph with n nodes and m edges. Nodes are numbered from 1 to ...

  2. nssl1454-最短路【并查集,贪心】

    正题 题目大意 nnn个点,每个点可以走到[ai,n][a_i,n][ai​,n],每个点可以从[bi,n][b_i,n][bi​,n]到达. 求disi,j∗(i+j)dis_{i,j}*(i+j) ...

  3. 洛谷 P1967货车运输 并查集+贪心 不需要用LCA!

    题目链接 题目链接 题解 要求所有的路径中最小边长的最大值! 我们贪心的加边,依照边从大往小的方式往里添加,然后合并并查集. 每次当查询分布在两个待合并的并查集的时候,当前的边长就是这次查询的答案. ...

  4. HDOJ 1598 find the most comfortable road(并查集+贪心)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. BZOJ 3430: [Usaco2014 Jan]Ski Course Rating(并查集+贪心)

    题面 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 136 Solved: 90 [Submit][Status][Discuss] Descript ...

  6. POJ1456贪心(set或者并查集区间合并)

    题意:       给你n商品,每个商品有自己的价值还有保质期,一天最多只能卖出去一个商品,问最大收益是多少? 思路:       比较好想的贪心,思路是这样,每一次我们肯定拿价值最大的,至于在那天拿 ...

  7. 1584.连接所有点的最小费用(Kruskal算法) | 1697. 检查边长度限制的路径是否存在(并查集)

    给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] . 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi ...

  8. 并查集算法总结专题训练

    并查集算法总结&专题训练 1.概述 2.模板 3.例题 1.入门题: 2.与别的算法结合: 3.考思维的题: 4.二维转一维: 5.扩展域并查集&边带权并查集: 4.总结 1.概述 并 ...

  9. POJ1703 Find them, Catch them 并查集

    点击打开链接 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50757   Ac ...

最新文章

  1. C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
  2. 2018-3-4 nginx和Tengine 以及高并发的概念
  3. 【ACM】家喻户晓的中药店(待更)
  4. [题解]CEOI 2004 锯木厂选址
  5. @slf4j注解_SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验
  6. 20应用统计考研复试要点(part11)--应用多元分析
  7. 于iOS跳转到应用程序AppStore
  8. web.config配置Access数据库 (C#) ASP.NET+ACCESS
  9. 地大计算机学院保研华科人数,2020年华中科技大学保研率是多少
  10. 推荐一个视频 Postive Psychology
  11. 初探微信小程序渗透测试
  12. 教程丨一文了解如何在OpenSea上创建自己的NFT商店
  13. 推荐一个专利检索的网站
  14. 聊聊大学室友在 TikTok 的工作和生活体验
  15. 初识Linkage Mapper:从入门到实践
  16. 华硕win10键盘失灵_win10系统下电脑键盘失灵怎么解决
  17. 硬件原理图设计规范(二)
  18. Python小记 正则
  19. win10电脑添加惠普打印机,实现远程打印。
  20. 整理 酷炫 Android 开源UI框架 其他

热门文章

  1. php 获取对象所有成员变量,PHP成员变量获取对比
  2. 单片机c语言位运算写法,单片机与嵌入式系统中C语言的位运算小记
  3. Java当中 IO(File) 操作 之 递归打印子孙级目录和文件名称
  4. mysql id 字段类型转换_mysql 数据类型转换
  5. [Redis6]新数据类型_Geospatial
  6. [Redis6]发布和订阅
  7. java 双击_利用java开发一个双击执行的小程序
  8. akb48_AKB48里历史——六年的终结
  9. Python--第3次平时作业
  10. 判别学习与生成学习的区别