当前位置: 首页 > news >正文

P3924 康娜的线段树

康娜的线段树 - 洛谷

一般问题转特殊化

发现

ans=[a1+(a1+a2)+(a1+a2+a3+a4)]*\frac{1}{4}+[a2+(a1+a2)+(a1+a2+a3+a4)]*\frac{1}{4}+[a3+(a3+a4)+(a1+a2+a3+a4)]*\frac{1}{4}+[a4+(a3+a4)+(a1+a2+a3+a4)]*\frac{1}{4}

化简

ans=(a1+a2+a3+a4)+\frac{1}{2}*(a1+a2)+\frac{1}{2}*(a3+a4)+\frac{1}{4}*a1+\frac{1}{4}*a2+\frac{1}{4}*a3+\frac{1}{4}*a4

合并同类项

ans=(a1+a2+a3+a4)*(\frac{1}{4}+\frac{1}{2}+1)

发现与深度有关

ans=\sum_{i=1}^{n} a[i]*(\frac{1}{2^{dep[i]}}+\frac{1}{2^{dep[i]-1}}+...+\frac{1}{2^{0}})

发现可以化简

ans=\sum_{i=1}^{n} a[i]*(\frac{1+2+...+2^{dep[i]}}{2^{dep[i]}})

ans=\sum_{i=1}^{n} a[i]*\frac{\frac{1*(1-2^{dep[i]})}{1-2}}{2^{dep[i]}}

ans=\sum_{i=1}^{n} a[i]*\frac{2^{dep[i]-1}}{2^{dep[i]}}

ans=\sum_{i=1}^{n} a[i]*(1-\frac{1}{2^{dep[i]}})

处理出每个点的深度就可以知道未修改的答案

考虑区间修改后对答案的影响

ans=\sum_{i=1}^{n} a[i]*(1-\frac{1}{2^{dep[i]}})+x*\sum_{i=l}^{r}(1-\frac{1}{2^{dep[i]}})

因此我们只需要维护一个前缀和就可以了

因为答案是整数,我们乘一个2^20即可(2^20==1e6)

code

#include <bits/stdc++.h>#define INF (1ll<<60)
#define eps 1e-6
#define tl(id) id<<1
#define tr(id) id<<1|1
using namespace std;
typedef long long ll;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef unsigned long long ull;
typedef vector<vector<int> > vii;
typedef vector<vector<vector<int> > > viii;
typedef vector<ll> vl;
typedef vector<vector<ll> > vll;
typedef vector<double> vd;
typedef vector<vector<double> > vdd;
typedef vector<string> vs;
#define time mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());//稳定随机卡牛魔 ull
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
signed main(){ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int n,m;ll qwq;cin>>n>>m>>qwq;vl a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}vl prefix(n+1),dep(n+1);vl t(30);t[0]=1;for(int i=1;i<=29;i++){t[i]=t[i-1]*2;}ll ans=0;int mxdep=20;auto build=[&](auto &build,int id,int l,int r,int d)->void{if(l==r){dep[l]=d;prefix[l]=2*t[mxdep]-t[mxdep]/t[d];ans+=a[l]*prefix[l];return;}int mid=(l+r)>>1;build(build,tl(id),l,mid,d+1);build(build,tr(id),mid+1,r,d+1);};build(build,1,1,n,0);for(int i=1;i<=n;i++){prefix[i]=prefix[i-1]+prefix[i];}ll g=gcd(qwq,t[mxdep]);qwq/=g,t[mxdep]/=g;for(int i=1;i<=m;i++){int l,r;ll x;cin>>l>>r>>x;ans+=(prefix[r]-prefix[l-1])*x;cout<<ans*qwq/t[mxdep]<<'\n';}return 0;
}


http://www.mrgr.cn/news/55649.html

相关文章:

  • RHCSA复习题
  • WebSocket状态码及异常报错1006
  • 数据库、数据仓库、数据湖和数据中台有什么区别
  • 2024 Rust现代实用教程:1.1Rust简介与安装更新
  • 测试测试测试06
  • ACM与蓝桥杯竞赛指南 基本输入输出格式一
  • 2025医药化工水处理新技术、新工艺、新装备发展论坛3月4日济南举办
  • 【VUE小型网站开发】优化通用配置
  • 【Docker技术详解】(一)Docker镜像文件系统的关系和交互
  • 27.3 一致性哈希算法介绍
  • 142 环形链表II
  • Vim使用与进阶
  • 168K+ Star!AutoGPT:一个构建、部署和运行AI代理的强大平台
  • 【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数
  • 【AI学习】扩散模型学习总结PPT
  • python 爬虫 入门 四、线程,进程,协程
  • Mysql常见面试题总结
  • 深入理解Oracle闪回技术
  • JMeter快速入门示例
  • pycharm中使用ctrl+鼠标滚轮改变字体大小
  • 深入探秘ReentrantLock的实现与应用:从底层原理到业务场景的实践
  • 【LLM】大模型工具调用之AllTools模型
  • 【状态机DP】力扣1262. 可被三整除的最大和
  • 01-编程入门
  • 传感器信号的存储和传输
  • 首个统一生成和判别任务的条件生成模型框架BiGR:专注于增强生成和表示能力,可执行视觉生成、辨别、编辑等任务