非递归线段树 的常数莫名很大?

P2572 [SCOI2010] 序列操作

Naszt @ 2024-10-09 12:28:22

如题,这玩意效率不是应该超高的吗?

link

#include<bits/stdc++.h>
typedef unsigned int i4;
const i4 MX=1000005<<2;
i4 n,m,N,D,cls[MX],flip[MX];
struct Node{i4 s0,s1,m0,m1,l0,l1,r0,r1;}A[MX];
Node operator+(const Node x,const Node y){
    return {x.s0+y.s0,x.s1+y.s1,
        std::max(std::max(x.m0,y.m0),x.r0+y.l0),
        std::max(std::max(x.m1,y.m1),x.r1+y.l1),
        x.l0+(x.s1?0:y.l0),x.l1+(x.s0?0:y.l1),
        y.r0+(y.s1?0:x.r0),y.r1+(y.s0?0:x.r1)};
}void pup(i4 x){A[x]=A[x<<1]+A[x<<1|1];}
void upd(i4 x,const i4 cl,const i4 fl){
  Node&X=A[x];
    if(cl<2){const i4 l=cl*(X.s0+X.s1),r=(!cl)*(X.s0+X.s1);
        X={r,l,r,l,r,l,r,l},cls[x]=cl,flip[x]=0;
    }if(fl)std::swap(X.s0,X.s1),std::swap(X.m0,X.m1),
    std::swap(X.l0,X.l1),std::swap(X.r0,X.r1),flip[x]^=1;
}void pdn(i4 x){
  upd(x<<1,cls[x],flip[x]),upd(x<<1|1,cls[x],flip[x]);
  cls[x]=2,flip[x]=0;
}void push(i4 l,i4 r){for(i4 i=D;i;i--)pdn(l>>i),pdn(r>>i);}
void mdf(i4 l,i4 r,const i4 cl,const i4 fl){
  for(push(l+=N-1,r+=N+1);l^r^1;pup(l>>=1),pup(r>>=1)){
    if(~l&1)upd(l^1,cl,fl);if(r&1)upd(r^1,cl,fl);
  }while(l>>=1)pup(l);
}Node que(i4 l,i4 r){
  Node L,R;L=R={0,0,0,0,0,0,0,0};
  for(push(l+=N-1,r+=N+1);l^r^1;l>>=1,r>>=1){
    if(~l&1)L=L+A[l^1];if(r&1)R=A[r^1]+R;
  }return L+R;
}int main(){
  std::ios::sync_with_stdio(0);std::cin.tie(0),std::cout.tie(0);
  std::cin>>n>>m;N=1<<(D=std::__lg(n+1)+1);
  for(i4 i=N+1,x;i<=N+n;i++)
        std::cin>>x,A[i]={!x,x,!x,x,!x,x,!x,x},cls[i]=2;
  for(i4 i=N-1;i;i--)pup(i),cls[i]=2;
  while(m--){i4 op,x,y;std::cin>>op>>x>>y;++x;++y;
        if(op<3){mdf(x,y,op,op==2);continue;}
        Node X=que(x,y);std::cout<<(op==3?X.s1:X.m1)<<"\n";
  }return 0;
}

by Gcc_Gdb_7_8_1 @ 2024-10-09 12:55:43

@Naszt 马蜂差评...


by Naszt @ 2024-10-09 17:14:58

加了个 inline,卡到了最优解

#include<bits/stdc++.h>
typedef unsigned int i4;
char buf[1<<21],*p1=buf,pbuf[1<<21],*pp=pbuf;
inline i4&in(i4&x){while(!isdigit(*p1++));x=*(p1-1)^48;
  while(isdigit(*p1))x=x*10+((*p1++)^48);return x;
}inline void out(uint64_t x){
  static char s[20];i4 t=0;do s[t++]=x%10,x/=10;while(x);
  while(t)*pp++=s[--t]^48;*pp++=10;
}const i4 MX=100005<<2;
i4 n,m,N,D,cls[MX],flip[MX];
struct Node{i4 s0,s1,m0,m1,l0,l1,r0,r1;}A[MX];
inline Node operator+(const Node x,const Node y){
  return {x.s0+y.s0,x.s1+y.s1,
    std::max(std::max(x.m0,y.m0),x.r0+y.l0),
    std::max(std::max(x.m1,y.m1),x.r1+y.l1),
    x.l0+(x.s1?0:y.l0),x.l1+(x.s0?0:y.l1),
    y.r0+(y.s1?0:x.r0),y.r1+(y.s0?0:x.r1)};
}inline void pup(i4 x){A[x]=A[x<<1]+A[x<<1|1];}
inline void upd(i4 x,const i4 cl,const i4 fl){
  Node&X=A[x];
  if(cl<2){const i4 l=cl*(X.s0+X.s1),r=(!cl)*(X.s0+X.s1);
    X={r,l,r,l,r,l,r,l},cls[x]=cl,flip[x]=0;
  }if(fl)std::swap(X.s0,X.s1),std::swap(X.m0,X.m1),
    std::swap(X.l0,X.l1),std::swap(X.r0,X.r1),flip[x]^=1;
}inline void pdn(i4 x){
  upd(x<<1,cls[x],flip[x]),upd(x<<1|1,cls[x],flip[x]);
  cls[x]=2,flip[x]=0;
}inline void push(i4 l,i4 r){for(i4 i=D;i;i--)pdn(l>>i),pdn(r>>i);}
inline void mdf(i4 l,i4 r,const i4 cl,const i4 fl){
  for(push(l+=N-1,r+=N+1);l^r^1;pup(l>>=1),pup(r>>=1)){
    if(~l&1)upd(l^1,cl,fl);if(r&1)upd(r^1,cl,fl);
  }while(l>>=1)pup(l);
}inline Node que(i4 l,i4 r){
  Node L,R;L=R={0,0,0,0,0,0,0,0};
  for(push(l+=N-1,r+=N+1);l^r^1;l>>=1,r>>=1){
    if(~l&1)L=L+A[l^1];if(r&1)R=A[r^1]+R;
  }return L+R;
}int main(){
  fread(buf,1,1<<21,stdin);
  N=1<<(D=std::__lg(in(n)+1)+1),in(m);
  for(i4 i=N+1,x;i<=N+n;i++)
    in(x),A[i]={!x,x,!x,x,!x,x,!x,x},cls[i]=2;
  for(i4 i=N-1;i;i--)pup(i),cls[i]=2;
  while(m--){i4 op,x,y;in(op),in(x)++,in(y)++;
    if(op<3){mdf(x,y,op,op==2);continue;}
    Node X=que(x,y);out(op==3?X.s1:X.m1);
  }fwrite(pbuf,1,pp-pbuf,stdout);
  return 0;
}

望周知


by Xeffry @ 2024-10-11 21:42:36

@Gcc_Gdb_7_8_1 骂的好


by LLVM_lldb_14_0_0 @ 2024-10-12 12:47:26

@Xeffry emmm


by blue_demon @ 2024-10-13 21:37:23

@Gcc_Gdb_7_8_1 骂得好


by Gcc_Gdb_7_8_1 @ 2024-10-13 21:39:29

@blue_demon emmm * 2


by DReamwastaken__ @ 2024-10-13 21:44:18

@Gcc_Gdb_7_8_1 骂得好 * 3


by Naszt @ 2024-10-17 23:39:27

@Gcc_Gdb_7_8_1 @Xeffry @blue_demon @DReamwastaken__

就是说啊,有没有一种可能,我其实是个抖 M
(尖叫)(扭曲)(阴暗的爬行) (爬行)(扭动)(尖叫)(扭曲)(阴暗的爬行) (爬行)(扭动)(尖叫)(扭曲)(阴暗的爬行) (爬行)(扭动)


by blue_demon @ 2024-10-18 20:57:03

@Naszt 学姐逆天了


by Delete_error @ 2024-10-21 21:48:09

好恐怖的码疯


|