「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师
狗体面太长,帖链接了
思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵,随便搞搞就成了,卡常
Code:
#include <cstdio>
#include <cstring>
namespace io
{
const int SIZE=(1<<21)+1;
char ibuf[SIZE],*iS,*iT,obuf[SIZE],*oS=obuf,*oT=oS+SIZE-1,c,qu[55];
int f,qr;
// getchar
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
// print the remaining part
inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
// putchar
inline void putc(char x){*oS++=x;if(oS==oT)flush();}
// input a signed integer
template <class I>
inline void read(I &x)
{
for(f=1,c=gc();c<'0'||c>'9';c=gc()) if(c=='-') f=-1;
for(x=0;c<='9'&&c>='0';c=gc()) x=x*10+(c&15);x*=f;
}
// print a signed integer
template <class I>
inline void print(I &x)
{
if(!x)putc('0');if(x<0) putc('-'),x=-x;
while(x)qu[++qr]=x%10+'0',x/=10;
while(qr)putc(qu[qr--]);
}
//no need to call flush at the end manually
struct Flusher_ {~Flusher_(){flush();}}io_flusher_;
}
using io::read;
using io::putc;
using io::print;
const int N=250010;
const int mod=998244353;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
#define mul(a,b) ((int)(1ll*(a)*(b)%mod))
struct matrix
{
int dx[4][4];
matrix(){memset(dx,0,sizeof dx);}
matrix friend operator +(matrix a,matrix b)
{
for(int i=0;i<=3;i++)
a.dx[0][i]=add(a.dx[0][i],b.dx[0][i]);
return a;
}
bool friend operator ==(matrix a,matrix b)
{
for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(a.dx[i][j]!=b.dx[i][j])
return false;
return true;
}
}I,t,yuy[N<<2],tag[N<<2];
int n,m;
#define ls id<<1
#define rs id<<1|1
void build(int id,int l,int r)
{
tag[id]=I;
if(l==r)
{
read(yuy[id].dx[0][0]),read(yuy[id].dx[0][1]),read(yuy[id].dx[0][2]);
yuy[id].dx[0][3]=1;
return;
}
int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
yuy[id]=yuy[ls]+yuy[rs];
}
void beecute(int id,matrix &a)
{
matrix bee=matrix();
for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
bee.dx[0][i]=add(bee.dx[0][i],mul(yuy[id].dx[0][j],a.dx[j][i]));
yuy[id]=bee;
memset(bee.dx,0,sizeof bee.dx);
for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
{
bee.dx[i][j]=add(bee.dx[i][j],mul(tag[id].dx[i][0],a.dx[0][j]));
bee.dx[i][j]=add(bee.dx[i][j],mul(tag[id].dx[i][1],a.dx[1][j]));
bee.dx[i][j]=add(bee.dx[i][j],mul(tag[id].dx[i][2],a.dx[2][j]));
bee.dx[i][j]=add(bee.dx[i][j],mul(tag[id].dx[i][3],a.dx[3][j]));
}
tag[id]=bee;
}
void pushdown(int id)
{
if(tag[id]==I) return;
beecute(ls,tag[id]);
beecute(rs,tag[id]);
tag[id]=I;
}
void change(int id,int L,int R,int l,int r)
{
if(l==L&&r==R){beecute(id,t);return;}
pushdown(id);
int Mid=L+R>>1;
if(r<=Mid) change(ls,L,Mid,l,r);
else if(l>Mid) change(rs,Mid+1,R,l,r);
else change(ls,L,Mid,l,Mid),change(rs,Mid+1,R,Mid+1,r);
yuy[id]=yuy[ls]+yuy[rs];
}
matrix query(int id,int L,int R,int l,int r)
{
if(l==L&&r==R) return yuy[id];
pushdown(id);
int Mid=L+R>>1;
if(r<=Mid) return query(ls,L,Mid,l,r);
else if(l>Mid) return query(rs,Mid+1,R,l,r);
else return query(ls,L,Mid,l,Mid)+query(rs,Mid+1,R,Mid+1,r);
}
int main()
{
read(n);
for(int i=0;i<=3;i++) I.dx[i][i]=1;
build(1,1,n);
read(m);
for(int op,l,r,v,i=1;i<=m;i++)
{
read(op),read(l),read(r);
if(op==7)
{
t=query(1,1,n,l,r);
print(t.dx[0][0]);
putc(' ');
print(t.dx[0][1]);
putc(' ');
print(t.dx[0][2]);
putc('\n');
continue;
}
t=I;
if(op==1) t.dx[1][0]=1;
else if(op==2) t.dx[2][1]=1;
else if(op==3) t.dx[0][2]=1;
else if(op==4) read(v),t.dx[3][0]=v;
else if(op==5) read(v),t.dx[1][1]=v;
else read(v),t.dx[3][2]=v,t.dx[2][2]=0;
change(1,1,n,l,r);
}
return 0;
}
2019.1.19
「THUSCH 2017」大魔法师 解题报告的更多相关文章
- 「THUSCH 2017」大魔法师
Description 大魔法师小 L 制作了 \(n\) 个魔力水晶球,每个水晶球有水.火.土三个属性的能量值.小 L 把这 \(n\) 个水晶球在地上从前向后排成一行,然后开始今天的魔法表演. 我 ...
- LOJ 2980 「THUSCH 2017」大魔法师——线段树
题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- @loj - 2977@ 「THUSCH 2017」巧克力
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
- LOJ #2978「THUSCH 2017」杜老师
听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...
- 「Luogu P2201」数列编辑器 解题报告
数列编辑器,在线IDE 本期的主题是洛谷的在线IDE 小学生?!小学生虐我
- loj#2978. 「THUSCH 2017」杜老师(乱搞)
题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...
- LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)
题目 题目 做法 考虑部分数据(颜色较少)的: 二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\) 具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断 ...
随机推荐
- [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树
这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...
- 2-SAT超入门讲解
Preface 说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的 还有一些板子题,由于是暑假的时候学的所以有些我也记不清了 主要学习参考自:Mancher的课件&& ...
- springboot 发送邮件+模板+附件
package com.example.demo; import org.junit.Test;import org.junit.runner.RunWith;import org.springfra ...
- vue 过滤器基本使用
Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化,例如时间戳格式化. 过滤器可以用在: 双花括号插值 v-bind 表达式 (2.1.0+ 开始支持). 过滤器应该被添加在 JavaSc ...
- CentOS安装noVNC,以Web方式交付VNC远程连接
什么是noVNC noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制 ...
- DevOps知识地图实践指南
DevOps知识地图 DevOps方法论的主要来源是Agile, Lean 和TOC, 独创的方法论是持续交付. DevOps经典图书: * <DevOps实践指南> * <持续 ...
- TRIO-basic指令--FLEXLINK
Type: Axis Command Syntax: FLEXLINK(base_dist, excite_dist, link_dist, base_in, base_out, excite_acc ...
- hdu 3038 给区间和,算出多少是错的
参考博客 How Many Answers Are Wrong Problem Description TT and FF are ... friends. Uh... very very good ...
- Individual Project-word frequency
预计时间: 项目要求理解:半小时 c#语言了解:6小时 构思程序框架:2小时 编写调试程序:4小时 项目实际完成时间: 项目要求理解:半小时 c#语言了解:6小时 构思程序框架:2小时 编写调试程序: ...
- poj 1723 SOLDIERS 带权中位数
题目 http://poj.org/problem?id=1723 题解 带权中位数类型的题目~ 可以先考虑降维,最后集合的y坐标,明显是y坐标的中位数的位置,容易求出y方向的贡献res_y.比较麻烦 ...