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);
}
天才麻将少女的漫画真好看。