按书上思路写了三个小时才发现书上思路是错的,现在要在现代码上修改甚至不如换思路重写,最痛苦的一集
还差一点点优化就能AC的TLE代码:
#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e5+5;
[N]={0};
ll a[N<<2],sum2[N<<2],sum3[N<<2];
ll tree=10007;
ll modstruct t
{
int add,mul;
bool dif;
}tag[N<<2];
inline ll ls(ll p){return p<<1;}
inline ll rs(ll p){return p<<1|1;}
void push_up(ll p)
{
[p]=(tree[ls(p)]+tree[rs(p)])%mod;
tree[p]=(sum2[ls(p)]+sum2[rs(p)])%mod;
sum2[p]=(sum3[ls(p)]+sum3[rs(p)])%mod;
sum3}
void build(ll p,ll pl,ll pr)
{
[p].add=0;tag[p].mul=1;
tag[p].dif=true;
tagif(pl==pr)
{
[p]=sum2[p]=sum3[p]=0;
treereturn;
}
=(pl+pr)>>1;
ll mid(ls(p),pl,mid);
build(rs(p),mid+1,pr);
build}
void addtag_add(ll p,ll pl,ll pr,ll d)
{
[p].add=(tag[p].add+d)%mod;
tag[p]=(sum3[p]+d*d*d*(pr-pl+1)%mod+3*d*sum2[p]%mod+3*d*d*tree[p]%mod)%mod;
sum3[p]=(sum2[p]+(pr-pl+1)*d*d%mod+2*tree[p]*d%mod)%mod;
sum2[p]=(tree[p]+d*(pr-pl+1)%mod)%mod;
tree}
void addtag_mul(ll p,ll pl,ll pr,ll d)
{
[p].mul=tag[p].mul*d%mod;
tag[p].add=d*tag[p].add%mod;
tag[p]=d*tree[p]%mod;
tree[p]=d*d*sum2[p]%mod;
sum2[p]=d*d*d%mod*sum3[p]%mod;
sum3}
void push_down(ll p,ll pl,ll pr)
{
=(pl+pr)>>1;
ll mid(ls(p),pl,mid,tag[p].mul);
addtag_mul(rs(p),mid+1,pr,tag[p].mul);
addtag_mul(ls(p),pl,mid,tag[p].add);
addtag_add(rs(p),mid+1,pr,tag[p].add);
addtag_add[p].mul=1;tag[p].add=0;
tag[p].dif=false;
tag[ls(p)].dif=tag[rs(p)].dif=true;
tag}
void update_add(ll L,ll R,ll p,ll pl,ll pr,ll d)
{
if(L<=pl&&pr<=R)
{
(p,pl,pr,d);
addtag_addreturn;
}
(p,pl,pr);
push_down=(pl+pr)>>1;
ll midif(L<=mid)
(L,R,ls(p),pl,mid,d);
update_addif(R>mid)
(L,R,rs(p),mid+1,pr,d);
update_add(p);
push_up}
void update_mul(ll L,ll R,ll p,ll pl,ll pr,ll d)
{
if(L<=pl&&pr<=R)
{
(p,pl,pr,d);
addtag_mulreturn;
}
(p,pl,pr);
push_down=(pl+pr)>>1;
ll midif(L<=mid)
(L,R,ls(p),pl,mid,d);
update_mulif(R>mid)
(L,R,rs(p),mid+1,pr,d);
update_mul(p);
push_up}
void update_change(ll L,ll R,ll p,ll pl,ll pr,ll c)
{
if(pl==pr)
{
[p]=c;sum2[p]=c*c%mod;sum3[p]=c*c*c%mod;
tree[p].add=0;tag[p].mul=1;
tagreturn;
}
if(L<=pl&&pr<=R)
{
[p]=c*(pr-pl+1)%mod;
tree[p]=c*c*(pr-pl+1)%mod;
sum2[p]=c*c*c%mod*(pr-pl+1)%mod;
sum3}
=(pl+pr)>>1;
ll midif(L<=mid)
(L,R,ls(p),pl,mid,c);
update_changeif(R>mid)
(L,R,rs(p),mid+1,pr,c);
update_change(p);
push_up}
(ll L,ll R,ll p,ll pl,ll pr)
ll query{
if(L<=pl&&pr<=R)
return tree[p];
(p,pl,pr);
push_down=0;
ll ans=(pl+pr)>>1;
ll midif(L<=mid)
+=query(L,R,ls(p),pl,mid)%mod;
ansif(R>mid)
+=query(L,R,rs(p),mid+1,pr)%mod;
ansreturn ans%mod;
}
(ll L,ll R,ll p,ll pl,ll pr)
ll query2{
if(L<=pl&&pr<=R)
return sum2[p];
(p,pl,pr);
push_down=0;
ll ans=(pl+pr)>>1;
ll midif(L<=mid)
+=query2(L,R,ls(p),pl,mid)%mod;
ansif(R>mid)
+=query2(L,R,rs(p),mid+1,pr)%mod;
ansreturn ans%mod;
}
(ll L,ll R,ll p,ll pl,ll pr)
ll query3{
if(L<=pl&&pr<=R)
return sum3[p];
(p,pl,pr);
push_down=0;
ll ans=(pl+pr)>>1;
ll midif(L<=mid)
+=query3(L,R,ls(p),pl,mid)%mod;
ansif(R>mid)
+=query3(L,R,rs(p),mid+1,pr)%mod;
ansreturn ans%mod;
}
// void dfs(ll p,ll pl,ll pr)
// {
// if(pl==pr)
// {
// cout<<tree[p]<<' ';
// return;
// }
// ll mid=(pl+pr)>>1;
// dfs(ls(p),pl,mid);
// dfs(rs(p),mid+1,pr);
// }
int main() {
::sync_with_stdio(false);
iosint n,m;
while(scanf("%d %d",&n,&m))
{
if(n==0&&m==0)
break;
(1,1,n);
buildwhile(m--)
{
int op,l,r,x;
("%d %d %d %d",&op,&l,&r,&x);
scanfif(op==1)
(l,r,1,1,n,x);
update_addelse if(op==2)
(l,r,1,1,n,x);
update_mulelse if(op==3)
(l,r,1,1,n,x);
update_changeelse if(op==4)
{
if(x==1)
<<query(l,r,1,1,n)%mod<<'\n';
coutelse if(x==2)
<<query2(l,r,1,1,n)%mod<<'\n';
coutelse if(x==3)
<<query3(l,r,1,1,n)%mod<<'\n';
cout}
// dfs(1,1,n);
// cout<<'\n';
}
}
return 0;
}