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

浙公网安备 33010602011771号