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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JZOJ 5638. 【NOI2018模拟4.8】IIIDX

發布時間:2025/3/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5638. 【NOI2018模拟4.8】IIIDX 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

Input

Output

Sample Input

4 2.0
114 514 1919 810

Sample Output

114 810 514 1919

Data Constraint

Solution

  • 先考慮一個貪心,將數從大到小填到樹的后序遍歷上。

  • 但是這只能過 di 互不相同的數據點,如數據:

4 2
1 1 1 2

  • 就能卡的你痛不欲生……

  • 關鍵在于沒有預留足夠的點填到一個點的子樹內。

  • 我們先將數從小到大排序,從小到大地填。

  • 注意可以新建一個 0 號節點,把森林變成一顆樹方便處理。

  • 設一個點在線段樹的后綴子樹大小為 Size ,一個數的重復個數為 P

  • 那么這個數要填到一個點 i 滿足:SizeiP (感性理解)。

  • 結合上述數據可以清楚地得出這個結論……

  • 于是用線段樹維護區間和還有單點修改即可。

  • 時間復雜度為 O(N?log?N)

Code

#include<cstdio> #include<algorithm> #include<cmath> #include<cctype> using namespace std; const int N=5e5+5; int n,tot,qx,qy; double k; int first[N],nex[N],en[N],size[N]; int a[N],fa[N],ans[N],f[N<<2]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline void write(int x) {if(x>9) write(x/10);putchar(x%10+'0'); } inline void insert(int x,int y) {nex[++tot]=first[x];first[x]=tot;en[tot]=y;size[x]+=size[y]; } void change(int v,int l,int r) {f[v]+=qy;if(l==r) return;int mid=l+r>>1;if(qx<=mid) change(v<<1,l,mid); else change(v<<1|1,mid+1,r); } int find(int v,int l,int r,int x) {if(l==r) return l;int mid=l+r>>1;if(f[v<<1|1]>=x) return find(v<<1|1,mid+1,r,x);return find(v<<1,l,mid,x-f[v<<1|1]); } int main() {n=read(),scanf("%lf",&k);for(int i=1;i<=n;i++) a[i]=read(),size[i]=1;sort(a+1,a+1+n);for(int i=n;i;i--) insert(floor(i*1.0/k),i);for(int i=first[0];i;i=nex[i]){qy=size[qx=en[i]];change(1,1,n);}for(int i=1,k=1;i<=n;i=k){while(k<=n && a[i]==a[k]) k++;for(int j=k-i;j;j--){int pos=find(1,1,n,j);ans[pos]=a[i];qy=-size[qx=pos];change(1,1,n);for(int l=first[pos];l;l=nex[l]){qy=size[qx=en[l]];change(1,1,n);}}}for(int i=1;i<=n;i++) write(ans[i]),putchar(' ');return 0; }

總結

以上是生活随笔為你收集整理的JZOJ 5638. 【NOI2018模拟4.8】IIIDX的全部內容,希望文章能夠幫你解決所遇到的問題。

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