分块吸氧A,不吸氧40,emmm

P2464 [SDOI2008] 郁闷的小 J

缺了氧气你不行。
by 清风我已逝 @ 2018-10-25 20:09:15


@[g21glf](/space/show?uid=31639) 求助大佬,为什么我分块吸氧才80
by 7KByte @ 2019-03-09 22:27:51


@[Gang_Leader](/space/show?uid=119261) emmm,你咋写的?
by Thosaka_Forest @ 2019-03-10 08:52:58


@[Gang_Leader](/space/show?uid=119261) ```cpp // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; const int MAXN=1e5+10; int n,m,k,tot; int id[MAXN],l[MAXN],r[MAXN]; int a[MAXN],b[MAXN]; inline int Read() { int i=0,f=1; char c; for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0'; return i*f; } inline void fenkuai() { for(int i=1;i<=tot;i++) l[i]=(i-1)*tot+1,r[i]=i*tot; for(int i=1;i<=n;i++) id[i]=(i-1)/tot+1; if(r[tot]<n) { tot++; r[tot]=n; l[tot]=r[tot-1]+1; for(int i=l[tot];i<=r[tot];i++) id[i]=tot; } for(int i=1;i<=tot;i++) sort(a+l[i],a+r[i]+1); } inline void change(int x,int y) { b[x]=y; for(int i=l[id[x]];i<=r[id[x]];i++) a[i]=b[i]; sort(a+l[id[x]],a+r[id[x]]+1); } inline int query(int x,int y,int key) { int ret=0; if(id[x]==id[y]) { for(int i=x;i<=y;i++) if(b[i]==key) ret++; return ret; } for(int i=id[x]+1;i<=id[y]-1;i++) { int minn=lower_bound(a+l[i],a+r[i]+1,key)-a; int maxx=lower_bound(a+l[i],a+r[i]+1,key+1)-a-1; ret+=maxx-minn+1; } for(int i=x;i<=r[id[x]];i++) if(b[i]==key) ret++; for(int i=l[id[y]];i<=y;i++) if(b[i]==key) ret++; return ret; } int main() { n=Read();m=Read(); for(int i=1;i<=n;i++) a[i]=b[i]=Read(); tot=sqrt(n); fenkuai(); while(m--) { char opt[5]; scanf("%s",opt); if(opt[0]=='C') { int x=Read(),y=Read(); change(x,y); } else { int x=Read(),y=Read(),key=Read(); cout<<query(x,y,key)<<'\n'; } } return 0; } ``` 我的代码
by Thosaka_Forest @ 2019-03-10 08:53:16


```cpp // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; int n,m,t; int L[1005],R[1005],pos[100005],a[100005]; map<int,int>M[1005]; inline int read(){ int a=0;char x=getchar(); while(x<'0'||x>'9') x=getchar(); while(x>='0'&&x<='9') a=(a<<3)+(a<<1)+(x^48),x=getchar(); return a; } int ask(int l,int r,int data){ int x=pos[l],y=pos[r]; int ans=0; if(x==y){ for(int i=l;i<=r;i++) ans+=(a[i]==data); return ans; } for(int i=x+1;i<y;i++) ans+=M[i][data]; for(int i=l;i<=R[x];i++) ans+=a[i]==data; for(int i=L[y];i<=r;i++) ans+=a[i]==data; return ans; } int main() { n=read();m=read(); for(int i=1;i<=n;i++) a[i]=read(); t=sqrt(n); for(int i=1;i<=t;i++) L[i]=(i-1)*t+1, R[i]=i*t; if(R[t]<n)t++,L[t]=R[t-1]+1,R[t]=n; for(int i=1;i<=t;i++) for(int j=L[i];j<=R[i];j++) pos[j]=i,M[i][a[j]]++; char k[3];int x,y,z; for(int i=1;i<=m;i++){ scanf("%s",k); if(k[0]=='C'){ x=read();y=read(); M[pos[x]][a[x]]--; M[pos[x]][y]++; a[x]=y; } else{ x=read();y=read();z=read(); printf("%d\n",ask(x,y,z)); } } return 0; } ```
by 7KByte @ 2019-03-10 09:19:56


$O(M\sqrt NlogN)$本来就会T吧..保存每一块各个数字出现次数再加和能去掉log
by cbio @ 2020-01-08 18:58:10


@[Thosaka_Forest](/user/31639)
by cbio @ 2020-01-08 18:58:27


嗯我吸氧也80
by ACPC @ 2023-01-11 08:52:29


|