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 并查集 离线 贪心的更多相关文章

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

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

  2. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  3. BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理

    BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...

  4. poj 2528 Mayor's posters 线段树 || 并查集 离线处理

    题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...

  5. ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)

    Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...

  6. 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 ...

  7. CF # 296 C Glass Carving (并查集 或者 multiset)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. CF 452E. Three strings(后缀数组+并查集)

    传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...

  9. CF722C. Destroying Array[并查集 离线]

    链接:Destroying Array C. Destroying Array time limit per test 1 second memory limit per test 256 megab ...

随机推荐

  1. 转载--- 写给Node.js学徒的7个建议

    贴士 1: 在开发环境使用nodemon,在生产环境使用pm2 当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样. 当我第一次开发的node ...

  2. 自适应高度输入框(contenteditable/textarea)

      一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...

  3. JAVA的8种基本数据类型分析

    基本数据类型(8个) 1.整数类型(4个)   字节个数 取值范围 byte(字节) 1(8位) -2^7~2^7-1 short(短整型) 2(16位) -2^15~2^15-1 int(整形) 4 ...

  4. mysql逗号分隔问题

    1.说明: 之前写了一个发先了有点问题, 用正则去匹配的会匹配多了数据,所以优化下 媒资表(asset_baseinfo)里面有地区,如下,如果一个节目包含多个地区,id存在如下 地区表(produc ...

  5. Django---进阶3

    目录 无名有名分组反向解析 路由分发 名称空间(了解) 伪静态(了解) 虚拟环境(了解) django版本区别 视图层 三板斧 JsonResponse对象 form表单上传文件及后端如何操作 req ...

  6. day02 java学习

    Java三大版本 Write once,Run anywhere. (基于JVM虚拟机) JavaSE 标准版 JavaME 嵌入式开发 JavaEE 企业级开发 Java三大名词 JDK Java开 ...

  7. 数据可视化基础专题(三):Pandas基础(二) csv导入与导出

    1.csv导入 1.1 csv导入 .read_csv()函数 pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~Any ...

  8. 数据可视化之 图表篇(二)如何用Power BI制作疫情地图?

    丁香园制作的这个地图可视化,相信大家每天都会看好几遍,这里不讨论具体数据,仅来探讨一下PowerBI地图技术. 这个地图很简洁,主要有三个特征: 1,使用着色地图,根据数据自动配色 2,只显示中国地图 ...

  9. Mysql and ORM

    本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...

  10. 【Nginx】如何按日期分割Nginx日志?看这一篇就够了!!

    写在前面 Nginx是没有以日期格式作为文件名来存储的,也就是说,Nginx不像Tomcat,每天自动生成一个日志文件,所有的日志都是以一个名字来存储,时间久了日志文件会变得很大.这样非常不利于分析. ...