[BZOJ5249][多省联测2018]IIIDX
2018-04-10 19:20
232 查看
bzoj
luogu
考虑没有重复数字的情况。
直接从小往大贪心把每个数赋给当前已解锁的最后一关就可以了。
有重复?
一样的。重复的数字一起考虑,假设有\(k\)个重复的数,那就把这个数先赋给第\(k\)大的位置,然后是\(k-1\)大。。。直到\(k\)个数全部填满。
luogu
sol
首先可以把依赖关系转成一个森林。自下而上维护出每个点的\(size\),表示这关解锁以后一共有多少关。考虑没有重复数字的情况。
直接从小往大贪心把每个数赋给当前已解锁的最后一关就可以了。
有重复?
一样的。重复的数字一起考虑,假设有\(k\)个重复的数,那就把这个数先赋给第\(k\)大的位置,然后是\(k-1\)大。。。直到\(k\)个数全部填满。
code
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; int gi() { int x=0,w=1;char ch=getchar(); while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); if (ch=='-') w=0,ch=getchar(); while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return w?x:-x; } const int N = 5e5+5; int n,d ,nxt ,head ,fa ,sz ,t[N<<2],ans ; double k; void dfs(int u) { sz[u]=1; for (int v=head[u];v;v=nxt[v]) dfs(v),sz[u]+=sz[v]; } void modify(int x,int l,int r,int p,int v) { t[x]+=v;if (l==r) return; int mid=l+r>>1; if (p<=mid) modify(x<<1,l,mid,p,v); else modify(x<<1|1,mid+1,r,p,v); } int query(int x,int l,int r,int k) { if (l==r) return l;int mid=l+r>>1; if (k<=t[x<<1|1]) return query(x<<1|1,mid+1,r,k); else return query(x<<1,l,mid,k-t[x<<1|1]); } int main() { n=gi();scanf("%lf",&k); for (int i=1;i<=n;++i) { fa[i]=(int)floor(i/k); if (fa[i]) nxt[i]=head[fa[i]],head[fa[i]]=i; } for (int i=1;i<=n&&!fa[i];++i) dfs(i); for (int i=1;i<=n&&!fa[i];++i) modify(1,1,n,i,sz[i]); for (int i=1;i<=n;++i) d[i]=gi();sort(d+1,d+n+1); for (int i=1,j=1;i<=n;i=j) { while (j<=n&&d[j]==d[i]) ++j; for (int k=j-i;k;--k) { int u=query(1,1,n,k);ans[u]=d[i]; modify(1,1,n,u,-sz[u]); for (int v=head[u];v;v=nxt[v]) modify(1,1,n,v,sz[v]); } } for (int i=1;i<=n;++i) printf("%d ",ans[i]); puts("");return 0; }
相关文章推荐
- [BZOJ5249][九省联考2018]IIIDX(线段树)
- BZOJ5249: [2018多省省队联测]IIIDX
- BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树
- [BZOJ5251][多省联测2018]劈配
- [BZOJ5248][多省联测2018]双木棋chess
- bzoj 5286: [Hnoi2018]转盘
- [HAOI2018][bzoj5306] 染色 [容斥原理+NTT]
- BZOJ.5329.[SDOI2018]战略游戏(圆方树 虚树)
- bzoj2018 [Usaco2009 Nov]农场技艺大赛
- [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)
- bzoj 5329: [Sdoi2018]战略游戏
- BZOJ5333:[SDOI2018]荣誉称号——题解
- bzoj 5323: [Jxoi2018]游戏
- bzoj 5190: [Usaco2018 Jan]Stamp Painting
- bzoj2018
- [BZOJ5334][TJOI2018]数学计算(exgcd/线段树)
- bzoj2018 [Usaco2009 Nov]农场技艺大赛
- BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)
- [九省联考2018]IIIDX
- BZOJ5306 [HAOI2018]染色 【组合数 + 容斥 + NTT】