居然在考场上把这道题打出来了觉得自己也是有点吊啊(虽然后面就没时间做其他题了囧而且还被卡常数了。。。)

题解自己写了一份TEX的就直接放上来吧。。。。

好啦,在谈点什么别的

什么?你在bz上TLE了?注意一下你的矩阵乘法,这个程序的大部分时间几乎都是跑矩阵乘法的,我是从900000次到600000次在到300000次最后预处理那些2的次幂才过的。把OJ卡了好久真是对不起啊QAQ

CODE:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 300010
#define mod 1000000007
typedef long long ll;
inline ll power(ll x,int y) {
ll ans=;
for (;y;y>>=) {
if (y&) (ans*=x)%=mod;
(x*=x)%=mod;
}
return ans;
}
struct node{
int l,r,ch[][],lz[],s[][];
inline void print() {
printf("%d %d\n",l,r);
for (int i=;i<;i++,puts(""))
for (int j=;j<;j++) printf("%d ",ch[i][j]);
for (int i=;i<;i++,puts(""))
for (int j=;j<;j++) printf("%d ",s[i][j]);
printf("%d %d\n",lz[],lz[]);
}
}t[maxn*];
#define lc (x<<1)
#define rc (lc^1)
#define mid ((l+r)>>1)
inline void update(int x){
for (int i=;i<;i++)
for (int j=;j<;j++) t[x].ch[i][j]=(t[lc].ch[i][j]+t[rc].ch[i][j])%mod;
for (int i=;i<;i++)
for(int j=;j<;j++) t[x].s[i][j]=(t[lc].s[i][j]+t[rc].s[i][j])%mod;
}
int a,b,inv;
inline void add(int x,int l){
for (int i=;i<;i++) t[x].s[l][i]=t[x].s[l][i+];
t[x].s[l][]=(t[x].s[l][]*1ll+t[x].s[l][]*1ll*a%mod+b*1ll*(t[x].r-t[x].l+)%mod)%mod;
if (l==) {
for (int i=;i<;i++)
for (int j=;j<;j++) t[x].ch[i][j]=t[x].ch[i+][j];
for (int i=;i<;i++)
t[x].ch[][i]=(t[x].ch[][i]*1ll+t[x].ch[][i]*1ll*a%mod+b*1ll*t[x].s[][i]%mod)%mod;
}
if (l==) {
for (int i=;i<;i++)
for (int j=;j<;j++) t[x].ch[j][i]=t[x].ch[j][i+];
for (int i=;i<;i++)
t[x].ch[i][]=(t[x].ch[i][]*1ll+t[x].ch[i][]*1ll*a%mod+b*1ll*t[x].s[][i]%mod)%mod;
}
}
inline void dec(int x,int l){
if (a==) {
for (int i=;i+;i--) t[x].s[l][i+]=t[x].s[l][i];
t[x].s[l][]=(t[x].s[l][]-b*1ll*(t[x].r-t[x].l+)%mod+mod)%mod;
if (l==) {
for (int i=;i+;i--)
for (int j=;j<;j++) t[x].ch[i+][j]=t[x].ch[i][j];
for (int i=;i<;i++)
t[x].ch[][i]=(t[x].ch[][i]-b*1ll*t[x].s[][i]%mod+mod)%mod;
}
if (l==) {
for (int i=;i+;i--)
for (int j=;j<;j++) t[x].ch[j][i+]=t[x].ch[j][i];
for (int i=;i<;i++)
t[x].ch[i][]=(t[x].ch[i][]-b*1ll*t[x].s[][i]%mod+mod)%mod;
}
return;
}
for (int i=;i+;i--) t[x].s[l][i+]=t[x].s[l][i];
t[x].s[l][]=((t[x].s[l][]*1ll-t[x].s[l][]-b*1ll*(t[x].r-t[x].l+)%mod)%mod*inv%mod+mod)%mod;
if (l==) {
for (int i=;i+;i--)
for (int j=;j<;j++) t[x].ch[i+][j]=t[x].ch[i][j];
for (int i=;i<;i++)
t[x].ch[][i]=((t[x].ch[][i]*1ll-t[x].ch[][i]-b*1ll*t[x].s[][i]%mod)%mod*inv%mod+mod)%mod;
}
if (l==) {
for (int i=;i+;i--)
for (int j=;j<;j++) t[x].ch[j][i+]=t[x].ch[j][i];
for (int i=;i<;i++)
t[x].ch[i][]=((t[x].ch[i][]*1ll-t[x].ch[i][]-b*1ll*t[x].s[][i]%mod)%mod*inv%mod+mod)%mod;
}
}
inline void pushback(int x,int y,int z) {
if (z>)
for (int i=;i<=z;i++) add(x,y);
if (z<)
for (int i=-;i>=z;i--) dec(x,y);
}
inline void pb(int x) {
for (int l=;l<=;l++){
pushback(lc,l,t[x].lz[l]);
pushback(rc,l,t[x].lz[l]);
t[lc].lz[l]+=t[x].lz[l];
t[rc].lz[l]+=t[x].lz[l];
t[x].lz[l]=;
}
}
int A[maxn][];
inline void build (int x,int l,int r) {
t[x].l=l,t[x].r=r;
if (l==r) {
for (int i=;i<;i++) {
t[x].s[][i]=A[l-][i+];
t[x].s[][i]=A[l+][i+];
}
for (int i=;i<;i++)
for (int j=;j<;j++)
t[x].ch[i][j]=t[x].s[][i]*1ll*t[x].s[][j]%mod;
return ;
}
build(lc,l,mid);build(rc,mid+,r);
update(x);
}
inline void add(int x,int x1,int y1,int y,int z) {
int l=t[x].l,r=t[x].r;
if (l>y1||r<x1) return ;
if (x1<=l&&r<=y1) {
t[x].lz[y]+=z;
pushback(x,y,z);
return ;
}
pb(x);
add(lc,x1,y1,y,z);add(rc,x1,y1,y,z);
update(x);
}
inline int que(int x,int x1,int y1) {
int l=t[x].l,r=t[x].r;
if (l>y1||r<x1) return ;
if (x1<=l&&r<=y1) return t[x].ch[][];
pb(x);
return (que(lc,x1,y1)+que(rc,x1,y1))%mod;
}
struct marix{
int r,c,a[][];
marix(){r=c=,memset(a,,sizeof(a));}
void init(){r=c=;for (int i=;i<;i++) a[i][i]=;}
void print(){
printf("%d %d\n",r,c);
for (int i=;i<r;i++,puts(""))
for (int j=;j<c;j++) printf("%d ",a[i][j]);
}
};
marix operator *(marix x,marix y) {
marix ans;
ans.r=x.r;ans.c=y.c;
for (int i=;i<ans.r;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
(ans.a[i][j]+=x.a[i][k]*1ll*y.a[k][j]%mod)%=mod;
ans.a[][]=;
return ans;
}
marix f[];
marix pow(int y) {
marix ans;
int x=;
ans.init();
for (;y;y>>=,x++)
if (y&) ans=ans*f[x];
return ans;
}
marix mx,my;
int get(int x){
marix tmp=my*pow(A[x][]-);
A[x][]=tmp.a[][];
A[x][]=tmp.a[][];
}
int main(){
int n,q;
scanf("%d%d%d%d",&n,&q,&a,&b);
inv=power(a,mod-);
mx.r=mx.c=;mx.a[][]=,mx.a[][]=a,mx.a[][]=b;
mx.a[][]=,mx.a[][]=;
for (int i=;i<=;i++) {
f[i]=mx;
mx=mx*mx;
}
my.r=;my.c=;
my.a[][]=,my.a[][]=,my.a[][]=;
for (int i=;i<=n;i++) {
scanf("%d",A[i]);
get(i);
A[i][]=(A[i][]*1ll+A[i][]*1ll*a+b)%mod;
}
build(,,n-);
char opt[];
while (q--) {
int l,r;
scanf("%s",opt);
switch(opt[]) {
case 'p':
scanf("%d%d",&l,&r);
add(,l+,r+,,);
add(,l-,r-,,);
break;
case 'm':
scanf("%d%d",&l,&r);
add(,l+,r+,,-);
add(,l-,r-,,-);
break;
case 'q':
scanf("%d%d",&l,&r);
printf("%d\n",que(,l+,r-));
break;
}
}
return ;
}

BZOJ 4085:[Sdoi2015]quality(round 2 音质检测)(数据结构)的更多相关文章

  1. BZOJ4085: [Sdoi2015]音质检测

    BZOJ4085: [Sdoi2015]音质检测 由于这题太毒了,导致可能会被某些人卡评测,于是成了一道权限题... 本蒟蒻表示没钱氪金... 但是可以去洛谷/Vijos搞搞事... 但是洛谷上只能评 ...

  2. bzoj 3991: [SDOI2015]寻宝游戏 虚树 set

    目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...

  3. BZOJ 4085:[Sdoi2015]bigyration(SDOI 2015 round 2 Day 1)

    别人家的神选系列.Day2根本不能做QAQ 题目描述:给定两个字符串集合,一个长度为n,另一个为m,求有多少个数字对i,j,满足xi+yj能由一个(n+m)/2的字符串旋转拼接而成 我们枚举长度较长的 ...

  4. BZOJ 4089:[Sdoi2015]graft(SDOI 2015 Round 2 Day 2)

    别人家的神选系列,我只会做这道题QAQ 题目描述: 给定一颗树,加上k条边,将n个点染色,相邻两点不同,记颜色为i的又ti个,求$$\frac{\sum_{i=1}^{n} \frac{ti}{i}} ...

  5. 洛谷 P3328 【[SDOI2015]音质检测】

    这题我做的好麻烦啊... 一开始想分块来着,后来发现可以直接线段树 首先考虑一个性质,我们如果有数列的相邻两项f[i]和 f[i+1]那么用这两项向后推k项其线性表示系数一定(表示为f[i+k]=a∗ ...

  6. [BZOJ 3992][SDOI2015]序列统计

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 2275  Solved: 1090[Submit][Stat ...

  7. BZOJ 3994: [SDOI2015]约数个数和

    3994: [SDOI2015]约数个数和 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 898  Solved: 619[Submit][Statu ...

  8. BZOJ 3992: [SDOI2015]序列统计 NTT+快速幂

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1155  Solved: 532[Submit][Statu ...

  9. [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】

    题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过  1018,即使它在 ProblemSet 的第一页 ...

随机推荐

  1. tp框架命名空间

    命名空间:相当于虚拟的目录在tp里面主要为了实现自动加载类 TP框架下有一个初始命名空间(相当于根目录)初始命名空间:ThinkPHP\Library 在初始命名空间下又包含很多根命名空间这些根命名空 ...

  2. 【动态规划】Gym - 101102A - Coins

    Hasan and Bahosain want to buy a new video game, they want to share the expenses. Hasan has a set of ...

  3. pyv8安装

    http://www.thinksaas.cn/topics/0/400/400915.html

  4. keystore 介绍

    Keytool 是一个有效的安全钥匙和证书的管理工具. Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存 ...

  5. iOS 加载动态库报错问题

    dyld: Library not loaded: @rpath Referenced from: Reason: no suitable image found.  Did find: 要么使用静态 ...

  6. 基于arm开发板四个按键控制四个灯亮

    基于s5pv2410,cortex a8的四个按键每一个按键点了对应的灯 对于用汇编来编程的话不难,重点在于数据手册,电路图,管脚的看懂 直接上代码 .globl _start_start: ldr ...

  7. Grunt安装中遇到的问题汇总

    Grunt安装中遇到的问题汇总 1.如果是windows下的dos中安装Grunt,必须以管理员身份登录(第一个坑) 登录方法是: 方法一:开始>所有程序>附件>命令提示符上右键&g ...

  8. css3实战版的点击列表项产生水波纹动画

    1.html+js: <!DOCTYPE html><html><head lang="en">    <meta charset=&qu ...

  9. Hibernate常见异常

    1.数据库编码问题 主要错误信息 WARN: SQL Error: 1366, SQLState: 22001 ... ERROR: Data truncation: Incorrect string ...

  10. js原生封装getClassName()方法-ie不支持getElementsByClassName,所以要自己实现获取类名为className的所有元素

    <html> <head> <script type="text/javascript"> window.onload = function() ...