日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nssl1209-奇怪的队列【贪心,权值线段树】

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nssl1209-奇怪的队列【贪心,权值线段树】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題


題目大意

給出每個人前或后面比他高的人數,然后求一個序列,人們高度字典序最小的序列。


解題思路

我們將高度從小到大插入,然后對于每個人至少保留一些比他高的人的空位,然后用權值線段樹O(log2n)O(log^2 n)O(log2n)計算第k個空位的位置插入。
當然也有二分加樹狀數組,詳見
https://blog.csdn.net/Mr_wuyongcong/article/details/81988835


code

#include<cstdio> #include<algorithm> #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.h<y.h;} int read(){int x=0,flag=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')flag=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*flag; } void write(int x) {if(x>9) write(x/10);putchar(x%10+48);return; } void build(int k,int l,int r)//建樹 {tree[k].l=l;tree[k].r=r;tree[k].w=r-l+1;if(l==r) return;int mid=(l+r)/2;build(k*2,l,mid);build(k*2+1,mid+1,r); } void inster(int k,int num,int i)//第num個空位 {tree[k].w--;if(tree[k].l==tree[k].r){put[tree[k].l]=i;return;}if(tree[k*2].w>=num) inster(k*2,num,i);else inster(k*2+1,num-tree[k*2].w,i); } int main() {n=read();for(int i=1;i<=n;i++)a[i].h=read(),a[i].num=read();sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++)if(a[i].num>=n-i+1){printf("impossible");return 0;}build(1,1,n);for(int i=1;i<=n;i++){int k=min(a[i].num+1,n-a[i].num-i+1);//計算最小字典序的位置inster(1,k,a[i].h);}for(int i=1;i<=n;i++)write(put[i]),putchar(' '); }

總結

以上是生活随笔為你收集整理的nssl1209-奇怪的队列【贪心,权值线段树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。