读进来\(f\)之后,把权值作为第一关键字从小到大排序,位置作为第二关键字从大到小排序,这样排序后的第\(i\)个位对应的位置就应该填数字\(i\)
权值作为第一关键字,保证了出现在其之前的数权值必它小的填的数也比它小,权值必它大的填的数也比它大;权值相同时按照位置从大到小排序,这样权值相同的一组就是递减的,就不会相互影响了
代码
#include#define re registerinline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}const int maxn=1e5+5;int n,b[maxn];struct N{int v,p;}a[maxn];inline int cmp(N A,N B) {return A.v==B.v?A.p>B.p:A.v