【CF878E】Numbers on the blackboard 并查集
【CF878E】Numbers on the blackboard
题意:给你一个长度为n个数列,你每次可以进行如下操作:
选取两个相邻的数x,y(x在y左面),然后将这两个数去掉,用x+2y替换它。
重复此操作直到序列中只有一个数为止。你可以任意决定每次合并哪两个数,求最后得到的数的最大值。
为了加大难度,现有q次询问,每次询问给出l,r,问你对[l,r]这段区间进行操作能得到的最大值是什么。
n,q<=100000,ai<=10^9
题解:先不考虑l,r的限制,整个操作可以看成:让你最大化$\sum a_i\times 2^{k_i},k_0=0,1<=k_i<=k_{i-1}+1$。我们从左往右逐个加入每个数,如果ai是负数,我们直接令$k_i=1$;否则我们令$k_i=k_{i-1}+1$。这样的话最终得到的k一定是分为若干段,每段(除了第一段)都是开头的k=1,然后k不断++。我们还需要判断:在加入ai后,如果最后一段合并之后的和变成了正数,那么还要将最后一段整体向前合并,直到和为负数为止。
如果考虑l,r呢?我们可以离线,对于r=i,我们用并查集找到l所在的块,然后统计一下答案即可。
在判断一个块内合并后总和是否是正数时要讨论一下。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
#define mp(A,B) make_pair(A,B)
typedef long long ll;
const ll P=1000000007;
const ll inv=500000004;
const int maxn=100010;
int n,m;
int f[maxn],pre[maxn];
ll v[maxn],s[maxn],sum[maxn],ans[maxn],pw[maxn],sp[maxn];
vector<pair<int,int> > q[maxn];
vector<pair<int,int> >::iterator it;
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
inline void merge(int a,int b)
{
if((a-pre[a]>31&&sum[b]>0)||sum[a]+(sum[b]<<(a-pre[a]))>P) sum[b]=P;
else sum[b]=sum[a]+(sum[b]<<(a-pre[a]));
f[a]=f[b],pre[b]=pre[a];
}
inline ll query(int a,int b)
{
return (s[a]-s[b+1]*pw[b-a+1]%P+P)%P;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,a,b;
for(pw[0]=i=1;i<=n;i++) f[i]=i,pre[i]=i-1,v[i]=rd(),pw[i]=(pw[i-1]<<1)%P;
for(i=n;i>=1;i--) s[i]=((s[i+1]<<1)+v[i]+P)%P;
for(i=1;i<=m;i++) a=rd(),b=rd(),q[b].push_back(mp(a,i));
for(i=1;i<=n;i++)
{
sum[i]=v[i];
while(pre[i]&&sum[i]>=0) merge(pre[i],i);
sp[i]=(sp[pre[i]]+(query(pre[i]+1,i)<<1))%P;
for(it=q[i].begin();it!=q[i].end();it++)
{
a=(*it).first,b=find(a);
ans[(*it).second]=(sp[i]-sp[b]+query(a,b)+P)%P;
}
}
for(i=1;i<=m;i++) printf("%I64d\n",ans[i]);
return 0;
}
【CF878E】Numbers on the blackboard 并查集的更多相关文章
- CF 878E Numbers on the blackboard 并查集 离线 贪心
LINK:Numbers on the blackboard 看完题觉得很难. 想了一会发现有点水 又想了一下发现有点困难. 最终想到了 但是实现的时候 也很难. 先观察题目中的这个形式 使得前后两个 ...
- Codeforces 878 E. Numbers on the blackboard
Codeforces 878 E. Numbers on the blackboard 解题思路 有一种最优策略是每次选择最后面一个大于等于 \(0\) 的元素进行合并,这样做完以后相当于给这个元素乘 ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- POJ1703Find them, Catch them[种类并查集]
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42416 Accepted: ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- *HDU1829 并查集
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- [并查集] POJ 1703 Find them, Catch them
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43132 Accepted: ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
随机推荐
- java中*和**的作用
“*”就表示了所有的文件,但是“*”并不包括子目录下的文件: “**”匹配包含任意级子目录中所有的文件
- 备忘录:在alpine上安装kvm
原文: https://wiki.alpinelinux.org/wiki/KVM KVM is an open source virtualization solution in a ke ...
- 小企业是否能用得上"ITIL"?
在小型IT部门中,明显存在着迫切的IT管理需求.但目前主流ITSM解决方案的价格.实施周期.复杂程度.对人力资源的占用等使他们难以承受. 浦发机械公司的计算机部经理老张带着十几个员工,经过数年 ...
- 源码分析一(Iterator、Collection以及List接口)
1:Iterable接口,实现这个接口的类对象可以进行迭代 package java.lang; import java.util.Iterator; /** * 实现这个接口的类所创建的对象可以进行 ...
- YII创建应用
创建第一个应用 打开cmd,切换到appserv的www目录下,输入: D:\AppServ\www>yii6\framework\yiic webapp D:wamp\www\mydemos
- JSON未定义
用ajax实现了一个功能,在IE8和IE9中都能正常运行(大概是IE8和IE9都提供了原生的JSON解析和序列化),但是一旦切换到兼容模式就报JSON未定义的错误,解决方法是:判断当前浏览器是否支持J ...
- WIN7隐藏GUEST登录账户
在Windows7中,我们有时候需要开启Guest用户,以方便给别的同事共享打印机和部分文件,但同时又不希望别人用Guest账号从本地登陆界面进入本机.这个时候就需要将本地登陆界面的Guest用户进行 ...
- js合并.css合并工具
http://www.neoease.com/css-javascript-combo-tool/ http://www.neoease.com/minimize-javascript-files-u ...
- iOS iTuns Connect官方配置教程
iTunes Connect 开发者指南 (iTunes Connect Developer Guide): https://developer.apple.com/library/ios/docum ...
- 在oracle配置mysql数据库的dblink
本文介绍如何在oracle配置mysql数据库的dblink:虽然dblink使用很占资源:俗称“性能杀手”.但有些场景不得不使用它.例如公司使用数据库是oracle:可能其他部门或者CP合作公司使用 ...