题目描述

传送门:
星际旅行

思路

根据题目描述,这道题显然是一道线段树的模板题。动力加和动力增强用对应线段树的区间加和区间乘操作。关键是旋转操作,回忆一下,线段树的区间加和区间乘都有对应的懒标记,而且加法和乘法操作的懒标记积累具有一定的交换规则。对于旋转操作,也可以定义一个旋转标记,注意到,区间旋转3次等价于没有旋转,问题是交换规则。由于乘法是对x,y,z三个坐标同步进行增幅,所以旋转和乘法操作是任意可交换的,对于加法,它对于旋转不具有交换性,但懒标记的更新过程可以旋转,定义任意一次加法(x,y,z)+(a,b,c),它对加法懒标记的更新操作为(a,b,c)向右旋转(旋转懒标记)lazyro[p]次,后进行更新即可。这样所有的加法和旋转,都等价于先加后旋转,按此规则Pushdown即可。

AC代码

#include<iostream>
#include<vector>
#include<string.h>
#include<map>
#include<algorithm>
#include<math.h>
#include <assert.h>
#include<queue>
#include<set>
#define INF 1000000000
#define p(x) x%3
#define MOD 1000000007
using namespace std;
#define maxn 10000000
using LL=long long int;
LL lazyx[maxn],lazyy[maxn],lazyz[maxn],lazymul[maxn],
lazyro[maxn],sum_x[maxn],sum_y[maxn],sum_z[maxn],lson[maxn],rson[maxn];
LL cnt=0;
inline void swap(LL& a,LL& b)
{LL t=a;a=b;b=t;
}
inline void pushdown(LL p,LL l,LL r)
{if(l==r){lazyx[p] = lazyy[p] = lazyz[p] = lazymul[p] = lazyro[p] = 0;return;}LL& lchild = lson[p];LL& rchild = rson[p];if(!lchild)lchild=++cnt;if(!rchild)rchild=++cnt;LL mid = (l+r)>>1;if(!lazymul[p])lazymul[p] = 1;sum_x[lchild] =(sum_x[lchild]*(lazymul[p]%MOD)%MOD+((mid-l+1)%MOD)*(lazyx[p]%MOD)%MOD)%MOD,sum_x[rchild] =(sum_x[rchild]*(lazymul[p]%MOD)%MOD+((r-mid)%MOD)*(lazyx[p]%MOD)%MOD)%MOD;sum_y[lchild] =(sum_y[lchild]*(lazymul[p]%MOD)%MOD+((mid-l+1)%MOD)*(lazyy[p]%MOD)%MOD)%MOD,sum_y[rchild] =(sum_y[rchild]*(lazymul[p]%MOD)%MOD+((r-mid)%MOD)*(lazyy[p]%MOD)%MOD)%MOD;sum_z[lchild] =(sum_z[lchild]*(lazymul[p]%MOD)%MOD+((mid-l+1)%MOD)*(lazyz[p]%MOD)%MOD)%MOD,sum_z[rchild] =(sum_z[rchild]*(lazymul[p]%MOD)%MOD+((r-mid)%MOD)*(lazyz[p]%MOD)%MOD)%MOD;for(LL i=0;i<lazyro[p];++i){swap(sum_x[lchild],sum_y[lchild]);swap(sum_y[lchild],sum_z[lchild]);swap(sum_x[rchild],sum_y[rchild]);swap(sum_y[rchild],sum_z[rchild]);}int u,v,w;u=lazyx[p],v=lazyy[p],w=lazyz[p];for(int i=0;i<lazyro[lchild];++i){swap(v,w);swap(u,v);}lazyx[lchild] =(lazyx[lchild]*(lazymul[p]%MOD)%MOD+u%MOD)%MOD,lazyy[lchild] =(lazyy[lchild]*(lazymul[p]%MOD)%MOD+v%MOD)%MOD,lazyz[lchild] =(lazyz[lchild]*(lazymul[p]%MOD)%MOD+w%MOD)%MOD;u=lazyx[p],v=lazyy[p],w=lazyz[p];for(int i=0;i<lazyro[rchild];++i){swap(v,w);swap(u,v);}lazyx[rchild] =(lazyx[rchild]*(lazymul[p]%MOD)%MOD+u%MOD)%MOD,lazyy[rchild] =(lazyy[rchild]*(lazymul[p]%MOD)%MOD+v%MOD)%MOD,lazyz[rchild] =(lazyz[rchild]*(lazymul[p]%MOD)%MOD+w%MOD)%MOD;if(lazymul[p]!=1){if(!lazymul[lchild])lazymul[lchild]=1;lazymul[lchild] = lazymul[lchild]*(lazymul[p]%MOD)%MOD;if(!lazymul[rchild])lazymul[rchild]=1;lazymul[rchild] = lazymul[rchild]*(lazymul[p]%MOD)%MOD;}lazyro[lchild] = (lazyro[lchild] + lazyro[p])%3;lazyro[rchild] = (lazyro[rchild] + lazyro[p])%3;lazyx[p]=0;lazyy[p]=0;lazyz[p]=0;lazymul[p]=0;lazyro[p]=0;
}
void add(LL& p,LL l,LL r,LL L,LL R,LL a,LL b,LL c)
{if(!p){p=++cnt;}if(r<L || l>R)return;if(l>=L && r<=R){sum_x[p] =(sum_x[p]+(r-l+1)%MOD*(a%MOD)%MOD)%MOD,sum_y[p] =(sum_y[p]+(r-l+1)%MOD*(b%MOD)%MOD)%MOD,sum_z[p] =(sum_z[p]+(r-l+1)%MOD*(c%MOD)%MOD)%MOD;for(int i=0;i<lazyro[p];++i){swap(b,c);swap(a,b);}lazyx[p] =(lazyx[p]+a%MOD)%MOD;lazyy[p] =(lazyy[p]+b%MOD)%MOD;lazyz[p] =(lazyz[p]+c%MOD)%MOD;return;}if(lazyx[p]||lazyy[p]||lazyz[p]||lazymul[p]||lazyro[p])pushdown(p,l,r);LL mid = (l+r)>>1;if(mid>=L)add(lson[p],l,mid,L,R,a,b,c);if(mid<R) add(rson[p],mid+1,r,L,R,a,b,c);sum_x[p]=(sum_x[lson[p]]%MOD+sum_x[rson[p]]%MOD)%MOD;sum_y[p]=(sum_y[lson[p]]%MOD+sum_y[rson[p]]%MOD)%MOD;sum_z[p]=(sum_z[lson[p]]%MOD+sum_z[rson[p]]%MOD)%MOD;
}void mul(LL& p,LL l,LL r,LL L,LL R,LL k)
{if(!p){p=++cnt;}if(r<L || l>R)return;if(l>=L && r<=R){if(!lazymul[p])lazymul[p]=1;lazymul[p] = lazymul[p]*(k%MOD)%MOD;lazyx[p] = lazyx[p]*(k%MOD)%MOD,lazyy[p] = lazyy[p]*(k%MOD)%MOD,lazyz[p] = lazyz[p]*(k%MOD)%MOD;sum_x[p] = sum_x[p]*(k%MOD)%MOD,sum_y[p] = sum_y[p]*(k%MOD)%MOD,sum_z[p] = sum_z[p]*(k%MOD)%MOD;return;}if(lazyx[p]||lazyy[p]||lazyz[p]||lazymul[p]||lazyro[p])pushdown(p,l,r);LL mid = (l+r)>>1;if(mid>=L)mul(lson[p],l,mid,L,R,k);if(mid<R) mul(rson[p],mid+1,r,L,R,k);sum_x[p]=(sum_x[lson[p]]%MOD+sum_x[rson[p]]%MOD)%MOD;sum_y[p]=(sum_y[lson[p]]%MOD+sum_y[rson[p]]%MOD)%MOD;sum_z[p]=(sum_z[lson[p]]%MOD+sum_z[rson[p]]%MOD)%MOD;
}void rotate(LL& p,LL l,LL r,LL L,LL R)
{if(!p){p=++cnt;}if(r<L || l>R)return;if(l>=L && r<=R){lazyro[p]++;lazyro[p]%=3;swap(sum_x[p],sum_y[p]);swap(sum_y[p],sum_z[p]);return;}if(lazyx[p]||lazyy[p]||lazyz[p]||lazymul[p]||lazyro[p])pushdown(p,l,r);LL mid = (l+r)>>1;if(mid>=L)rotate(lson[p],l,mid,L,R);if(mid<R)rotate(rson[p],mid+1,r,L,R);sum_x[p]=(sum_x[lson[p]]%MOD+sum_x[rson[p]]%MOD)%MOD;sum_y[p]=(sum_y[lson[p]]%MOD+sum_y[rson[p]]%MOD)%MOD;sum_z[p]=(sum_z[lson[p]]%MOD+sum_z[rson[p]]%MOD)%MOD;
}void query(LL& p,LL l,LL r,LL L,LL R,LL& a,LL& b,LL& c)
{if(!p){p=++cnt;}if(r<L || l>R)return;if(l>=L && r<=R){a = (a+sum_x[p]%MOD)%MOD,b = (b+sum_y[p]%MOD)%MOD,c = (c+sum_z[p]%MOD)%MOD;return;}if(lazyx[p]||lazyy[p]||lazyz[p]||lazymul[p]||lazyro[p])pushdown(p,l,r);LL mid = (l+r)>>1;if(mid>=L)query(lson[p],l,mid,L,R,a,b,c);if(mid<R)query(rson[p],mid+1,r,L,R,a,b,c);
}int main()
{LL n,m;cin>>n>>m;LL l=1,r=n;LL root=++cnt;for(LL i=0;i<m;++i){LL option;cin>>option;LL L,R;cin>>L>>R;switch (option){case 1:LL a,b,c;cin>>a>>b>>c;add(root,l,r,L,R,a,b,c);break;case 2:LL k;cin>>k;mul(root,l,r,L,R,k);break;case 3:rotate(root,l,r,L,R);break;case 4:LL f=0,d=0,e=0;query(root,l,r,L,R,f,d,e);cout<<((f%MOD)*(f%MOD)%MOD+(d%MOD)*(d%MOD)%MOD+(e%MOD)*(e%MOD)%MOD)%MOD<<endl;break;}}return 0;
}

CCF认证考试 202012-5星际旅行 (100分)(线段树)相关推荐

  1. CCF认证 201712-4 行车路线(100分)

    CCF认证 201712-4 行车路线 思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug.首先用的是是spfa的算法.但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小, ...

  2. CCF认证考试历年1、2题AC代码

    CCF认证考试历年1.2题AC代码 1.ISBN号码 #include<iostream> using namespace std;int main() {char ch;int a[3] ...

  3. ccf试题及答案java,ccf认证考试试题答案

    ccf认证考试试题答案 CCF,中国计算机学会,英文全称为China Computer Federation,简称CCF,成立于1962年,是中国计算机科学与技术领域群众性学术团体,属一级学会,独立法 ...

  4. CCF认证考试——称检测点查询

    **CCF认证考试--称检测点查询** 前言 一.题目 1.题目背景 2.问题描述 3.输入格式 4.输出格式 5.样例 二.解题思路 三.示例代码 四.总结 前言 基于python的解题思路于代码实 ...

  5. CCF认证考试——报数

    **CCF认证考试--报数** 前言 一.题目 二.解题思路 三.示例代码 四.总结 前言 基于python的解题思路于代码实现,新手入门,可能写得不好,欢迎留言交流学习 提示:以下是本篇文章正文内容 ...

  6. CCF认证考试——线性分类器

    **CCF认证考试--线性分类器** 前言 一.题目 二.解题思路 三.示例代码 四.总结 前言 基于python的解题思路与代码实现,新手入门,可能写得不好,欢迎留言交流学习 提示:以下是本篇文章正 ...

  7. CCF-CSP认证历年真题解(100分)

    转载: 链接出自:https://blog.csdn.net/tigerisland45/article/details/54755895 CCF-CSP认证历年真题解–python语言 CCF-CS ...

  8. CCF认证考试题解目录

    针对历年考题,编写自己的解题程序,在官方网站上提交,了解得分.这个做法可以了解自己的编程水平,找出自己的不足.这样便可以有针对性地改进自己的不足之处,提高考试成绩. 传送门:CCF模拟测试 登录后出现 ...

  9. CCF认证考试题解目录(持续更新)

    该认证考试代码均采用C++语言来进行编写!!! 2020 CCF认证-20200901-称检测点查询 CCF认证-20200902-风险人群筛查 CCF认证-20200903-点亮数字人生 CCF认证 ...

最新文章

  1. jdbcpingquery mysql_JDBC - liuping - 博客园
  2. 2009江民中国大陆地区计算机网络安全报告
  3. python爬虫可以干什么-Python 爬虫一 简介
  4. Linux常用20个命令
  5. Java的多线程以及内存模型的知识点梳理,有想到过这些吗?
  6. make[1]: *** [objs/Makefile:445: objs/src/core/ngx_murmurhash.o] Error
  7. android mvp模式到底好,Android中MVP设计模式
  8. 如何解决Alreader不自动滚动
  9. Alexa | Alexa Auto SDK 概述
  10. 甲骨文裁员,华大人员瘦身优化,亚马逊鼓励离职?
  11. 【绝知此事要躬行】线性表之链表OJ(上)
  12. 冰汽时代机器人不用热_如何评价游戏《冰汽时代》?
  13. oracle 查看进程
  14. Python数据可视化第 7 讲:matplotlib绘制直方图函数hist
  15. vimdesktop --goreliu 版本配置
  16. 【luogu P4036】【ybt金牌导航4-5-3】火星人
  17. python实现文本查重系统_NLP之gensim库python实现文本相似度/匹配/查重
  18. 处理nginx 文件服务器 ,log文件中文乱码
  19. (五)进程的生命周期——诞生:fork、vfork、clone、内核线程(待续)
  20. 关于FCC认证的,部分题型做个记录

热门文章

  1. SSM整合+视频网站开发
  2. python treeview insert_pythonttkinter Treeview添加图像作为列值
  3. Oculus CTO卡马克:延迟背后的真相
  4. Linux-CentOS 打造合适的科研环境
  5. 基于51单片机的智能化交通灯控制系统防止堵车疏散系统方案原理图程序设计
  6. 危鸡之夜服务器维护,2018热门对战竞技游戏大盘点
  7. 《windows 程序设计》中的翻译错误----学习笔记
  8. 【微信小程序】在组件中刷新页面
  9. 开发者测评:阿里云 ACR 与其他的镜像仓库到底有什么不同?
  10. 麻省理工学院计算机博士奖学金,麻省理工学院读博及费用奖学金情况