codechef FNCS-程序员宅基地

技术标签: 数据结构与算法  

题意:一个数列a,若干个函数,每个函数j=sigma(a[i]),l[j]<=i<=r[j]。

op1:修改数列a中x位置元素为y。op2:求L~R的函数和。n<=1e5。

 

标程:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned long long ll;
 4 int read()
 5 {
 6    int x=0,f=1;char ch=getchar();
 7    while (ch<'0'||ch>'9') {
    if (ch=='-') f=-1;ch=getchar();}
 8    while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 9    return x*f;
10 }
11 const int N=100005;
12 int n,blo,a[N],l[N],r[N],b[320][N],q,x,y,op;
13 ll sum[N],k1[N],k2[N],s[N];
14 
15 int trans1(int x){
    return x>blo*blo?blo:(x-1)/blo+1;}//所在块 
16 int trans2(int x){
    int t=trans1(x);return t==blo?n:t*blo;}//所在块的右端点 
17 
18 void modi(int pos,int x)
19 {
20     for (int i=trans1(pos);i<=blo;i++) k1[i]+=x;
21     for (int i=pos,t=trans2(pos);i<=t;i++) k2[i]+=x;
22 }
23 
24 ll qry(int x){
25     return s[x]+k1[trans1(x)-1]+k2[x];
26 }
27 
28 ll calc(int x)
29 {
30     ll res=0;int id=trans1(x);
31     for (int i=1;i<id;i++) res+=sum[i];
32     for (int i=(id-1)*blo+1;i<=x;i++) res+=qry(r[i])-qry(l[i]-1);
33     return res;
34 }
35 
36 int main()
37 {
38     n=read();blo=(int)sqrt(n);
39     for (int i=1;i<=n;i++) a[i]=read(),s[i]=(ll)s[i-1]+a[i];
40     for (int i=1;i<=n;i++) l[i]=read(),r[i]=read();
41     
42    for (int i=1;i<=blo;i++)
43    {
44        int bl=(i-1)*blo+1,br=(i==blo)?n:i*blo;
45        for (int j=bl;j<=br;j++) b[i][l[j]]++,b[i][r[j]+1]--;
46        for (int j=1;j<=n;j++) b[i][j]+=b[i][j-1];
47        for (int j=1;j<=n;j++) sum[i]+=(ll)b[i][j]*a[j];
48     }
49     
50     q=read();
51     while (q--)
52     {
53         op=read();x=read();y=read();
54         if (op==1)
55         {
56             for (int i=1;i<=blo;i++) sum[i]+=(ll)b[i][x]*(y-a[x]);
57          modi(x,y-a[x]);a[x]=y;
58         }else printf("%llu\n",calc(y)-calc(x-1));
59     }
60    return 0;
61 }

 

易错点:1.没有开ll挂了90分。不要以为ll是小问题。

2.还要unsigned long long。

3.注意左右端点,尤其是最后一块。写个trans函数比较直观。

 

题解:分块+块链

对函数进行分块,每一块维护每个数列元素的需统计次数以及sum。(每个元素的出现次数可以用差分+前缀和)。

查询的时候整块暴力统计sum,零碎的直接统计即可。

零碎的统计要支持修改和区间查询,树状数组(插入查询O(logn)),块链(插入O(sqrt(n)),查询O(1))都行。块链,就是对原数列分块,统计大块的前缀和,对于每个块统计内部元素的前缀和。

转载于:https://www.cnblogs.com/Scx117/p/9080957.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/b121382291/article/details/102357505

智能推荐

cpplint 集成到visual studio中_cpplint vs-程序员宅基地

文章浏览阅读3.6k次。1. 建议安装python2, python3可能会有问题。cpplint.py integration cpplint.py integration makes it easy to check that a source file conforms to the style guide. To do this, just go to Tools > External Tools_cpplint vs

a simple cmdline implementation method--structure define_c# cmdline structure-程序员宅基地

文章浏览阅读223次。structure define:the major structure consist of cmdline_param_t and cmdline_instance_t.//parameter of cmdlinetypedef struct{ /_c# cmdline structure

RIME-CNN-LSTM-Multihead-Attention 基于雾凇算法优化多头注意力机制的卷积长短记忆神经网络实现风电预测附MATLAB代码_基于注意力机制的风速预测模型-程序员宅基地

文章浏览阅读984次,点赞19次,收藏26次。在当今社会,风电预测在能源行业中扮演着重要的角色。准确地预测风电的产量可以帮助能源公司更好地规划发电和储能,从而提高能源利用效率。为了提高风电预测的准确性,研究人员一直在努力寻找更加先进的预测模型和算法。最近,基于雾凇算法优化多头注意力机制的卷积长短记忆神经网络RIME-CNN-LSTM-Multihead-Attention成为了研究的焦点。RIME-CNN-LSTM-Multihead-Attention是一种结合了卷积神经网络(CNN)、长短记忆神经网络(LSTM)和多头注意力机制的预测模型。_基于注意力机制的风速预测模型

redis 失效时间单位是秒还是毫秒_Redis 事务与过期时间详细介绍-程序员宅基地

文章浏览阅读1.2k次。Redis 事务与过期时间详细介绍一、Redis事务:Redis中支持事务,事务即为当我们需要执行几条命令时,要么这几条命令都不执行,要么都执行:1、开始事务写入:multi2、然后写入命令,注意写完事务要执行的每条命令之后回车即可,命令会自动入队:lpush art:1 hellolpush art:1 nihao3、执行事务:execRedis则会保证事务中的所有命令要么都执行,要么都..._redis ex 17280000 为多长时间?

iptables基础知识详解_iptables -a forward -i wg0 -j accept-程序员宅基地

文章浏览阅读333次。iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有效的管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工作原理,你会发现其实它很简单。 首先介绍iptables的结构:iptables->Tables->Chains->R_iptables -a forward -i wg0 -j accept

android不让程序显示在最近程序列表中_android如何让拥有system权限的launch不让出现在最近任务里-程序员宅基地

文章浏览阅读6.8k次。Android:excludeFromRecents属性用于控制程序在不在recent列表中显示。true时不显示;false显示,其中false为默认值。运行如下activity后,不会显示在recent列表中。程序正在运行或者退出,在长按HOME键的最近程序列表中不显示该应用以达到隐藏进程的目的。解决办法如下:在主activity处设置属性:android:_android如何让拥有system权限的launch不让出现在最近任务里

随便推点

SAX解析与DOM解析_sax dom-程序员宅基地

文章浏览阅读629次。SAX解析sax解析需要继承DefaultHandler类,并且重写其中的几个方法。public class MyHandler extends DefaultHandler { private ArrayList<String> ids=new ArrayList<>(); private ArrayList<String> names = new ArrayList<>(); private ArrayList<St_sax dom

计算机主机清洁方法,电脑主机除尘清洁板卡维护方法及注意事项 - 主板知识-程序员宅基地

文章浏览阅读1.9k次。电脑时间用久了,主机内就容易积累灰尘,灰尘过多就会导致主板上各种部件接触不良,这也是很多朋友长时间不清理主机内部而常常出现各种故障的原因。所以电脑主机清灰电脑清洁对于延长电脑使用寿命是很重要的,还需要注意的是主机内主板和显卡的维护,对于电脑性能的保持也是至关重要。下面介绍计算机常用的维护工具、维护注意事项、主机箱内各部分连线的拆除、机箱内部除尘及板卡的常规维护方法。1.维护工具电脑维护不需要很复杂..._用清洗剂清洗电脑主机

在计算机中添加用户时提示拒绝访问,安装设备驱动时驱动提示错误“拒绝访问”的解决办法...-程序员宅基地

文章浏览阅读2.6k次。现象:安装打印机驱动时系统出现错误提示:Windows 安装设备的驱动程序软件时遇到一个问题、Windows 已找到设备的驱动程序软件,但在试图安装它时遇到错误“拒绝访问”。(如下图)问题分析:此故障多数是由于防火墙或杀毒软件引起的,我们可以先暂时退出杀毒软件并关闭防火墙和其它程序后再次安装,等安装结束后再开启。解决方法:1、关闭系统防火墙及防火墙服务①、打开 [控制面板] 选择 [系统和安全]②..._在计算机上创建用户时,拒绝访问

谷歌小恐龙修改无敌刷分_和小恐龙跳跳乐如何改变速度-程序员宅基地

文章浏览阅读6.5k次,点赞2次,收藏5次。小恐龙的F12_和小恐龙跳跳乐如何改变速度

Java实现秒杀功能数据库设计架构设计实现步骤-程序员宅基地

文章浏览阅读6k次,点赞8次,收藏4次。本文介绍了如何使用Java语言实现秒杀功能。通过合理的架构设计和数据库设计,结合缓存、消息队列等技术,可以实现高并发、稳定可靠的秒杀系统。当然,在实际开发过程中还需要考虑安全性、性能优化等方面的问题,但本文所提供的步骤可以作为一个基本的参考。希望本文对你有所帮助!学习教程(传送门)1、掌握JAVA入门到进阶知识(持续写作中……2、学会Oracle数据库用法(创作中……3、手把手教你vbs脚本制作(完善中……4、牛逼哄哄的IDEA编程利器(编写中……5、吐血整理的面试技巧(

Windows下U盘无法格式化原因及解决办法:Windows无法完成格式化-程序员宅基地

文章浏览阅读4.8w次,点赞35次,收藏116次。通常,格式化过程可以通过Windows文件资源管理器、磁盘管理或Diskpart命令顺利进行,但有时会遇到Windows无法格式化U盘的情况。U盘和其他存储设备都是由许多的扇区组成的,扇区是数据存储的单位。坏扇区是指扇区已损坏且无法读取或写入,因此可能会中断格式化过程。但是可能由于不同的原因导致U盘被写保护无法格式化,例如物理锁定、设置为只读模式、错误的注册表设置或损坏的文件系统。在这种情况下,您可以使用可靠的防病毒工具来删除恶意软件或病毒的攻击。..._windows无法完成格式化