求求了,帮我看看哪里错了啊!!!
fi 数组:牌 i 有没有被发出去。
v:当前牌表面的那一张是什么。
oi:在 oi.l 到 oi.r 间有 oi.x 张牌还没有使用。
k_{i}:存储输入的数据。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[3000001];
ll k[3000001],f[3000001],v=1;
struct {
ll l,r,x,lb;
} o[3000001];
void bulid(ll l,ll r,ll c) {//建树
if(l>r)return ;
o[c].l=l;
o[c].r=r;
if(l==r) o[c].x=a[l];
else {
ll mid=l+(r-l)/2;
bulid(l,mid,c*2);
bulid(mid+1,r,c*2+1);
o[c].x=o[c*2].x+o[c*2+1].x;
}
}
void uptree() {//读入
for(ll i=1; i<=n; i++) cin>>k[i];
for(ll i=1; i<=n; i++) a[i]=1;
for(ll i=1;i<=n;i++) f[i]=1;
bulid(1,n,1);
return ;
}
void write(ll c) {//拦标价
if(o[c].lb!=0) {
o[c*2].x+=o[c].lb*(o[c*2].r-o[c*2].l+1);
o[c*2+1].x+=o[c].lb*(o[c*2+1].r-o[c*2+1].l+1);
o[c*2].lb+=o[c].lb;
o[c*2+1].lb+=o[c].lb;
o[c].lb=0;
}
}
void dcc(ll l,ll r,ll cl,ll cr,ll c,ll lz) {//区间修改
if(l>r||cl>cr) return ;
if(cr<l||cl>r) return ;
if(cl<=l&&cr>=r) {
o[c].lb+=lz;
o[c].x+=(r-l+1)*lz;
} else {
write(c);
ll mid=l+(r-l)/2;
dcc(l,mid,cl,cr,c*2,lz);
dcc(mid+1,r,cl,cr,c*2+1,lz);
o[c].x=o[c*2].x+o[c*2+1].x;
}
}
ll cpz(ll l,ll r,ll cl,ll cr,ll f,ll lz,ll c) {//区间和
if(l>r||cl>cr) return 0;
if(cr<l||cl>r) return 0;
if(cl<=l&&cr>=r) return o[c].x;
write(c);
ll mid=l+(r-l)/2;
return cpz(l,mid,cl,cr,f,lz,c*2)
+cpz(mid+1,r,cl,cr,f,lz,c*2+1);
}
void orb(ll l,ll r,ll x){//二分操作
if(l>r) return;
// cout<<l<<" "<<r<<" "<<x<<"\n";
ll mid=l+(r-l)/2;
ll as=cpz(1,n,v,mid,0,0,1);
if(as>x) orb(l,mid,x);
if(as<x) orb(mid+1,r,x);
if(as==x&&f[mid]==1){
v=mid;return ;
}
/*
ll kc=0,p=0;
if(v+x-1>n){
kc+=cpz(1,n,v,n,0,0,1);
p=x-(n-v+1);
kc+=cpz(1,n,1,p,0,0,1);
}
else kc+=cpz(1,n,v,v+x-1,0,0,1);
v=v+x; x=x-kc;
if(v>n) v=v-n;
if(v>n) v=v-n;
if(x==0) return ;
else orb(x);
*/
}
int main() {
ios::sync_with_stdio(0);
std::cin.tie();
std::cout.tie();
cin>>n; uptree();//读入
for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++) cout<<f[j]<<" ";
// cout<<"\n";
k[i]=k[i]%(n-i+1);k[i]++;
int asd=0,lk=cpz(1,n,v,n,0,0,1);
if(lk<k[i]){
k[i]=k[i]-lk;
v=1;
}
orb(v,n,k[i]);
cout<<v<<"\n";
dcc(1,n,v,v,1,-1);
f[v]=0; v++;
/*
for(int j=v;j<=n;j++){
if(f[j]==1){
v=j+1;cout<<j<<"\n";
asd=1; f[j]=0; break;
}
}
if(asd==0){
for(int j=1;j<=v;j++){
if(f[j]==1){
v=j+1;cout<<j<<"\n";
dcc(1,n,j,j,1,-1);
asd=1; f[j]=0; break;
}
}
}
*/ if(v>n) v=v-n;
if(v>n) v=v-n;
// for(int j=1;j<=2*n;j++){
// cout<<o[j].l<<" "<<o[j].r<<" "<<o[j].x<<"\n";
// }
}
return 0;
}
/*
cin>>a;dcc(1,n,a,a,1,-1);//删除一张牌
cin>>l>>r;cpz(1,n,l,r,0,0,1);//求一段有多少可用牌
*/