CF 878E Numbers on the blackboard 并查集 离线 贪心
LINK:Numbers on the blackboard
看完题觉得很难。
想了一会发现有点水 又想了一下发现有点困难。
最终想到了 但是实现的时候 也很难.
先观察题目中的这个形式 使得前后两个数字变成x+2y.
那么一个数字的变成两倍的次数固定 除了左端点至少可以变化一次.
有些数字 可以变换多次 这取决于什么 容易考虑到右端点 先变化一次 如果>0显然 可以和其左边进行合并一下.
然后 可以变换更多次 然后从右到左考虑这个过程就发现是正确的了.
这样 我们得到了一个nm的做法.
容易发现这个东西不具有区间可加性 所以不能采用线段树来维护这个东西.
不过这个过程是从左到右做的 考虑离线处理这个问题.
对于每个右端点处理左端点 显然中间的合并过程可以单调栈做一下.
考虑计算答案 单调栈存一个前缀和 然后在左端点所在区间内 再求一下值即可.
这个值可以利用线段树来做 当然也可以不需要 倒着预处理的后缀和就可以了.
一个难点是 比大小的时候可能会爆long long 这里可以预估一个INF 来防止爆掉.
也算是常见套路吧. 代码写的比较丑 因为 状态相当的不好.
const ll MAXN=100010;
ll n,m,cnt,top;
ll a[MAXN],ans[MAXN],f[MAXN],l[MAXN],r[MAXN],s[MAXN],id[MAXN];
ll qz[MAXN],hz[MAXN],mi[MAXN],INV[MAXN],w[MAXN],fac[MAXN],c[MAXN];
struct wy
{
ll id;
ll l,r;
}t[MAXN];
inline ll inv(ll x)
{
return x==1?x:inv(mod%x)*(mod-mod/x)%mod;
}
inline ll cmp(wy a,wy b){return a.r<b.r;}
inline int getfather(int x){return x==f[x]?x:f[x]=getfather(f[x]);}
inline ll ksm(ll b,ll p)
{
ll cnt=1;
while(p)
{
if(p&1)cnt=cnt*b%mod;
b=b*b%mod;p=p>>1;
}
return cnt;
}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(m);mi[0]=1;fac[0]=1;
rep(1,n,i)get(a[i]),l[i]=r[i]=f[i]=i,fac[i]=fac[i-1]*2%mod,mi[i]=min(mi[i-1]*2,INF);
INV[n]=inv(fac[n]);hz[n]=a[n]*2%mod;
fep(n-1,0,i)INV[i]=INV[i+1]*2%mod,hz[i]=(hz[i+1]+a[i])*2%mod;
rep(1,m,i)
{
ll l,r;
get(l);get(r);
ans[i]=a[l];
if(l==r)continue;
t[++cnt]=(wy){i,l+1,r};
}
sort(t+1,t+1+cnt,cmp);
ll flag=1;s[++top]=1;qz[top]=w[top]=a[1];id[1]=1;
rep(2,n,i)
{
//当前端点向右移动.
ll fa=i;ll ww=a[i]*2,ss=a[i]*2;
while(top!=1&&ww>0)
{
if(ww!=INF)//更新当前块的比较值.
{
if(mi[(r[s[top]]-l[s[top]]+1)]==INF)ww=INF;
else
{
if(ww>=(INF-1)/mi[(r[s[top]]-l[s[top]]+1)]+1)ww=INF;
else ww=ww*mi[(r[s[top]]-l[s[top]]+1)];
}
}
ss=ss*fac[(r[s[top]]-l[s[top]]+1)]%mod;
if(ww!=INF)ww=min(INF,ww+w[top]);
f[fa]=s[top];ss=(ss+qz[top]-qz[top-1]+mod)%mod;
r[s[top]]=r[fa];fa=s[top];--top;
}
s[++top]=fa;qz[top]=(qz[top-1]+ss)%mod;w[top]=ww;id[fa]=top;
while(flag<=cnt&&t[flag].r==i)
{
ll xx=getfather(t[flag].l);
ans[t[flag].id]=(ans[t[flag].id]+qz[top]-qz[id[xx]]+mod)%mod;
ww=hz[t[flag].l]-hz[r[xx]+1]*fac[r[xx]+1-t[flag].l];
ans[t[flag].id]=(ans[t[flag].id]+ww)%mod;
++flag;
}
}
rep(1,m,i)putl((ans[i]+mod)%mod);
return 0;
}
CF 878E Numbers on the blackboard 并查集 离线 贪心的更多相关文章
- 【CF878E】Numbers on the blackboard 并查集
[CF878E]Numbers on the blackboard 题意:给你一个长度为n个数列,你每次可以进行如下操作: 选取两个相邻的数x,y(x在y左面),然后将这两个数去掉,用x+2y替换它. ...
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理
BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...
- poj 2528 Mayor's posters 线段树 || 并查集 离线处理
题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...
- ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)
Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...
- CF 500 B. New Year Permutation 并查集
User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to make his permut ...
- CF # 296 C Glass Carving (并查集 或者 multiset)
C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CF 452E. Three strings(后缀数组+并查集)
传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...
- CF722C. Destroying Array[并查集 离线]
链接:Destroying Array C. Destroying Array time limit per test 1 second memory limit per test 256 megab ...
随机推荐
- UVA11383 Golden Tiger Claw KM算法
题目链接:传送门 分析 这道题乍看上去没有思路,但是我们仔细一想就会发现这道题其实是一个二分图最大匹配的板子 我们可以把这道题想象成将男生和女生之间两两配对,使他们的好感度最大 我们把矩阵中的元素\( ...
- Spring 5.2.x 源码环境搭建(Windows 系统环境下)
前期准备 1.确保本机已经安装好了 Git 2.Jdk 版本至少为 1.8 3.安装好 IntelliJ IDEA (其他开发工具,如 eclipse.Spring Tool Suite 等也是可以的 ...
- Linux多任务编程之六:编写多进程程序及其代码(转)
来源:CSDN 作者:王文松 转自Linux公社 ------------------------------------------------------------------------- ...
- 从0开始,手把手教你开发并部署上线一个知识测验微信小程序
上线项目演示 微信搜索[放马来答]或扫以下二维码体验: 项目源码 项目源码 其他版本 Vue答题App实战教程 Hello小程序 1.注册微信小程序 点击立即注册,选择微信小程序,按照要求填写信息 2 ...
- day50 前端入门
目录 一.引子 1 前端学习的历程 2 浏览器与http协议 2.1 浏览器窗口输入网址回车后发生了几件事 2.2 http协议 二.html入门 1 标签的分类 2 head内常用的标签 3 bod ...
- day05 垃圾回收机制(超小白讲解)
垃圾回收机制 在学习这个抽象概念前,老习惯,灵魂二问 什么是?为什么要有? 引言:在程序运行到变量定义时,会在内存空间中存放变量值,然而内存空间是有限的,变量是无限的. Q:如何在有限的内存里存里存放 ...
- day35 作业
服务端 import subprocess import struct import json from socket import * server = socket(AF_INET, SOCK_S ...
- 数据可视化之DAX篇(二十)Think in DAX 之报表自动化实践
https://zhuanlan.zhihu.com/p/107672198 本文来自星友袁佳林的实践分享,他参加了PowerBI星球中的DAX圣经第二版100天学习打卡活动,已持续分享近100天, ...
- 数据可视化之分析篇(六)使用Power BI进行流失客户分析
https://zhuanlan.zhihu.com/p/73358029 为了提升销量,在不断吸引新客户的同时,还要防止老客户离你而去,但每一个顾客不可能永远是你的客户,不可避免的都会经历新客户.活 ...
- 从零搭建Spring Cloud Gateway网关(三)——报文结构转换
背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...