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

题解:Transformation

题目传送门

也是写上 HDU 的题解了。

关于 HDU 的杂谈

因为杭电的 OJ 只有一个测试点,所以有些题搬过来的时候改成多测,题目里有没有文字说明。

还有更坑人的:HDU 4027 Can you answer these queries?,区间 $[x,y]$,保证 $x<y$。

题意分析

需要实现操作:区间赋值、区间乘、区间加,查区间一次、二次、三次和。

乘法优先于加法是简单的,也不难想到赋值优先于乘法。因此分别打三个标记 setmuladd

下方懒标记的时候顺序下方,修改 set 时清空 muladd,修改 mul 时修改 add 即可。

还需要维护对应的 sum[1]sum[2]sum[3] 分别表示一次、二次、三次和。

赋值、乘法修改是简单的,主要考虑加法操作:设将 \(a_1,a_2,\cdots,a_n\)\(x\)

则有:

\[\begin{aligned} \sum_{i=1}^n(a_i+x)^3&=\sum_{i=1}^n\left(a_i^3+3a_i^2x+3a_ix^2+x^3\right)\\ &=\sum_{i=1}^na_i^3+3x\sum_{i=1}^na_i^2+3x^2\sum_{i=1}^na_i+nx^3\\ \sum_{i=1}^n(a_i+x)^2&=\sum_{i=1}^n\left(a_i^2+2a_ix+x^2\right)\\ &=\sum_{i=1}^na_i^2+2x\sum_{i=1}^na_i+nx^2\\ \sum_{i=1}^n(a_i+x)&=\sum_{i=1}^na_i+nx \end{aligned} \]

更新即顺序进行:

\[\begin{aligned} \textit{sum}_3&\leftarrow\textit{sum}_3+3x\cdot\textit{sum}_2+3x^2\cdot\textit{sum}_1+nx^3\\ \textit{sum}_2&\leftarrow\textit{sum}_2+2x\cdot\textit{sum}_1+nx^2\\ \textit{sum}_1&\leftarrow\textit{sum}_1+nx \end{aligned} \]

AC 代码

//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
using namespace std;
constexpr const int N=1e5,P=10007;
struct segTree{struct node{int l,r;int sum[4];int add,mul,set;int size(){return r-l+1;}}t[N<<2|1];void up(int p){t[p].sum[1]=(t[p<<1].sum[1]+t[p<<1|1].sum[1])%P;t[p].sum[2]=(t[p<<1].sum[2]+t[p<<1|1].sum[2])%P;t[p].sum[3]=(t[p<<1].sum[3]+t[p<<1|1].sum[3])%P;}void build(int p,int l,int r){t[p]={l,r};t[p].mul=1;if(l==r){return;}int mid=l+r>>1;build(p<<1,l,mid);build(p<<1|1,mid+1,r);up(p); }void down(int p){if(t[p].set){ t[p<<1].set=t[p].set;t[p<<1].add=0,t[p<<1].mul=1;t[p<<1].sum[1]=t[p<<1].size()*t[p].set%P;t[p<<1].sum[2]=t[p<<1].sum[1]*t[p].set%P;t[p<<1].sum[3]=t[p<<1].sum[2]*t[p].set%P;t[p<<1|1].set=t[p].set;t[p<<1|1].add=0,t[p<<1|1].mul=1;t[p<<1|1].sum[1]=t[p<<1|1].size()*t[p].set%P;t[p<<1|1].sum[2]=t[p<<1|1].sum[1]*t[p].set%P;t[p<<1|1].sum[3]=t[p<<1|1].sum[2]*t[p].set%P;t[p].set=0;}if(t[p].mul!=1){t[p<<1].mul=t[p<<1].mul*t[p].mul%P;t[p<<1].add=t[p<<1].add*t[p].mul%P;t[p<<1].sum[1]=t[p<<1].sum[1]*t[p].mul%P;t[p<<1].sum[2]=t[p<<1].sum[2]*t[p].mul%P*t[p].mul%P;t[p<<1].sum[3]=t[p<<1].sum[3]*t[p].mul%P*t[p].mul%P*t[p].mul%P;t[p<<1|1].mul=t[p<<1|1].mul*t[p].mul%P;t[p<<1|1].add=t[p<<1|1].add*t[p].mul%P;t[p<<1|1].sum[1]=t[p<<1|1].sum[1]*t[p].mul%P;t[p<<1|1].sum[2]=t[p<<1|1].sum[2]*t[p].mul%P*t[p].mul%P;t[p<<1|1].sum[3]=t[p<<1|1].sum[3]*t[p].mul%P*t[p].mul%P*t[p].mul%P;t[p].mul=1;}if(t[p].add){int &x=t[p].add;t[p<<1].add=(t[p<<1].add+x)%P;t[p<<1].sum[3]=(t[p<<1].sum[3]+3*t[p<<1].sum[2]*x%P+3*t[p<<1].sum[1]*x%P*x%P+t[p<<1].size()*x%P*x%P*x%P)%P;t[p<<1].sum[2]=(t[p<<1].sum[2]+2*t[p<<1].sum[1]*x%P+t[p<<1].size()*x%P*x%P)%P;t[p<<1].sum[1]=(t[p<<1].sum[1]+t[p<<1].size()*x)%P; t[p<<1|1].add=(t[p<<1|1].add+x)%P;t[p<<1|1].sum[3]=(t[p<<1|1].sum[3]+3*t[p<<1|1].sum[2]*x%P+3*t[p<<1|1].sum[1]*x%P*x%P+t[p<<1|1].size()*x%P*x%P*x%P)%P;t[p<<1|1].sum[2]=(t[p<<1|1].sum[2]+2*t[p<<1|1].sum[1]*x%P+t[p<<1|1].size()*x%P*x%P)%P;t[p<<1|1].sum[1]=(t[p<<1|1].sum[1]+t[p<<1|1].size()*x)%P;t[p].add=0;}}void add(int p,int l,int r,int x){if(l<=t[p].l&&t[p].r<=r){t[p].add=(t[p].add+x)%P;t[p].sum[3]=(t[p].sum[3]+3*t[p].sum[2]*x%P+3*t[p].sum[1]*x%P*x%P+t[p].size()*x%P*x%P*x%P)%P;t[p].sum[2]=(t[p].sum[2]+2*t[p].sum[1]*x%P+t[p].size()*x%P*x%P)%P;t[p].sum[1]=(t[p].sum[1]+t[p].size()*x)%P;return;}down(p);if(l<=t[p<<1].r){add(p<<1,l,r,x);}if(t[p<<1|1].l<=r){add(p<<1|1,l,r,x);}up(p);}void mul(int p,int l,int r,int x){if(l<=t[p].l&&t[p].r<=r){t[p].mul=t[p].mul*x%P;t[p].add=t[p].add*x%P;t[p].sum[1]=t[p].sum[1]*x%P;t[p].sum[2]=t[p].sum[2]*x%P*x%P;t[p].sum[3]=t[p].sum[3]*x%P*x%P*x%P;return;}down(p);if(l<=t[p<<1].r){mul(p<<1,l,r,x);}if(t[p<<1|1].l<=r){mul(p<<1|1,l,r,x);}up(p);}void set(int p,int l,int r,int x){if(l<=t[p].l&&t[p].r<=r){t[p].add=0,t[p].mul=1;t[p].set=x;t[p].sum[1]=t[p].size()*t[p].set%P;t[p].sum[2]=t[p].sum[1]*t[p].set%P;t[p].sum[3]=t[p].sum[2]*t[p].set%P;return;}down(p);if(l<=t[p<<1].r){set(p<<1,l,r,x);}if(t[p<<1|1].l<=r){set(p<<1|1,l,r,x);}up(p);}int query(int p,int l,int r,int x){if(l<=t[p].l&&t[p].r<=r){return t[p].sum[x];}down(p);int ans=0;if(l<=t[p<<1].r){ans+=query(p<<1,l,r,x);}if(t[p<<1|1].l<=r){ans+=query(p<<1|1,l,r,x);}return ans%P;}
}t;
main(){/*freopen("test.in","r",stdin);freopen("test.out","w",stdout);*/ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;while(true){cin>>n>>m;if(!n&&!m){break;}t.build(1,1,n);while(m--){int op,l,r,x;cin>>op>>l>>r>>x;switch(op){case 1:t.add(1,l,r,x);break;case 2:t.mul(1,l,r,x);break;case 3:t.set(1,l,r,x);break;case 4:cout<<t.query(1,l,r,x)<<'\n'; break;}}}cout.flush();/*fclose(stdin);fclose(stdout);*/return 0;
}
/*
5 3
3 3 5 7
1 2 4 4
4 1 5 2
0 0307
*/
http://www.jsqmd.com/news/330897/

相关文章:

  • 高二上期末考试总结
  • 【毕业设计】基于SSM的手机商城(源码+文档+远程调试,全bao定制等)
  • 从技术批判到政治决断:论算法黑箱的资本逻辑与语境主权的治理革命
  • Dify 实战:通过 Dify 快速接入 MCP Server
  • SSM毕设选题推荐:基于SSM的疫情健康上报管理系统小区疫情防控系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 计算机SSM毕设实战-基于SSM的疫情健康上报管理系统疫情数据上报、疫情数据分析、疫情信息发布、健康打卡管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • VSCode 下如何检查 Vue 项目中未使用的依赖?
  • 【计算机毕业设计案例】基于SSM的疫情健康上报管理系统疫情管理、行程上报、健康上报(程序+文档+讲解+定制)
  • SSM毕设选题推荐:基于SSM的手机商城基于SSM实现手机销售商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Dify 实战:使用 Docker Compose 部署 Dify
  • HTTP Content-Type
  • Bootstrap5 轮播
  • 计算机SSM毕设实战-基于SSM的手机商城基于VUE+SSM手机商城销售系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • AI应用架构师实战:智能控制系统架构的原型验证方法
  • 【课程设计/毕业设计】基于SSM的疫情健康上报管理系统每日体温填报 异常症状上报(咳嗽、发热等) 数据可视化【附源码、数据库、万字文档】
  • 解读IEC 80601-2-71-2025
  • 多模态-8 YOLO World
  • 巴基斯坦总理谢里夫达沃斯观点-万祥军| 世界经济论坛·国际科学院组织
  • 新旧版元器平台获取智能体 token 方式
  • 【计算机毕业设计案例】基于SSM的手机商城基于ssm手机商城管理系统 基于 SSM 框架的手机线上交易平台(程序+文档+讲解+定制)
  • 解析RAG优化核心策略,从检索精准到生成优质的全链路突破
  • 刚果总统齐塞克迪达沃斯发言-万祥军| 世界经济论坛·国际科学院组织
  • 题解:洛谷 P10803([CEOI 2024] 文本编辑器)
  • 达沃斯阿塞拜疆总统阿利耶夫发言-万祥军| 世界经济论坛·国际科学院组织
  • 达沃斯65位元首和首脑齐聚-万祥军| 世界经济论坛·国际科学院组织‍
  • 卷王系统部署
  • 学术 PPT 还在 “东拼西凑”?虎贲等考 AI 一键生成评审级汇报,答辩 / 汇报直接封神
  • ‍芬兰总统斯图布达沃斯观点-万祥军| 世界经济论坛·国际科学院组织
  • AC掉线后,本地转发的AP还能用吗?答案藏在这3个关键点里
  • 5 款 AI 写论文哪个好?实测后:虎贲等考 AI 才是毕业论文 “硬核王者”