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

题解自己写了一份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. mongodb学习(四)CRUD操作

    CRUD操作: 1. 插入操作: 直接使用 insert可执行单个操作,也可以执行批量操作 书上的batchInsert会报错.似乎被废弃了. db.foo.insert({"bar&quo ...

  2. IOS开发-UI学习-使用代码创建button

    使用代码创建button分5个步骤,分别是: 1.定义一个按钮,根据定义位置不同可定义为局部变量或者全局变量: 2.初始化按钮,一般使用一个矩形初始化: 3.设置按钮控件的其他属性,如背景图片,或者背 ...

  3. [Angular Tutorial] 13 -REST and Custom Services

    在这一步中,我们将会改变我们获取数据的方式. ·我们定义一个代表RESTful客户端的自定义服务.使用这个客户端,我们可以用一种更简单的方法向服务端请求数据,而不用处理更底层的$httpAPI,HTT ...

  4. Python爬虫框架Scrapy安装使用步骤

    一.爬虫框架Scarpy简介Scrapy 是一个快速的高层次的屏幕抓取和网页爬虫框架,爬取网站,从网站页面得到结构化的数据,它有着广泛的用途,从数据挖掘到监测和自动测试,Scrapy完全用Python ...

  5. Android 使用AsyncTask 下载图片的例子,学会使用AsyncTask

    1.添加布局文件:activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  6. ipyparallel 中的 pi的求法

    1.PI的求法的数学依据 如图,可以看见在边长为1的正方形里面,有一个1/4圆,我们随机在正方形中取点,点在圆内的概率和点在正方形内的概率之比正好为两者的面积之比.这样就有在圆内的点的数目比所有点的数 ...

  7. eclipse 工具栏修改

    本来和同学约好一起去吃饭的,刚电话说有亲戚过来了,叫我一起去吃 哪有那个闲心,去陪他们吃饭 刚好,把这个一起写了 相信很多人会很烦,eclipse的工具栏太多了,折了一行下来,看着不好看,还烦(本人觉 ...

  8. centos 6.5下安装文件上传下载服务

    centos 6.5下安装文件上传下载服务 由于每次在CentOS中要下载一些配置文件到物理机,和上传一些文件到服务器,导致来回的开启ftp软件有点麻烦,这里我们可以使用文件上传下载服务,来解决上传和 ...

  9. iOS 之 深复制、浅复制

    深复制不仅复制对象本身,对象持有的属性对象也做了复制. 浅复制之复制对象本身,不对里面的属性进行复制.

  10. OBJECT和EMBED标签

    一.介绍: 我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标 签.也就是OBJECT和EMBED标签.OBJECT标签是用于windows平台的IE浏览器的,而EMBED ...