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 的第一页 ...
随机推荐
- iOS开发中在UIWebView中添加Gif动态图
开发是一件很有趣的事,偶尔在程序中添加一些小东西,会给你的应用增色不少.比如,当你的某些功能暂时还不准备上线时,可以先一个放展示Gif动态图的UIWebView上去,既可以告诉用户APP以后会有的功能 ...
- leangoo
leangoo网址:https://www.leangoo.com/
- TFS2013 升级至TFS2015及项目的创建
TFS2015已发布想体验下新特性 由于现有数据库已经是SQLSERVER2012 SP1 开发工具VS2013 都符合升级要求 现在体验下吧 1.先下载TFS2015 运行安装向导一路NEXT 直至 ...
- JS 中 Class - 类创建
Class - 类创建 Class类实现了在JavaScript中声明一个新的类, 并通过构造函数实例化这个类的机制.通过使用Class.create()方法, 你实际上声明了一个新的类, 并定义了一 ...
- 为什么建立TCP连接需要三次握手,为什么断开TCP连接需要四次握手,TIME_WAIT状态的意义
为什么建立TCP连接需要三次握手? 原因:为了应对网络中存在的延迟的重复数组的问题 例子: 假设client发起连接的连接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,导致延迟到达ser ...
- 云脉推出表格识别API接口可以自助接入
针对如今市场上对于海量票据信息的录入需求,近期厦门云脉技术有限公司推出票据识别相关的产品与服务,更是在云脉OCR SDK开发者平台上上线表格识别API接口,供广大开发者和集成商自助接入.为了降低财务系 ...
- Python3基础 内嵌函数 简单示例
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- IE6滤镜在实战测试中能让父层里面的子元素产生阴影
1.写法一: <div class="cornerbg"> <p class="title-file">------</p& ...
- PHP 绘图技术
1.图片格式:目前网站开发常见的图片格式有gif,jpg/jpeg,png ..... 区别: gif 图片压缩率高,但是只能显示256色,可能造成颜色的丢失,可以显示动画 jpg/jpeg 图片压缩 ...
- C标准I/O建立一个文件仓库
实现了 增删改查 创建了一个结构体 保存 num name cout price 代码 #include<stdio.h>#include<string.h>#include& ...