「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\)种颜色的联通快最小的权值和,判断 ...
随机推荐
- Ionic项目的建立
Ionic建立android项目的过程 1.cmd到目标盘文件,此处为D:\Dev\sourcecode\IonicApp\FlexApp\CaseStudy,执行ionic start CaseSt ...
- ORA-00020:maximum number of processes (150) exceeded
异常的含义 超过最大的进程数 我们使用下面的语句可以查看与进程(process)的相关参数: 如上所示,这里的最大进程数是150. 问题可能存在的原因 1.应用程序在使用数据库连接池时,使用完成后没有 ...
- .NET小笔记-NPOI读取excel内容到DataTable
下载比较新的NPOI组件支持excel2007以上的,把.dll添加引用 引入命名空间 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using ...
- LInq之Take Skip TakeWhile SkipWhile Reverse Union Concat 用法
废话不多说,直接上代码,代码有注释!自行运行测试! class Program { static void Main(string[] args) { string[] names = { " ...
- [Spark][Python]Mapping Single Rows to Multiple Pairs
Mapping Single Rows to Multiple Pairs目的: 把如下的这种数据, Input Data 00001 sku010:sku933:sku02200002 sku912 ...
- Qt实现软件自动更新的一种简单方法
前言 最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种简单的方式来实现.实现效果如下: 点击"检查更新&quo ...
- JVM规范系列第6章:Java虚拟机指令集
一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成. 虚拟机指令 = 操作码 + 操作数. 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别 ...
- 程序员眼中的Redis
Redis 是用C语言编写的内存中的数据结构存储系统,可以用来作数据库.缓存.消息中间件. 数据结构 字符串(strings):值是任何种类的字符串 散列(hashs):值是map 字典,数组+链表, ...
- Jenkins持续集成构建自动化测试项目
1.配置内容安全策略(配置一次): 1.1.构建一个自由风格的软件项目 1.2.Build Triggers:Build when job nodes start 1.3.Build:Execute ...
- CF367C. Hard problem
链接[http://codeforces.com/group/1EzrFFyOc0/contest/706/problem/C] 题意: 他希望它们按词典顺序排序(就像字典中那样),但他不允许交换其中 ...