BIT随手维护一下,和LIS差不多,加了个wys排序暂时rk1。
#include<algorithm> #include<cstdio> #include<sys/mman.h> struct ano{ char*s; ano():s((char*)mmap(0,1<<22,1,2,0,0)){} operator int(){ int x=0; while(*s<48)++s; while(*s>32) x=x*10+*s++-48; return x; } }buf; using namespace std; typedef unsigned long long ll; const int p=19260817; const int N=3e5+5; int n,m,w[N]; ll f[N][2]; void inc(ll*c,int i,int d){ for(;i<=m;i+=i&-i)c[i]+=d; } ll ask(ll*c,int i){ ll s=0; for(;i;i^=i&-i)s+=c[i]; return s; } int c7[256],g[N]; struct vec{int w,i;}t[N],c8[N]; void ssort(){ vec*a=t,*b=c8; for(int k=0;k<32;k+=8){ fill_n(c7,256,0); for(int i=0;i<n;++i) ++c7[a[i].w>>k&255]; for(int i=1;i<256;++i) c7[i]+=c7[i-1]; for(int i=n-1;~i;--i) b[--c7[a[i].w>>k&255]]=a[i]; swap(a,b); } } int main(){ n=buf; for(int i=0;i<n;++i) w[i]=buf,t[i]={w[i],i}; ssort(); for(int i=0;i<n;++i) g[t[i].i]=i&&t[i].w==t[i-1].w?m:++m; ll s=0; for(int i=0;i<n;++i){ ll a=0,b=0; for(int k=g[i]-1;k;k^=k&-k){ a+=f[k][0]; b+=f[k][1]; } a=a%p*w[i]%p; s+=b%p*w[i]%p; for(int k=g[i];k<=m;k+=k&-k){ f[k][0]+=w[i]; f[k][1]+=a; } } printf("%lld ",s%p); }
天才麻将少女的漫画真好看。