Codeforces Round 955

D吃了一发,E没做出来,结果刚好上紫w,不知道何时能上橙...

E Number of k-good subarrays

怪怪的题,一种trivial但没想到的分治(?做法。拆成两部分,只有一部分往下递归。

函数f(n,k)=(l,r,v)表示[0,n1]中左边满足条件的连续段长度为l,右边为r,中间的贡献为v。拆成两段计算f(n,k)=f(hbit,k)+f((hbit>n),k)。后半段最高位为1,转换为f(nhbit,k1)。对于前半段,讨论最高位是0/1,f(2n,k)=f(2n1,k1)+f(2n1,k)。记搜

学了std的写法

tii solve(int x,int k) {
	if(k<0) return tii(0,0,0);
	if(x==1) return tii(1,1,1);
	int hbit=63-__builtin_clzll(x);
	hbit=(1ll<<hbit);
	if(hbit==x) {
		hbit>>=1;
		if(mp.find(mkp(x,k))!=mp.end()) return mp[mkp(x,k)];
	}
	tii L=solve(hbit,k),R=solve(x-hbit,k-1);
	int Ll=get<0>(L),Lr=get<1>(L),Lv=get<2>(L);
	int Rl=get<0>(R),Rr=get<1>(R),Rv=get<2>(R);
	//auto [Ll,Lr,Lv]=L,[Rl,Rr,Rv]=R;
	int rl=Ll,rr=Rr,rv=0;
	if(Ll==hbit) rl=Ll+Rl; 
	if(Rr==x-hbit) rr=Lr+Rr;
	rv=(mod*2+Rv+Lv-calc(Lr)-calc(Rl)+calc(Lr+Rl))%mod;
	if((hbit<<1)==x) mp[mkp(x,k)]=tii(rl,rr,rv);
	return tii(rl,rr,rv);
}

F Sorting Problem Again

考虑最长的有序前后缀,记为(1,L),(R,n)(L+1,R1)一定要被包含。还有前缀中大于MINL+1n(a)的部分和后缀中小于前面最大值的部分。线段树上二分。

修改要维护最长有序前后缀。可以转化成维护ai>ai+1的位置,一次修改只改两个地方,amazing。然后用set

posted @   Kur0n1ko  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示