社区讨论
萌新求助
学术版参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lock2aes
- 此快照首次捕获于
- 2023/10/30 15:05 2 年前
- 此快照最后确认于
- 2023/11/05 02:20 2 年前
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define int long long
#define l(x) tr[x].l
#define r(x) tr[x].r
#define sum(x) tr[x].sum
#define ff(x) tr[x].ff
#define gg(x) tr[x].gg
#define len(x) tr[x].len
const int Mod = 1e9+9;
const int N = 300005;
int n,q,a[N],f[N];
inline int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int Add(int x,int y) {return (x+y+Mod) % Mod;}
int mul(int x,int y) {return x * y % Mod;}
struct Seg{
int l,r;
int sum,ff,gg,len;
}tr[N<<2];
void spread(int x) {
if((!ff(x)) && (!gg(x))) return;
ff(x<<1) = Add(ff(x<<1),ff(x)) % Mod;
gg(x<<1) = Add(gg(x<<1),gg(x)) % Mod;
sum(x<<1) = Add(sum(x<<1),Add(mul(f[len(x<<1)],ff(x)),mul(f[len(x<<1)+1]-1,gg(x))));
ff(x<<1|1) = Add(ff(x<<1|1),Add(mul(f[len(x<<1)-1],gg(x)),mul(f[len(x<<1)-2],ff(x))));
gg(x<<1|1) = Add(gg(x<<1|1),Add(mul(f[len(x<<1)],gg(x)),mul(f[len(x<<1)-1],ff(x))));
sum(x<<1|1) = Add(sum(x<<1|1),Add(Add(Add(mul(gg(x),f[len(x)+1]-1),mul(ff(x),f[len(x)])),mul(-gg(x),f[len(x<<1)+1]-1)),mul(-ff(x),f[len(x<<1)])))
ff(x) = gg(x) = 0;
return;
}
void pushup(int x) {
sum(x) = (sum(x<<1) + sum(x<<1|1)) % Mod;
return;
}
void build(int x,int l,int r) {
l(x) = l,r(x) = r;len(x) = r-l+1;
if(l == r) {
sum(x) = ff(x) = gg(x) = 0;
return;
}
int mid = (l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
inline int query(int x,int l,int r) {
if(l <= l(x) && r(x) <= r) return sum(x);
int mid = (l(x) + r(x))>>1;
spread(x);
int val = 0;
if(l <= mid) val = (val + query(x<<1,l,r)) % Mod;
if(mid < r) val = (val + query(x<<1|1,l,r)) % Mod;
// pushup(x);
return val;
}
void change(int x,int l,int r) {
if(l <= l(x) && r <= r(x)) {
ff(x) = (ff(x) + f[l(x)-l+1]) % Mod;
gg(x) = (gg(x) + f[l(x)-l+2]) % Mod;
sum(x) = ((sum(x) + f[len(x)] * f[l(x)-l+1] % Mod) % Mod + (f[len(x)+1]-1) * f[l(x)-l+2] % Mod) % Mod;
return;
}
spread(x);
int mid = (l(x) + r(x))>>1;
if(l <= mid) change(x<<1,l,r);
if(mid < r) change(x<<1|1,l,r);
pushup(x);
}
signed main () {
n = read();q = read();
for(int i = 1;i <= n;i++) a[i] = read();
f[1] = f[2] = 1;
for(int i = 3;i <= n+2;i++) f[i] = (f[i-1] + f[i-2]) % Mod;
build(1,1,n);
while(q--) {
int opt;
opt = read();
if(opt == 1) {
int l,r;
l = read();r = read();
change(1,l,r);
}
if(opt == 2) {
int x,y;
x = read();y = read();
printf("%lld\n",query(1,x,y));
}
}
return 0;
}
这里第14行,也就是
CPP#define ff(x) tr[x].ff
提示
[Error] expected ';' before 'tr'
想知道为什么CE,求解答(或者可能是我眼瞎)
回复
共 4 条回复,欢迎继续交流。
正在加载回复...