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. CSS技术让高度自适应减少很多不必要的检测

    高度自适应第一种情况 1.高度不去设置,或者高度设置auto 内容撑开父元素的高度.2.内容撑开父元素的高度 -> 最小高度的设置 min-height3.浮动元素添加高度自适应 -> 添 ...

  2. LeetCode 哈希表 380. 常数时间插入、删除和获取随机元素(设计数据结构 List HashMap底层 时间复杂度)

    比起之前那些问计数哈希表的题目,这道题好像更接近哈希表的底层机制. java中hashmap的实现是通过List<Node>,即链表的list,如果链表过长则换为红黑树,如果容量不足(装填 ...

  3. 一文搞定 Spring Data JPA

    Spring Data JPA 是在 JPA 规范的基础上进行进一步封装的产物,和之前的 JDBC.slf4j 这些一样,只定义了一系列的接口.具体在使用的过程中,一般接入的是 Hibernate 的 ...

  4. django开发自动化测试平台简介

    Django的优点 1:功能完善.要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站. 2:完善的文档:经过十多年的发展和完善,Django有广泛的实践案例和完 ...

  5. python学习笔记之数据类型(二)

    上一篇博客,小波介绍了python的入门和简单流程控制,这次写python的数据类型和各种数据类型的内置方法. 一.数据类型是何方神圣? 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当 ...

  6. Zip破解工具Fcrackzip使用简介

    0x00 fcrackzip简单介绍 fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便.破解速度快,能使用字典和指定字符集破解,适用于linux.mac osx 系统 0x0 ...

  7. Django---进阶3

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

  8. flask 源码专题(四):wtforms Form实例化流程以及csrf验证

    class LoginForm(Form): #首先执行后得到的结果是UnboundField()对象 name=simple.StringField( label='用户名', validators ...

  9. 数据可视化之powerBI入门(八)PowerQuery学习:认识M函数

    https://zhuanlan.zhihu.com/p/64148928 前面我们学习PQ的时候都是用鼠标操作,虽然通过这些操作能完成大部分的数据处理,但是毕竟还有些复杂的工作是处理不了的,如果想彻 ...

  10. 01 flask源码剖析之werkzurg 了解wsgi

    01 werkzurg了解wsgi 目录 01 werkzurg了解wsgi 1. wsgi 2. flask之werkzurg源码流程 3. 总结 1. wsgi django和flask内部都没有 ...