NC20588. [SHOI2013]发牌
描述
输入描述
第1行,一个整数N,表示牌的数量。第2行到第N + 1行,在第i + 1行,有一个整数Ri, 0 ≤ Ri < N
输出描述
第1行到第N行:第i行只有一个整数,表示玩家收到的第i张牌的编号。
示例1
输入:
4 2 0 3 2
输出:
3 4 2 1
C++(clang++ 11.0.1) 解法, 执行用时: 533ms, 内存消耗: 7768K, 提交时间: 2022-07-31 19:27:51
#include<bits/stdc++.h> using namespace std; #define maxm 700020 int c[maxm],n; int lowbit(int i) { return i&-i; } void add(int i,int t) { while(i<=n) { c[i]+=t; i+=lowbit(i); } } int ask(int i) { int ans=0; while(i) { ans+=c[i]; i-=lowbit(i); } return ans; } int main() { cin .tie(0); cout.tie(0); cin >> n; for(int i=1;i<=n;i++) { add(i,1); } int now=1; for(int i=n;i>=1;i--) { int x; cin >> x; now=(now+x)%i; if(now==0) now=i; int l=1,r=n; int ans=0; while(l<=r) { int mid=(l+r)/2; if(ask(mid)>=now) { ans = mid; r=mid-1; } else l=mid+1; } printf("%d\n",ans); add(ans,-1); } return 0; }