求救
查看原帖
求救
660641
0zhouyq楼主2023/4/9 21:42

为什么我这次传智杯 DD 题也是按题意爆枚,而我却 TLETLE 了?

我还加了二叉查找树优化查询排名。

吐槽数据。。。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
	ll x,num;
}a[100001];
struct Treenode{
	ll n,num,siize,ls,rs;
}e[100001];
bool cmp(node x,node y){
	if(x.x!=y.x) return x.x<y.x;
	return x.num<y.num;
}
ll cnt=0;
void add(ll x,ll h){
	ll now=0;
	while(true){
		e[now].siize++;
		if(x>=e[now].n){
			if(e[now].rs==0){
				e[now].rs=++cnt;
				now=e[now].rs;
				e[now].num=h;
				e[now].n=x;
				e[now].siize=1;
				break;
			}
			now=e[now].rs;
		}
		else{
			if(e[now].ls==0){
				e[now].ls=++cnt;
				now=e[now].ls;
				e[now].num=h;
				e[now].n=x;
				e[now].siize=1;
				break;
			}
			now=e[now].ls;
		}
	}
}
ll check(ll x,ll h){
	ll now=0,ret=0;
	while(true){
		if(e[now].num!=h&&x>=e[now].n){
			if(e[now].ls) ret+=e[e[now].ls].siize;
			if(now!=0) ret++;
			now=e[now].rs;
		}
		else if(e[now].num==h){
			if(e[now].ls) ret+=e[e[now].ls].siize;
			return ret;
		}
		else{
			now=e[now].ls;
		}
	}
}
int main(){
	ll n,m;
	scanf("%lld %lld",&n,&m);
	for(ll i=1;i<=n;i++){
		scanf("%lld",&a[i].x);
		a[i].num=i;
	}
	ll ans=0;
	for(ll i=1;i<=m;i++){
		ll d;
		scanf("%lld",&d);
		for(ll k=1;k<=d;k++){
			Treenode pp;
			pp.n=0;
			pp.siize=0;
			pp.ls=0;
			pp.rs=0;
			for(ll j=0;j<=cnt;j++) e[j]=pp;
			cnt=0;
			vector<node> vc;
			for(ll j=k;j<=n;j+=d){
				node p=a[j];
				p.num=(j-k)/d+1;
				vc.push_back(p);
				add(p.x,p.num);
				ll abc=check(p.x,p.num);
				ans+=p.num-abc;
			}
			sort(vc.begin(),vc.end(),cmp);
			for(ll j=0;j<vc.size();j++){
				a[j*d+k]=vc[j];
				a[j*d+k].num=j*d+k;
			}
		}
	}
	printf("%lld\n",ans);
	for(ll i=1;i<=n;i++) printf("%lld ",a[i].x);
	return 0;
}
2023/4/9 21:42
加载中...