1. 程式人生 > >[bzoj5249][2018多省省隊聯測]IIIDX

[bzoj5249][2018多省省隊聯測]IIIDX

sans min 結點 names else std div 查找 iii

給我的感覺是需要先言傳才能意會。。。真的可以在考場上想到這麽神的算法嗎??

#include<bits/stdc++.h>
using namespace std;
const int N=500010;
const int inf=1e9;
inline int read(){
    int r=0,c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c))
    r=r*10+c-0,c=getchar();
    return r;
}
struct Edge{
    int to,nxt;
}e[N
<<1]; int head[N],cnt=1; void add(int u,int v){ e[cnt]=(Edge){v,head[u]}; head[u]=cnt++; } int n;double k; int a[N],b[N],las[N],fa[N],siz[N]; void dfs(int u){ siz[u]=1; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; dfs(v);siz[u]+=siz[v]; } } struct Node{
int l,r,add,mn; }T[N<<2]; #define ls o<<1 #define rs o<<1|1 #define L T[o].l #define R T[o].r #define M (L+R>>1) void pp(int o){ T[o].mn=min(T[ls].mn,T[rs].mn); } void pd(int o){ if(T[o].add){ T[ls].add+=T[o].add; T[rs].add+=T[o].add; T[ls].mn+=T[o].add; T[rs].mn
+=T[o].add; T[o].add=0; } } void build(int o,int l,int r){ if(l==r){ T[o]=(Node){l,r,0,l}; return; } T[o]=(Node){l,r,0,inf}; build(ls,L,M); build(rs,M+1,R); pp(o); } int ql,qr,v; void upd(int o){ if(ql<=L&&R<=qr){ T[o].add+=v; T[o].mn+=v; return; } pd(o); if(ql<=M)upd(ls); if(qr>M) upd(rs); pp(o); } int find(int o){ if(L==R)return T[o].mn>=v?L:L+1; pd(o); if(T[rs].mn>=v)return find(ls); else return find(rs); } bool comp(int p,int q){ return p>q; } void init(){ n=read();cin>>k; for(int i=1;i<=n;i++){ fa[i]=(double)i/k+1e-10;//浮點數有坑 add(fa[i],i);b[i]=read(); } sort(b+1,b+n+1,comp); for(int i=1;i<=n;i++) if(b[i]==b[i-1]) a[i]=a[i-1],las[a[i]]=i; else a[i]=i,las[a[i]]=i; dfs(0); } int ans[N],vis[N]; void solve(){ build(1,1,n);//建線段樹,i的初值為i for(int i=1;i<=n;i++){ if(fa[i]&&!vis[fa[i]]){//如果父親的預定沒被撤銷 vis[fa[i]]=1;//只撤銷一次所以要標記一下 ql=ans[fa[i]],qr=n; v=siz[fa[i]]-1;upd(1);//父親修改的區間加上siz[fa]-1 } v=siz[i];int x=a[find(1)];//在線段樹上二分查找第一個右側值及本身全部大於等於siz[i]的結點 v=-v;ans[i]=ql=las[x]--,qr=n;upd(1);//值已經確定,選擇最靠右的那個,並把它及它右邊的值減去siz[i] } for(int i=1;i<=n;i++) printf("%d ",b[ans[i]]); } int main(){ init(); solve(); }

[bzoj5249][2018多省省隊聯測]IIIDX