CodeForces 718C Sasha and Array
线段树。
线段树维护区间矩阵和,操作都是最简单的线段树。$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<bitset>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*+c-''; c=getchar();}
} int mod=1e9+;
const int maxn=;
struct Matrix
{
int A[][]; int R,C;
}s[*maxn],t[*maxn];
int n,m;
Matrix Q,Z,P; Matrix ch(Matrix a,Matrix b)
{
Matrix c;
int i, j, k;
for (i = ; i <= a.R; i++)
for (j = ; j <= b.C; j++){
c.A[i][j]=;
for (k = ; k <= a.C; k++){
LL aa=(LL)a.A[i][k],bb=(LL)b.A[k][j];
LL cc=aa*bb%(LL)mod;
int dd=(int)cc;
c.A[i][j] = (c.A[i][j] + dd)%mod;
}
}
c.R=a.R; c.C=b.C;
return c;
} Matrix pow(LL p)
{
Matrix X,Y; X.R=; X.C=; Y.R=; Y.C=; Y.A[][]=; Y.A[][]=;
Y.A[][]=; Y.A[][]=; X.A[][]=; X.A[][]=;
X.A[][]=; X.A[][]=; while (p)
{
if (p % == ) Y = ch(Y,X);
p = p >> ;
X = ch(X,X);
}
return Y;
} void pushUp(int rt)
{
s[rt].R=; s[rt].C=;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
} bool check(Matrix x)
{
if(x.A[][]!=) return ;
if(x.A[][]!=) return ;
if(x.A[][]!=) return ;
if(x.A[][]!=) return ;
return ;
} void pushDown(int rt)
{
if(check(t[rt])==) return; s[*rt]=ch(s[*rt],t[rt]); t[*rt]=ch(t[*rt],t[rt]);
s[*rt+]=ch(s[*rt+],t[rt]); t[*rt+]=ch(t[*rt+],t[rt]); t[rt].A[][]=; t[rt].A[][]=;
t[rt].A[][]=; t[rt].A[][]=;
} void build(int l,int r,int rt)
{
t[rt].A[][]=; t[rt].A[][]=;
t[rt].A[][]=; t[rt].A[][]=;
t[rt].R=; t[rt].C=; if(l==r)
{
LL x; scanf("%lld",&x); s[rt].R=; s[rt].C=;
s[rt].A[][]=; s[rt].A[][]=;
s[rt].A[][]=; s[rt].A[][]=; s[rt]=ch(s[rt],pow(x-));
return;
} int m=(l+r)/;
build(l,m,*rt);
build(m+,r,*rt+);
pushUp(rt);
} void update(int L,int R,LL x,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
s[rt]=ch(s[rt],P);
t[rt]=ch(t[rt],P);
return ;
} int m=(l+r)/;
pushDown(rt);
if(L<=m) update(L,R,x,l,m,*rt);
if(R>m) update(L,R,x,m+,r,*rt+);
pushUp(rt);
} void add(Matrix a)
{
Q.A[][]=(Q.A[][]+a.A[][])%mod;
Q.A[][]=(Q.A[][]+a.A[][])%mod;
Q.A[][]=(Q.A[][]+a.A[][])%mod;
Q.A[][]=(Q.A[][]+a.A[][])%mod;
} void get(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) { add(s[rt]); return ; } int m=(l+r)/;
pushDown(rt);
if(L<=m) get(L,R,l,m,*rt);
if(R>m) get(L,R,m+,r,*rt+);
pushUp(rt);
} int main()
{
scanf("%d%d",&n,&m);
build(,n,);
for(int i=;i<=m;i++)
{
int op; scanf("%d",&op);
int L,R; scanf("%d%d",&L,&R);
if(op==)
{
LL x; scanf("%lld",&x);
P=pow(x); update(L,R,x,,n,);
}
else
{
Q.R=; Q.C=; memset(Q.A,,sizeof Q.A);
get(L,R,,n,);
Z.R=; Z.C=; Z.A[][]=; Z.A[][]=;
Z=ch(Z,Q);
printf("%d\n",Z.A[][]);
}
}
return ;
}
CodeForces 718C Sasha and Array的更多相关文章
- Codeforces 718C. Sasha and Array(线段树)
传送门 解题思路: 这道题给了我们一个崭新的角度来看线段树. 我们常常使用的线段树是维护区间的函数的. 这里呢,提示我们线段树其实还可以维护递推. 美好的矩阵递推性质支持了这一功能. 或者说,对于递推 ...
- 718C Sasha and Array
传送门 题目 Sasha has an array of integers a1, a2, ..., an. You have to perform m queries. There might be ...
- [CF 718C] Sasha and Array
传送门 Solution 用线段树维护矩阵 第一个操作相当于区间乘 第二个操作相当于区间求和 Code #include<bits/stdc++.h> #define ll long l ...
- 【codeforces 718 C&D】C. Sasha and Array&D. Andrew and Chemistry
C. Sasha and Array 题目大意&题目链接: http://codeforces.com/problemset/problem/718/C 长度为n的正整数数列,有m次操作,$o ...
- Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵
E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...
- codeforces 719E E. Sasha and Array(线段树)
题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...
- Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树
E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input standard ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- Codeforces 442C Artem and Array(stack+贪婪)
题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...
随机推荐
- HTTP 报文中的 Header 字段进行身份验证
[小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证 在一些 Web 系统中,身份验证是依靠硬件证书进行的:在电脑上插入 USB 证书,浏览器插件读 ...
- 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型
.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型 ...
- CHD4 impala安装配置
impala基于CHD,提供针对HDFS,hbase的实时查询,查询语句类似于hive 包括几个组件 Clients:提供Hue, ODBC clients, JDBC clients, and th ...
- 增删查改-MySQL
查询: 在MySQL中,select的基本语法形式: select 属性列表 from 表名和视图 [where 条件表达式] [group by 属性名 [having 条件表达式]] [order ...
- c# 发邮件功能
using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using Sy ...
- redis 中文存储乱码问题
在redis 中存储中文,读取会出现乱码(其实不是乱码,只是不是我们存的中文显示) redis> set test "我们" OK redis> get test &q ...
- TFS二次开发、C#知识点、SQL知识
TFS二次开发.C#知识点.SQL知识总结目录 TFS二次开发系列 TFS二次开发系列:一.TFS体系结构和概念 TFS二次开发系列:二.TFS的安装 TFS二次开发系列:三.TFS二次开发的第一 ...
- UNIX系统接口
UNIX系统接口 8.1 文件描述符 UNIX操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件.系统通过文件描述符来标识文件:标准输入为0,标准输出为1,标准错误为2. 当程序 ...
- springMVC3学习(四)--访问静态文件如js,jpg,css
如果你的DispatcherServlet拦截的是*.do这样的URL,就不存在访问不到静态资源的问题 如果你的DispatcherServlet拦截了"/"所有的请求,那同时对* ...
- Matlab下多径衰落信道的仿真
衰落信道参数包括多径扩展和多普勒扩展.时不变的多径扩展相当于一个延时抽头滤波器,而多普勒扩展要注意多普勒功率谱密度,通常使用Jakes功率谱.高斯.均匀功率谱. 多径衰落信道由单径信道叠加而成,而单径 ...