BZOJ 4085:[Sdoi2015]quality(round 2 音质检测)(数据结构)
居然在考场上把这道题打出来了觉得自己也是有点吊啊(虽然后面就没时间做其他题了囧而且还被卡常数了。。。)
题解自己写了一份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 音质检测)(数据结构)的更多相关文章
- BZOJ4085: [Sdoi2015]音质检测
		
BZOJ4085: [Sdoi2015]音质检测 由于这题太毒了,导致可能会被某些人卡评测,于是成了一道权限题... 本蒟蒻表示没钱氪金... 但是可以去洛谷/Vijos搞搞事... 但是洛谷上只能评 ...
 - bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
		
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
 - BZOJ 4085:[Sdoi2015]bigyration(SDOI 2015 round 2 Day 1)
		
别人家的神选系列.Day2根本不能做QAQ 题目描述:给定两个字符串集合,一个长度为n,另一个为m,求有多少个数字对i,j,满足xi+yj能由一个(n+m)/2的字符串旋转拼接而成 我们枚举长度较长的 ...
 - BZOJ 4089:[Sdoi2015]graft(SDOI 2015 Round 2 Day 2)
		
别人家的神选系列,我只会做这道题QAQ 题目描述: 给定一颗树,加上k条边,将n个点染色,相邻两点不同,记颜色为i的又ti个,求$$\frac{\sum_{i=1}^{n} \frac{ti}{i}} ...
 - 洛谷 P3328 【[SDOI2015]音质检测】
		
这题我做的好麻烦啊... 一开始想分块来着,后来发现可以直接线段树 首先考虑一个性质,我们如果有数列的相邻两项f[i]和 f[i+1]那么用这两项向后推k项其线性表示系数一定(表示为f[i+k]=a∗ ...
 - [BZOJ 3992][SDOI2015]序列统计
		
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 2275 Solved: 1090[Submit][Stat ...
 - BZOJ 3994: [SDOI2015]约数个数和
		
3994: [SDOI2015]约数个数和 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 898 Solved: 619[Submit][Statu ...
 - BZOJ 3992: [SDOI2015]序列统计 NTT+快速幂
		
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1155 Solved: 532[Submit][Statu ...
 - [BZOJ 3995] [SDOI2015] 道路修建 【线段树维护连通性】
		
题目链接:BZOJ - 3995 题目分析 这道题..是我悲伤的回忆.. 线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页 ...
 
随机推荐
- bzoj1070 修车&& bzoj2879美食节 【费用流】
			
bzoj1070: 把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]. #include ...
 - JQuery中 json 和字符串直接相互转换
			
json字符串转json对象:jQuery.parseJSON(jsonStr); json对象转json字符串:JSON.stringify(jsonObj); IE中可能对unicode使用“ ...
 - UVa 459 - Graph Connectivity
			
题目大意:给你一个无向图的顶点和边集,让你求图中连通分量的个数.使用并查集解决. #include <cstdio> #include <cstring> #define MA ...
 - Python3基础 lambda表达式 简单示例
			
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
 - poi jar包介绍
			
来自官网: Component Application type Maven artifactId Notes POIFS OLE2 Filesystem poi Required to work w ...
 - HTML5学习笔记三:aside元素,time元素与微格式
			
一.aside元素 表示当前页面或文章的附属信息部分,相关的引用,侧边栏,广告等有别于主要内容的部分:主要有一下两种用法: 1. 被包含在article元素中作为主要内容的附属信息部分,可以是与当前文 ...
 - C# Winform窗口之间传值的多种方法浅析(转)
			
摘要http://www.jb51.net/article/63837.htm 这篇文章主要介绍了C# Winform窗口之间传值的多种方法浅析,本文起讲解了通过构造器传值.通过属性传递.通过事件携带 ...
 - Python. Day1. 之初识  变量数据类型
			
稍后添加 一 介绍 二 变量
 - Bootstrap 输入组
			
Bootstrap 输入组: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
 - HTTP协议系列(3)---包括WebSocket简单介绍
			
一.HTTPS HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼? 1.通信使用的明文(不加密),内容 ...