公司网站建设调研背景,新加坡建设网站,法华寺网站建设,中国招采网招标公告正题 题目大意
给出每个人前或后面比他高的人数#xff0c;然后求一个序列#xff0c;人们高度字典序最小的序列。 解题思路
我们将高度从小到大插入#xff0c;然后对于每个人至少保留一些比他高的人的空位#xff0c;然后用权值线段树O(log2n)O(log^2 n)O(log2n)计算第…正题 题目大意
给出每个人前或后面比他高的人数然后求一个序列人们高度字典序最小的序列。 解题思路
我们将高度从小到大插入然后对于每个人至少保留一些比他高的人的空位然后用权值线段树O(log2n)O(log^2 n)O(log2n)计算第k个空位的位置插入。 当然也有二分加树状数组详见 https://blog.csdn.net/Mr_wuyongcong/article/details/81988835 code
#includecstdio
#includealgorithm
#define N 100010
using namespace std;
struct node{int h,num;
}a[N];
struct treenode{int l,r,w;
}tree[N*8];
int n,put[N];
bool cmp(node x,node y)
{return x.hy.h;}
int read(){int x0,flag1;char chgetchar();while(ch0||ch9){if(ch-)flag-1;chgetchar();}while(ch0ch9){xx*10ch-0;chgetchar();}return x*flag;
}
void write(int x)
{if(x9) write(x/10);putchar(x%1048);return;
}
void build(int k,int l,int r)//建树
{tree[k].ll;tree[k].rr;tree[k].wr-l1;if(lr) return;int mid(lr)/2;build(k*2,l,mid);build(k*21,mid1,r);
}
void inster(int k,int num,int i)//第num个空位
{tree[k].w--;if(tree[k].ltree[k].r){put[tree[k].l]i;return;}if(tree[k*2].wnum) inster(k*2,num,i);else inster(k*21,num-tree[k*2].w,i);
}
int main()
{nread();for(int i1;in;i)a[i].hread(),a[i].numread();sort(a1,a1n,cmp);for(int i1;in;i)if(a[i].numn-i1){printf(impossible);return 0;}build(1,1,n);for(int i1;in;i){int kmin(a[i].num1,n-a[i].num-i1);//计算最小字典序的位置inster(1,k,a[i].h);}for(int i1;in;i)write(put[i]),putchar( );
}