首页 > 其他分享 >「九省联考」IIIDX

「九省联考」IIIDX

时间:2022-11-21 17:01:30浏览次数:50  
标签:rs int siz tr tag 九省 ls IIIDX 联考

显然贪心,给每个点填上它能取得的最大点。
对 \(a\) 从小到大排序,维护每个位置对应后缀可用值的个数 \(f\)。
给 \(x\) 填数相当于它右侧减少 \(siz_x\) 个可用值。
查询最大可用值相当于求一段前缀的 \(f\) 都 \(> siz_x\) ,线段树上二分即可。
需要将父亲填充的数去掉。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
const int N=5e5+10;
double k;
int n,m,siz[N],fa[N],a[N],v[N],v1[N],cnt,tr[N<<2],tag[N<<2];
int ans[N];
#define ls (t<<1)
#define rs (t<<1|1)
void build(int t,int l,int r){
	if(l==r){
		tr[t]=v1[l];
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);build(rs,mid+1,r);
	tr[t]=min(tr[ls],tr[rs]);
}
void push(int t){
	tr[ls]+=tag[t];tr[rs]+=tag[t];
	tag[ls]+=tag[t];tag[rs]+=tag[t];
	tag[t]=0;
}
void modify(int t,int l,int r,int L,int R,int v){
	if(L<=l && r<=R){
		tr[t]+=v;
		tag[t]+=v;
		return;
	}
	if(tag[t])push(t);
	int mid=l+r>>1;
	if(L<=mid)modify(ls,l,mid,L,R,v);
	if(R>mid)modify(rs,mid+1,r,L,R,v);
	tr[t]=min(tr[ls],tr[rs]);
}
int query(int t,int l,int r,int v){
	if(l==r){
		return tr[t]>=v?l:l-1;
	}
	if(tag[t])push(t);
	int mid=l+r>>1;
	if(tr[ls]>=v)return query(rs,mid+1,r,v);
	return query(ls,l,mid,v);
}
#undef ls
#undef rs
pair<int,int> q[N];
void init(){
	fo(i,1,n)q[i]=make_pair(a[i],i);
	sort(q+1,q+n+1);
	fo(i,1,n){
		if(q[i].first!=q[i-1].first)v[++m]=q[i].first,v1[m]=n-i+1;
		a[q[i].second]=m;
	}
	build(1,1,m);
}
int main(){
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
	scanf("%d%lf",&n,&k);
	fo(i,1,n)scanf("%d",&a[i]);
	init();
	fd(i,n,1){
		++siz[i];
		int x=(int)(1.0*i/k);
		fa[i]=x;
		siz[x]+=siz[i];
	}
	fo(i,1,n){
		if(fa[i]!=fa[i-1]){
			modify(1,1,m,1,ans[fa[i]],siz[fa[i]]-1);
		}
		ans[i]=query(1,1,m,siz[i]);
		modify(1,1,m,1,ans[i],-siz[i]);
	}
	fo(i,1,n)printf("%d ",v[ans[i]]);
	printf("\n");

	return 0;
}

标签:rs,int,siz,tr,tag,九省,ls,IIIDX,联考
From: https://www.cnblogs.com/Kelvin2005/p/16911923.html

相关文章

  • LG5283 [十二省联考 2019] 异或粽子 题解
    口胡一个异或经典问题LG5283[十二省联考2019]异或粽子给定一个长为\(n\)的序列,序列一段子区间\([l,r]\)的值为\([l,r]\)范围内所有数异或起来的值。现在求出前......
  • P6628 [省选联考 2020 B 卷] 丁香之路 题解
    图论、贪心好题。枚举每一个朋友,设一个朋友从\(s\)出发,到\(t\)结束。那么如果用边来表示其行动轨迹,必然是\(s,t\)有奇数度,其它点均为偶数度。如果在\(s,t\)之间连......
  • 【十二省联考2019】希望(容斥,换根DP,长链剖分,懒标记)
    暴力的想法是考虑钦定每个点作为到达点并统计贡献,但显然这样会算重。注意到会算重的到达点一定构成了一个连通块,这是一个很好的性质,方便了我们容斥:我们直接用点的贡献减去......
  • 【bzoj4869】【六省联考2017】相逢是问候(扩展欧拉函数)
    和《花神游历各国》有异曲同工之妙。首先能想到扩展欧拉定理:\[a^b\equiv\begin{cases}a^{b\bmod\varphi(p)+\varphi(p)}&\text{if}b\geq\varphi(p)\\a^b&\text{if}......
  • LG7521 [省选联考 2021 B 卷] 取模
    LG7521[省选联考2021B卷]取模给定\(n\)个正整数\(a_i\),请你再其中选出三个数\(i,j,k(i\neqj,i\neqk,i\neqk)\),使得\((a_i+a_j)\bmoda_k\)的值最大。复......
  • 10月联考试卷反思
    一、语文成绩:96.5二、数学成绩:78三、数学加试(武汉某模拟试题)成绩:85四、英语成绩:114.5五、物理原始成绩:73赋分:84六、化学原始成绩:54赋分:61七、地理原始成绩:5......
  • [联考]钻石教练
    给定\(n\),和一个\(k\)次多项式,对于每个\(m\len\),设\(\sigma\)为一个大小为\(m\)且拆出的所有循环大小都为\(3\)的倍数的置换,\(|sp(\sigma)|\)为它拆出的循环数......
  • P4384 [八省联考 2018] 制胡窜
    P4384[八省联考2018]制胡窜考虑先将问题转化为切断两个位置使得没有任何一段中包含\(t\)。则最终的答案为\(\dbinom{n}{2}-\text{ans}\)。计\(t\)按左端点排序后......
  • [挑战记录][省选联考 2022] 预处理器
    2022100220:30开始答题20:35先水\(20\)分21:30假了,重构2022100306:34\(60\)分19:45继续重构,学习了一些\(\operatorname{string}\)的科技20:18过了#inclu......
  • 22 暑期 CD 班联考 Day4 之降低力度
    WZY在线捐献瞳孔沙城之巅城市定向SUNZH在线学猫叫新知之神SSHWY在线送温暖......