版权属于舒老师,想要引用此题(包括题面)的朋友请联系博主



分析:

这道题是舒老师的原创题(版权声明~)

神题啊,毒瘤题啊

正解

首先,我们可以先忽略n(n+1)2n(n+1)2n(n+1) \over 2中的22 \over 2,最后再处理即可
我们将n(n+1)n(n+1)n(n+1)展开,得到n2+nn2+nn^2+n
我们可以把一个操作拆成两个:
① 对[l,r][l,r][l,r]每个点加dis2dis2dis^2 (disdisdis为该点到l的距离+1)
② 对[l,r][l,r][l,r]每个点加disdisdis

(操作②这就让我想起一道题,相当于加上一条直线)

我们从简单的开始

操作②

在区间[l,r][l,r][l,r]上加上一个等差数列:a1=1,d=1a1=1,d=1a_1=1,d=1
在线段树众维护等差数列的首项和公差
pushdown的时候,左儿子直接继承父结点的首项和公差,右儿子继承公差,计算一下首项即可
如果打标记时发生了标记覆盖,直接:首项1+首项2,公差1+公差2

操作①

显然我们没法合并x2x2x^2的标记,考虑差分
n2−(n−1)2=2n−1n2−(n−1)2=2n−1n^2-(n-1)^2=2n-1
等差数列:a1=1,d=2a1=1,d=2a_1=1,d=2,在线段树中维护首项和公差
如果是单点查询的话,我们查询前缀和即可(差分的运用)

如果是区间[l,r],ans=∑ri=li2[l,r],ans=∑i=lri2[l,r],ans=\sum_{i=l}^{r} i^2
设a[i]=2i−1a[i]=2i−1a[i]=2i-1

由上图(等高线地形图???)就可以看出:
a[1]−a[l]a[1]−a[l]a[1]-a[l]计算了r−l+1r−l+1r-l+1次
a[l+1]a[l+1]a[l+1]计算了r−lr−lr-l次
.........
a[r]a[r]a[r]计算了111次

我们定义C(l,r)" role="presentation" style="position: relative;">C(l,r)C(l,r)C(l,r)
C(l,r)=C(l,r)=C(l,r)=
a[l]+a[l+1]+a[l+2]+...a[r]+a[l]+a[l+1]+a[l+2]+...a[r]+a[l]+a[l+1]+a[l+2]+...a[r]+
a[l+1]+a[l+2]+...a[r]+a[l+1]+a[l+2]+...a[r]+a[l+1]+a[l+2]+...a[r]+
a[l+2]+...a[r]+a[l+2]+...a[r]+a[l+2]+...a[r]+
.........
a[r]a[r]a[r]

那么ans=∑ri=li2=∑l−1i=1a[i]∗(r−l+1)+C(l,r)ans=∑i=lri2=∑i=1l−1a[i]∗(r−l+1)+C(l,r)ans=\sum_{i=l}^{r} i^2=\sum_{i=1}^{l-1}a[i]*(r-l+1)+C(l,r)

维护C(l,r)C(l,r)C(l,r)
update:C(l,r)=C(l,mid)+C(mid+1,r)+∑midi=la[i]∗(r−mid)C(l,r)=C(l,mid)+C(mid+1,r)+∑i=lmida[i]∗(r−mid)C(l,r)=C(l,mid)+C(mid+1,r)+\sum_{i=l}^{mid}a[i]*(r-mid)

方便起见,我们可以标记永久化

#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long longusing namespace std;const int N=200010;
const ll p=1e9+7;
ll inv2,s1[N],s2[N];
int n,type,L,R,m,lastans=0;ll KSM(ll a,ll b) {ll t=1;while (b) {if (b&1) t=(t*a)%p;a=(a*a)%p;b>>=1;}return t%p;
}void change_lr() {L=(L+lastans-1)%n+1;R=(R+lastans-1)%n+1;if (L>R) swap(L,R);
}struct node1{                   //维护等差数列  struct tree1{ll a,b,sum;}t[N<<2];void update(int bh,int l,int r) {     t[bh].sum=t[bh<<1].sum+t[bh<<1|1].sum; t[bh].sum%=p;if (!t[bh].a&&!t[bh].b) return;    ll n=r-l+1;                                                //有标记就维护一下值 t[bh].sum+=(t[bh].a*n%p+t[bh].b*s1[n]%p)%p; t[bh].sum%=p;}void change(int bh,int l,int r,int L,int R,int a,int b) {if (l>=L&&r<=R) {t[bh].a+=a; t[bh].a%=p;t[bh].b+=b; t[bh].b%=p;update(bh,l,r);return;}int mid=(l+r)>>1;if (L<=mid) change(bh<<1,l,mid,L,R,a,b);if (R>mid) change(bh<<1|1,mid+1,r,L,R,(a+max(mid-max(l,L)+1,0)*b%p)%p,b);update(bh,l,r);}ll ask(int bh,int l,int r,int L,int R,ll a,ll b) {    //标记永久化的a和b if (l>=L&&r<=R) {return (t[bh].sum+a*(r-l+1)%p+b*(s1[r-l+1])%p)%p;}int mid=(l+r)>>1;a=(a+t[bh].a)%p; b=(b+t[bh].b)%p;//标记永久化 ll ans=0;if (L<=mid) ans=(ans+ask(bh<<1,l,mid,L,R,a,b)%p)%p;if (R>mid) ans=(ans+ask(bh<<1|1,mid+1,r,L,R,(a+(mid-l+1)*b%p)%p,b)%p)%p;//a+(mid-l+1)*b  右儿子新首项 return ans;}
};
node1 T1;struct node2{struct tree2{ll a,b,sum,sum_2;//sum sum(a[l]~a[r])//sum_2 C(l,r) }t[N<<2];void update(int bh,int l,int r) {int mid=(l+r)>>1;int lc=bh<<1;int rc=bh<<1|1;t[bh].sum=t[lc].sum+t[rc].sum; t[bh].sum%=p;t[bh].sum_2=t[lc].sum_2+t[rc].sum_2; t[bh].sum_2%=p;      t[bh].sum_2+=t[lc].sum*(ll)(r-mid)%p;  t[bh].sum_2%=p; if (!t[bh].a&&!t[bh].b) return;                          //有标记就维护一下值ll n=r-l+1;t[bh].sum+=(t[bh].a*n%p+t[bh].b*s1[n]%p)%p; t[bh].sum%=p;t[bh].sum_2+=t[bh].a*s1[n]%p+t[bh].b*s1[n]%p*(n+1)%p-s2[n]*t[bh].b%p;//注意sum_2的维护 t[bh].sum_2%=p; }void change(int bh,int l,int r,int L,int R,ll a,ll b) {if (l>=L&&r<=R) {t[bh].a+=a; t[bh].a%=p;t[bh].b+=b; t[bh].b%=p;update(bh,l,r);return;}int mid=(l+r)>>1;if (L<=mid) change(bh<<1,l,mid,L,R,a,b);if (R>mid) change(bh<<1|1,mid+1,r,L,R,(a+max(mid-max(l,L)+1,0)*b%p)%p,b);update(bh,l,r);}ll ask(int bh,int l,int r,int L,int R,ll s,ll a,ll b) {if (l>=L&&r<=R) {ll n=r-l+1;return (s*n%p+t[bh].sum_2+a*s1[n]%p+b*s1[n]%p*(n+1)%p-b*s2[n]%p);}int mid=(l+r)>>1;a=(a+t[bh].a)%p; b=(b+t[bh].b)%p;//标记永久化 ll ans=0;if (L<=mid) ans=(ans+ask(bh<<1,l,mid,L,R,s,a,b))%p;if (R>mid) ans=(ans+ask(bh<<1|1,mid+1,r,L,R,(s+t[bh<<1].sum+a*(mid-l+1)%p+b*s1[mid-l+1]%p)%p,(a+b*(mid-l+1)%p)%p,b)%p)%p;return ans%p;}
};
node2 T2;int main() {char s[10];scanf("%d%d",&n,&type);scanf("%d",&m);inv2=KSM(2,p-2);for (int i=1;i<=n;i++) {s1[i]=(s1[i-1]+(ll)i)%p;s2[i]=(s2[i-1]+(ll)i*i)%p;}for (int i=1;i<=m;i++) {scanf("%s%d%d",s,&L,&R);if (type) change_lr();if (s[0]=='C') {T1.change(1,1,n,L,R,0,1);      //a=0 b=1T2.change(1,1,n,L,R,-1,2);     //a=-1 b=2if (R!=n) {ll nn=R-L+1;T2.change(1,1,n,R+1,R+1,-nn*nn%p,0);}}else {ll ans=(T1.ask(1,1,n,L,R,0,0)+T2.ask(1,1,n,L,R,0,0,0))%p;ans=(ans*inv2%p+p)%p;lastans=ans%p;printf("%lld\n",ans);    }}return 0;
}

Enzymii解

预处理mul[j]=∑ji=1i∗(i+1)2mul[j]=∑i=1ji∗(i+1)2mul[j]=\sum_{i=1}^{j}{i*(i+1) \over 2}

分块(有点像块状链表)
code看不大懂,总的来说也是维护等差数列的首项和公差

zyz解

首先我们观察一下i(i+1)2i(i+1)2i(i+1) \over 2,并且差分一下
有兴趣的可以看一下差分序列的相关资料

1   3   6   10  15 2   3   4   51   1   1

可以发现,i(i+1)2i(i+1)2i(i+1) \over 2是一个二阶等差数列
我们用线段树维护一阶首项,二阶首项,二阶公差
如果打标记时发生了标记覆盖,直接对应相加即可

看一下如何计算序列中的第pospospos项:
a1+b1∗pos+pos(pos−1)2∗da1+b1∗pos+pos(pos−1)2∗da_1+b_1*pos+{pos(pos-1) \over 2}*d

舒老师AK的hu测 T2. LX还在迷路(线段树+等差数列)相关推荐

  1. 【学术篇】规律选手再次证明自己(舒老师的胡策题 T2 LX还在迷路)

    只要你不强制在线, 我就能分块. --Reflash 就算你强制在线, 我还是要分块. --Enzymii 今天做了一波舒老师的毒瘤题, T1据说很水但是没思路所以直接放掉了.. 去看了看T2好像可以 ...

  2. 舒老师AK的hu测 T1. 迷失沃尔玛(dp+贪心)

    版权属于舒老师,想要引用此题(包括题面)的朋友请联系博主 分析: mmp,这道题做了不短的时间(这是什么语法...) 首先我们可以用O(nlogn)O(nlogn)O(nlogn)的复杂度计算出f[i ...

  3. 曲神的hu测 T2.Van(左偏树+dp)T3.Gay

    版权属于yhzq,想要引用此题(包括题面)的朋友请联系博主 T2.Van 分析: 这样把博弈黑出翔真的好吗... 首先我们要明确怎么计算一个序列的最长Van序列 这就和花匠那道题有异曲同工之妙了 我们 ...

  4. 校内hu测(10.6T2,T3)(乱搞+贪心+模拟)

    @liu_runda T2.便(then) [题目描述] 给出一个R*C的棋盘.共有R行C列,R*C个格子.现要在每个格子都填一个非负整数.使得任意一个2*2的正方形区域都满足这样的性质:左上角的数字 ...

  5. c语言体能测试模块,体测来啦,送你一份通关礼包(附老师建议及体测技巧)...

    一年一度的大型运动现场又"不期而至"啦 本来岭南君还在等待着秋天的到来 然而 一不小心却等来了体测! 真是让人"又爱又恨" 惆怅之余,岭南君还是凭着一百二十分的 ...

  6. 2018.3.15校内互测总结-点分治-线段树

    这是曾来过咱们学校集训的一位大神出的~ T1 题目大意 给出一棵带边权的无根树,求树上前$k$大的路径的长度. $1 \leq n \leq 200000$ 题解 想了一上午点分治,却发现只会$O(n ...

  7. [学习笔记]Segment Tree Beats!九老师线段树

    对于这样一类问题: 区间取min,区间求和. N<=100000 要求O(nlogn)级别的算法 直观体会一下,区间取min,还要维护区间和 增加的长度很不好求.... 然鹅, 从前有一个来自杭 ...

  8. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 93  Solved: 53 [Submit][Status ...

  9. 【模板】吉老师线段树

    ACM模板 目录 区间取最值 区间取最值 Gorgeous Sequence 区间最值操作往往采用以下办法 线段树维护: 区间最大值mx\text{mx}mx 区间严格次大值smx\text {smx ...

最新文章

  1. laravel ajax vue6,详解用vue.js和laravel实现微信支付
  2. 【Linux入门到精通系列讲解】内存管理malloc和free函数
  3. CSS基础_Day02
  4. Cloud for Customer的第一个显示的work center是怎么加载和渲染的
  5. 【Flink】Flink 时间之 timerService().registerEventTimeTimer 主要做了什么
  6. Git 使用文档( git pull/fetch )
  7. vb.net json上传服务器_vue项目编译后自动上传,告别繁琐的操作
  8. ubuntu16.04 安装virtualbox 问题 RTR3InitEx failed with rc=-1912 (rc=-1912)
  9. java 判断qq_检测QQ号码是否存在
  10. java中常见对象——StringBuffer
  11. 尚硅谷谷粒商城项目介绍
  12. 中播放*.mid格式及其它格式的音乐
  13. RSA 加解密 1024 位 2048 位
  14. 数字ic后端学习ing
  15. 实用工具分享,如何批量修改文件夹名称的一部分
  16. C语言象棋马的遍历程序,马走日遍历
  17. 全国实时公交查询API接口
  18. 【笔记】Stellarium怎么截图
  19. MR-GMMapping:基于高斯混合模型的通信高效多机器人映射系统
  20. sketch插件 android,设计师必备的SKetch插件合集

热门文章

  1. 固定资产自动盘点系统,盘点固定资产及利润更清晰
  2. python乘法符号手写_利用Python自动生成小学生加减乘除口算考试题卷,不再为手写算术题烦恼!...
  3. 2021-08-13 TM32F103 SRAM 内存扩展管理
  4. OPPOR9Android 6.0过程,超简单 OPPOR9升级Android 6.0系统 详细教程
  5. 关于CPU 和 GPU
  6. 【论文阅读】【综述】从Optical Flow到Scene Flow
  7. Maven是主要干嘛的呢
  8. 困扰了已久的TCP/IP 协议,终于有人讲的明明白白,太强了
  9. 解决谷歌浏览器拦截文件只有舍弃选项问题
  10. Linux驱动开发(二)内核符号表