社区讨论
小清新数据结构 WA on #8 求调 悬关
CF1924BSpace Harbour参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mdis5s00
- 此快照首次捕获于
- 2025/07/25 20:11 7 个月前
- 此快照最后确认于
- 2025/11/04 03:44 4 个月前
如题,第二篇题解做法。

#include<bits/stdc++.h>
#define int __int128
using namespace std;
int n,m,q,x[300005],v[300005];
const int M=1000000000000000003LL;
struct node{
int l,r,sum,fa,fm;
}t[1200005];
void read(int &x){
long long y;cin>>y;x=y;
}
void write(int x){
long long y=x;cout<<y<<"\n";
}
void build(int rt,int l,int r){
t[rt].l=l,t[rt].r=r;t[rt].fm=1;if (l==r)return;
int mid=(l+r)/2;build(rt*2,l,mid);build(rt*2+1,mid+1,r);
}
void pushup(int rt){t[rt].sum=t[rt*2].sum+t[rt*2+1].sum;}
void pushdown(int rt){
if (t[rt].fm!=1){
(t[rt*2].fm*=t[rt].fm)%=M,(t[rt*2+1].fm*=t[rt].fm)%=M;
(t[rt*2].fa*=t[rt].fm)%=M,(t[rt*2+1].fa*=t[rt].fm)%=M;
(t[rt*2].sum*=t[rt].fm)%=M,(t[rt*2+1].sum*=t[rt].fm)%=M;
t[rt].fm=1;
}
if (t[rt].fa){
(t[rt*2].fa+=t[rt].fa)%=M,(t[rt*2+1].fa+=t[rt].fa)%=M;
(t[rt*2].sum+=t[rt].fa)%=M,(t[rt*2+1].sum+=t[rt].fa)%=M;
t[rt].fa=0;
}
}
int ksm(int a,int b){
if (b==0)return 1;if (b&1)return ksm(a,b^1)*a%M;
int k=ksm(a,b>>1);return k*k%M;
}
void add(int rt,int l,int r,int x){
//if (rt==1){cout<<"add";
//write(l);
//write(r);
//write(x);}
if (t[rt].l>r||t[rt].r<l)return;
if (t[rt].l>=l&&t[rt].r<=r){
(t[rt].sum+=x)%=M;(t[rt].fa+=x)%=M;return;
}
pushdown(rt);add(rt*2,l,r,x);add(rt*2+1,l,r,x);pushup(rt);
}
void mul(int rt,int l,int r,int x){
//if (rt==1){cout<<"mul";
//write(l);
//write(r);
//write(x);}
if (t[rt].l>r||t[rt].r<l)return;
if (t[rt].l>=l&&t[rt].r<=r){
(t[rt].sum*=x)%=M;(t[rt].fa*=x)%=M;(t[rt].fm*=x)%=M;return;
}
pushdown(rt);mul(rt*2,l,r,x);mul(rt*2+1,l,r,x);pushup(rt);
}
int sum(int rt,int l,int r){
if (t[rt].l>r||t[rt].r<l)return 0;
if (t[rt].l>=l&&t[rt].r<=r)return t[rt].sum;
return (sum(rt*2,l,r)+sum(rt*2+1,l,r))%M;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
read(n),read(m),read(q);
build(1,1,n);
set<int> s;
for (int i=1;i<=m;i++){
read(x[i]);
s.insert(x[i]);
}
for (int i=1;i<=m;i++){
int V;
read(V),v[x[i]]=V;
}
for (int i=2;i<n;i++){
int r=*s.lower_bound(i);
if (r!=i){
int l=*(--s.lower_bound(i));
add(1,i,i,v[l]*(r-i)%M);
}
}
for (int i=1;i<=q;i++){
int op,l,r;read(op),read(l),read(r);
if (op==2){
write(sum(1,l,r));
}
else{
int q=*s.lower_bound(l),p=*(--s.lower_bound(l));
if (p+1<=l-1)add(1,p+1,l-1,(q-l)*v[p]%M);
if (l+1<=q-1){
int x=r*ksm(v[p],M-2)%M;
mul(1,l+1,q-1,x);
}
add(1,l,l,-sum(1,l,l));
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...