Codeforces Round 955

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

E Number of k-good subarrays

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

函数\(f(n,k)=(l,r,v)\)表示\([0,n-1]\)中左边满足条件的连续段长度为\(l\),右边为\(r\),中间的贡献为\(v\)。拆成两段计算\(f(n,k)=f(hbit,k)+f((hbit->n),k)\)。后半段最高位为1,转换为\(f(n-hbit,k-1)\)。对于前半段,讨论最高位是0/1,\(f(2^n,k)=f(2^{n-1},k-1)+f(2^{n-1},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,R-1)\)一定要被包含。还有前缀中大于\(MIN_{L+1}^n(a)\)的部分和后缀中小于前面最大值的部分。线段树上二分。

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

posted @ 2024-06-27 00:59  Kur0n1ko  阅读(97)  评论(0)    收藏  举报