12.7
atcoder beginner 331C - Sum of Numbers Greater Than Me (atcoder.jp)这道题求后缀和,差不多是后缀和吧,然后佬用我没写过的一种树状数组直接秒掉,不服不行膜拜学习
#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=1e6+10; int n,sum; int a[maxn],c[maxn]; int lbt(int x) { return x&(-x); } void add(int x,int y) { for(int i=x;i<=1e6;i+=lbt(i)) c[i]+=y; } int query(int x) { int res=0; for(int i=x;i;i-=lbt(i)) res+=c[i]; return res; } signed main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i],add(a[i],a[i]),sum+=a[i]; for(int i=1;i<=n;i++) cout<<sum-query(a[i])<<' '; }
不是,我上午写的下午回头一看,这不是一眼前缀和吗,前缀和稍稍变形,我靠,还是得多练,不然怎么输的都不知道。。。。。。。。。。。。。。以下是我拙劣的暴力法,数组记得开long long,而且这种问题要注意的一个就是数组的范围,因为我需要模拟结构体去关联每个元素和它所对应的sum,所以数组要开最大让其包含所有数值。但是出现了一个问题,我这个暴力法在一些测试点上面比佬的写法要快,神威蒟蒻的我目前还不能理解。。。。。。。。。。。。。。。。。。。。。
#include<iostream> #include<algorithm> using namespace std; const int N=1000005; long long a[N],b[N],c[N]; long long sum=0,ans=0; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; sum+=a[i]; b[i]=a[i]; } sort(b,b+n); for(int i=0;i>=0;i++) { if(i==(n-1))break; else if(b[i]==b[i+1])ans+=b[i]; else { ans+=b[i]; c[b[i]]=sum-ans; } } for(int i=0;i<n;i++) { cout<<c[a[i]]<<" "; } system("pause"); return 0; }
st表板子题
P3865 【模板】ST 表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream> #include<cmath> #include<algorithm> #include<string> using namespace std; const int N=100005; int a[N][30]; 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*10+ch-48;ch=getchar();} return x*f; } int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++)a[i][0]=read(); for(int i=1;(1<<i)<=n;i++) for(int j=1;j+(1<<i)-1<=n;j++) a[j][i]=max(a[j][i-1],a[j+(1<<(i-1))][i-1]); for(int i=0,l,r;i<m;i++) { l=read(),r=read(); int k=log2(r-l+1); printf("%d\n",max(a[l][k],a[r-(1<<k)+1][k])); } system("pause"); return 0; }
快读快写很重要。。。。。。。。。。。。。。。。。。。。。。。。。。。

浙公网安备 33010602011771号