[洛谷P3932]浮游大陆的68号岛
题目大意:有一行物品,每两个物品之间有一个距离。每个物品有一个价值。现在问你若干问题,每个问题问你把l~r所有物品全部搬到物品x处需要多少价值。
把物品a搬到物品b处的价值为物品a的价值乘a到b的距离。
解题思路:前缀和。
首先我们考虑$x<l<r$的情况。
发现答案为$\sum\limits ^{r}_{i=l} a[i]×dis(x,i)$。其中a[i]是第i个物品的价值,dis(x,i)表示x到i的距离。
首先我们容易想到用前缀和保存距离,即$dis[i]=\sum\limits^r _{i=2}p[i]$。p[i]表示i到i-1的距离。
但时间复杂度仍然很高,怎么办?
我们可以再用一个前缀和,用ds[i]保存第1到i个物品,每个物品到第一个物品的价值总和,即$ds[i]=\sum\limits^r_i=1 a[i]×dis[i]$。
那么ds[r]-ds[l-1]就表示l到r所有物品搬到1的价值,可是要求的是到x的距离,怎么办?
我们发现,这个答案多出来的其实是l到r所有物品搬dis[x]距离的价值,即多搬了1到x的距离。
那么就在答案中减去$\sum\limits^r _{i=l} a[i]×dis[x]=(\sum\limits^r_{i=l}a[i])×dis[x]$。
发现a[i]也可以用前缀和,那么我们令$sum[i]=\sum\limits^r _{i=1} a[i]$。
那么最后答案为$ds[r]-sd[l-1]+dis[x]×(sum[r]-sum[l-1])$。
当$l<r<x$时,可以用后缀和,然后求解即可。
当$l\leq x\leq r$时,我们把它分成两段,l~x-1和x+1~r,分别求解即可。
由于求解时间复杂度$O(1)$,求前缀和时间复杂度$O(n)$,所以总时间复杂度$O(n+m)$,在洛谷神机+O2下时间完全不是问题。
注意边算边模和long long(数组也要,不然答案就会莫名其妙地错误)。
C++ Code:
#include<cstdio>
#include<cctype>
using namespace std;
#define mod 19260817
#define N 200020
int n,m,a[N];
long long disl[N],disr[N],dsl[N],dsr[N],suml[N],sumr[N];
inline int readint(){
char c=getchar();
for(;!isdigit(c);c=getchar());
int d=0;
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return d;
}
inline long long ansL(int l,int r,int x){return((dsl[r]-dsl[l-1]+mod)%mod-(long long)disl[x]*((suml[r]-suml[l-1]+mod)%mod)%mod+mod)%mod;}
inline long long ansR(int l,int r,int x){return((dsr[l]-dsr[r+1]+mod)%mod-(long long)disr[x]*((sumr[l]-sumr[r+1]+mod)%mod)%mod+mod)%mod;}
int main(){
n=readint();
m=readint();
disl[1]=disr[n]=suml[0]=sumr[n+1]=0;
for(int i=2;i<=n;++i)disl[i]=(disl[i-1]+(a[i]=readint()%mod))%mod;
for(int i=n;i>1;--i)disr[i-1]=(disr[i]+a[i])%mod;
for(int i=1;i<=n;++i)suml[i]=(suml[i-1]+(a[i]=readint()%mod))%mod;
for(int i=n+1;i;--i)sumr[i]=(sumr[i+1]+a[i])%mod;
dsl[0]=dsr[n+1]=0;
for(int i=1;i<=n;++i)
dsl[i]=(dsl[i-1]+disl[i]*a[i]%mod)%mod;
for(int i=n;i;--i)
dsr[i]=(dsr[i+1]+disr[i]*a[i]%mod)%mod;
while(m--){
int x=readint(),l=readint(),r=readint();
if(l>r)l^=r^=l^=r;
if(x<l)printf("%d\n",(int)ansL(l,r,x));else
if(x>r)printf("%d\n",(int)ansR(l,r,x));else
printf("%d\n",(int)((ansR(l,x-1,x)+ansL(x+1,r,x))%mod));
}
return 0;
}
[洛谷P3932]浮游大陆的68号岛的更多相关文章
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
- P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下的人找到区间[l,r]储物点的所有东西,清点完 ...
- P3932 浮游大陆的68号岛 【线段树】
P3932 浮游大陆的68号岛 有一天小妖精们又在做游戏.这个游戏是这样的. 妖精仓库的储物点可以看做在一个数轴上.每一个储物点会有一些东西,同时他们之间存在距离. 每次他们会选出一个小妖精,然后剩下 ...
- [Luogu3932] 浮游大陆的68号岛
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...
- noip模拟赛 浮游大陆的68号岛
题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无虑的,幼体的黄金妖精们过着天真烂 ...
- LuoguP3932 浮游大陆的68号岛 题解
Content 在一个无限长的数轴上有 \(n\) 个点.第 \(i\) 个点上面有 \(a_i\) 件物品,且第 \(i\) 个点到第 \(i+1\) 个点的距离为 \(b_i\). 定义从第 \( ...
- 洛谷 P2184 贪婪大陆 解题报告
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小\(FF\)的\(Tower\) \(defence\)宣告失败--人类被蚂蚁们逼到了\(Greed\) \(Island\)上的一个海湾.现在 ...
- 洛谷 P2446 [SDOI2010]大陆争霸 解题报告
P2446 [SDOI2010]大陆争霸 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭的神曾·布拉 ...
- 洛谷——P2446 [SDOI2010]大陆争霸
https://www.luogu.org/problem/show?pid=2446#sub 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别 ...
随机推荐
- css文字换行问题white-space:pre-line或者white-space:pre-wrap,解决word-wrap:break-word解决不了的
想让文字换行必须要写的那几个css样式就略过了.当一行文字是数字或字母时或者数字字母组合时会出现不换行局面,这时候加个word-wrap:break-word:就基本可以解决但是有种情况是它解决不了的 ...
- POJ 2029 Get Many Persimmon Trees 【 二维树状数组 】
题意:给出一个h*w的矩形,再给出n个坐标,在这n个坐标种树,再给出一个s*t大小的矩形,问在这个s*t的矩形里面最多能够得到多少棵树 二维的树状数组,求最多能够得到的树的时候,因为h,w都不超过50 ...
- windows2008搭建ftp服务器
控制面板 操作—〉添加角色 (web,文件服务) windows 搜索中: 添加ftp站点: 计算机---管理 –服务器管理 --- 添加一个用户 ,密码. 防护墙高级设置中添加 出入站规则 允许2 ...
- 如何使用 Open Live Writer 插入原图
博客园的指南里写了使用 Open Live Writer 插入原图.去掉阴影并设置为默认设置的步骤,但是我还是找了好久,最后通过别的文章加上摸索才知道了如何设置为原图.这里给出详细地图片: 首先,插入 ...
- 不实例化一个 class 的时候使用它的property
class A: @property def name(self): " print(A.name) # <property object at 0x10d54cf98> cla ...
- [agc011e]increasing numbers
题意: 如果一个十进制非负整数的所有数位从高位到低位是不减的,我们称它为“上升数”,例如1558,11,3,0都是上升数,而10,20170312则不是: 给定整数N,求最小的k使得N能被表示为k个上 ...
- vue-cli3+typescript+路由懒加载报错问题
vue-cli3的版本是3.4.1 出现的情况是网页显示正常,但是终端一直提示找不到模块: 如果去掉路由懒加载的方式,就没有报错: 原因是以前我们习惯直接写文件名而不加后缀, 现在使用ts时就需要写v ...
- java 导出百万数据到excel
@RequestMapping("export") public void write(HttpServletRequest request,HttpServletResponse ...
- centos7 jumpserver 部署和使用手册(一)
测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7.2 IP: 192 ...
- PatentTips - Controlling voltage and frequency
BACKGROUND OF THE INVENTION Mobile devices, such as but not limited to personal data appliances, cel ...