首页 > 其他分享 >hdu4348(主席树区间修改)

hdu4348(主席树区间修改)

时间:2024-05-22 12:40:08浏览次数:25  
标签:rs int sum ql 修改 区间 include hdu4348 define

Problem - 4348 (hdu.edu.cn)
Background
To The Moon是一款独立游戏,于2011年11月发布,是一款由RPG Maker提供支持的角色扮演冒险游戏。
《去月球》的前提是基于一种技术,该技术使我们能够永久地重建垂死之人的记忆。在这个问题上,我们将给你一个机会,实现幕后的逻辑。

您已经获得了 N 个整数 A[1]、A[2],..., A[N]。在这些整数上,您需要实现以下操作:
1. C l r d:为每个 {Ai | l <= i <= r} 添加一个常量 d,并将时间戳增加 1,这是唯一会导致时间戳增加的操作。
2. Q l r:查询 {Ai | l <= i <= r} 的当前和。
3. H l r t:查询时间 t.4
中 {Ai | l <= i <= r} 的历史总和。B t:回到时间 t。一旦你决定回到过去,你就再也无法访问前期版本了。
..N, M ≤ 105, |答[i]|≤ 109, 1 ≤ l ≤ r ≤ N, |d|≤ 104 ..系统从时间 0 开始,第一次修改是在时间 1 t≥ 0,并且不会将您引入未来状态。

输入

n m
A1 A2 ...一个n
...(此处遵循 M 操作。

输出

...(对于每个查询,只需打印结果即可。

思路

使用主席树处理版本控制。由于涉及到区间修改,考虑使用懒标记,在区间更新的时候顺带求出区间和,避免传递懒标记可以节省时间,实测500多ms跑完。

  1 #define IO std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  2 #define bug(x) cout<<#x<<" is "<<x<<endl
  3 #include <iostream>
  4 #include <list>
  5 #include <unordered_map>
  6 #include <map>
  7 #include <vector>
  8 #include <sstream>
  9 #include <cmath>
 10 #include <algorithm>
 11 #define iter ::iterator
 12 using namespace  std;
 13 typedef long long ll;
 14 typedef pair<int,int>P;
 15 #define pb push_back
 16 #define mk make_pair
 17 #define se second
 18 #define fi first
 19 const ll mod=1e9+7;
 20 const int N=1e5+5;
 21 int n,q;
 22 int a[N],rt[N*25],ls[N*25],rs[N*25];
 23 ll sum[N*25],add[N*25];
 24 int cnt;
 25 void build(int &o,int l,int r){
 26     o=++cnt;
 27     if(l==r){
 28         sum[o]=a[l];
 29         return;
 30     }
 31     int m=(l+r)/2;
 32     build(ls[o],l,m);
 33     build(rs[o],m+1,r);
 34     sum[o]=sum[ls[o]]+sum[rs[o]];
 35 }
 36 void up(int &o,int pre,int l,int r,int ql,int qr,int val){
 37     o=++cnt;
 38     ls[o]=ls[pre];
 39     rs[o]=rs[pre];
 40     add[o]=add[pre];
 41     sum[o]=sum[pre]+1ll*val*(min(r,qr)-max(l,ql)+1);
 42     if(l>=ql&&r<=qr){
 43         add[o]+=val;
 44         return;
 45     }
 46     int m=(l+r)/2;
 47     if(ql<=m)up(ls[o],ls[pre],l,m,ql,qr,val);
 48     if(qr>m)up(rs[o],rs[pre],m+1,r,ql,qr,val);
 49 
 50 }
 51 ll qu(int o,int l,int r,int ql,int qr){
 52     if(l>=ql&&r<=qr)return sum[o];
 53     ll res=add[o]*(min(r,qr)-max(l,ql)+1);
 54     int m=(l+r)/2;
 55     if(ql<=m)res+=qu(ls[o],l,m,ql,qr);
 56     if(qr>m)res+=qu(rs[o],m+1,r,ql,qr);
 57     return res;
 58 }
 59 int main(){
 60     while(~scanf("%d%d",&n,&q)){
 61         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
 62         cnt=0;
 63         build(rt[0],1,n);
 64         int time=0;
 65         while(q--){
 66             char op;
 67             int L,R,val;
 68             scanf(" %c",&op);
 69             if(op=='Q'){
 70                 scanf("%d%d",&L,&R);
 71                 ll ans=qu(rt[time],1,n,L,R);
 72                 printf("%lld\n",ans);
 73             }
 74             else if(op=='C'){
 75                 scanf("%d%d%d",&L,&R,&val);
 76                 ++time;
 77                 up(rt[time],rt[time-1],1,n,L,R,val);
 78                 
 79             }
 80             else if(op=='H'){
 81                 scanf("%d%d%d",&L,&R,&val);
 82                 ll ans=qu(rt[val],1,n,L,R);
 83                 printf("%lld\n",ans);
 84             }
 85             else{
 86                 scanf("%d",&val);
 87                 time=val;
 88             }
 89         }
 90         printf("\n");
 91     }
 92 
 93 }
 94 /*
 95 10 100
 96 1 2 3 4 5 6 7 8 9 10
 97 Q 1 10
 98 C 3 6 3
 99 Q 1 10
100 Q 4 4
101 Q 1 10
102 Q 2 4
103 C 3 6 3
104 Q 2 4
105 */

 

   

标签:rs,int,sum,ql,修改,区间,include,hdu4348,define
From: https://www.cnblogs.com/ccsu-kid/p/18206026

相关文章

  • Oracle用户密码修改为永不过期
    Oracle用户密码修改为永不过期1、查询密码有效时长select*fromdba_profileswhereprofile='DEFAULT'andresource_name='PASSWORD_LIFE_TIME';没有修改的话LIMIT是1802、查看用户密码过期时间selectusername,account_status,expiry_date,profilefromdba_users;3、修改......
  • 记一次MySQL执行修改语句超时问题
    异常问题原因分析这个问题发生在开发环境,怀疑是提交事务时终止项目运行,没有提交该事务,造成死锁调试该事务时时间太长,为什么说有这个原因呢,因为通过查找日志显示Theclientwasdisconnectedbytheserverbecauseofinactivity.Seewait_timeoutandinteractive_timeo......
  • centos7.6忘记密码如何修改
     如果您忘记了CentOS7.6系统的root密码,可以按照以下步骤来重置密码:重启系统,在启动时进入GRUB菜单。在启动选项列表中选择要启动的内核,然后按e键编辑启动参数。找到以linux16开头的行,更改ro为rwinit=/sysroot/bin/sh。按Ctrl+X启动系统。系......
  • hdu4027(线段树区间操作)
    Problem-4027(hdu.edu.cn)许多邪恶的战舰在战斗前排成一排。我们的指挥官决定使用我们的秘密武器来消灭战列舰。每艘战列舰都可以标记为耐力值。对于我们秘密武器的每一次攻击,它都可能降低连续部分战列舰的续航能力,使它们的续航力达到其原始续航力值的平方根。在我们的秘密武......
  • 数据库全局修改 utf8mb4_general_ci
    --修改数据库字符集和校对规则ALTERDATABASEyour_database_nameCHARACTERSET=utf8mb4COLLATE=utf8mb4_general_ci; --修改表的字符集和校对规则ALTERTABLEyour_table_nameCONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_general_ci; --修改列的......
  • VS2022 修改nuget包位置
    文章目录前言NuGet配置文件位置NuGet环境变量其他问题前言由于C盘的空间有限,NuGet的包位置默认又在C盘,这就很烦,只能去自己手动修改NuGet配置文件位置配置文件共有三处,添加下面的内容即可(高版本可以设置环境变量解决)<--添加下面的键值即可-->1234C:\Users......
  • mysql 统一修改字符集和字段属性
    --修改表字符集SELECTCONCAT("ALTERTABLE`",TABLE_NAME,"`CONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_general_ci;")AStarget_tablesFROMINFORMATION_SCHEMA.TABLESWHERETABLE_SCHEMA="uat-zpg"ANDTABLE_TYPE="BASETABLE&q......
  • wimlib可以处理多种Windows映像文件格式,包括WIM、ESD、VHD等,而且还支持高级功能,如压缩
    可以将wimlib视为DISM的替代品之一。虽然DISM是Windows操作系统中的内置工具,但wimlib提供了类似的功能,并且更加灵活和跨平台。wimlib可以处理多种Windows映像文件格式,包括WIM、ESD、VHD等,而且还支持高级功能,如压缩和转换映像文件格式、创建和挂载虚拟磁盘等。它是一个开源软......
  • Windows注册表编辑器是用于管理和修改Windows操作系统注册表的工具。以下是一些常见的
    Windows注册表编辑器是用于管理和修改Windows操作系统注册表的工具。以下是一些常见的Windows注册表编辑器:regedit.exe:这是Windows内置的注册表编辑器,可以通过运行regedit命令或在开始菜单中搜索"注册表编辑器"来打开它。它提供了对注册表键值的查看、编辑和删除等功能。......
  • IMX6ULL Linux内核网络驱动修改
    IMX6ULL网络驱动修改主要修改arch/arm/boot/dts/imx6ul-14x14-evk.dtsi设备树文件即可,修改方式和u-boot的设备树修改一致。硬件电路设备树修改需要修改的设备树位置:arch/arm/boot/dts/imx6ul-14x14-evk.dtsi增加复位引脚信息从上面的原理图可知网口1使用的复位引脚是GPIO......