BZOJ5055: 膜*

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);
}

天才麻将少女的漫画真好看。

原文地址:https://www.cnblogs.com/f321dd/p/7609203.html