为什么我这次传智杯 D 题也是按题意爆枚,而我却 TLE 了?
我还加了二叉查找树优化查询排名。
吐槽数据。。。
#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;
}