首页 > 其他分享 >AT_dwacon5th_prelims_c k-DMC 题解

AT_dwacon5th_prelims_c k-DMC 题解

时间:2024-03-07 13:16:32浏览次数:19  
标签:DMC int 题解 sum 贡献 -- le prelims define

分析

先考虑 \(k=n\) 的情况。

对于 \(s_j=M\) 的时候,其能够匹配的 \(s_i=D\) 的数量很显然是 \(i \le j-1\) 的时候的数量,求前缀和就能得到。而对于 \(s_j=C\) 的时候,能够完整匹配的就是 \(i \le j-1\) 的时候所有 \(s_i=M\) 能够匹配的数量之和,再套个前缀和就行了。复杂度是 \(O(n)\) 的。

考虑 \(3 \le k \le n\) 的情况。

和上面的差不多,对于 \(s_j=C\) 的时候,它能够得到贡献的 \(M,D\) 都是在 \([j-k+1,j]\) 的。处理这个,只需要在 \(j-k\) 没有越界的时候减去 \(s_{j-k}\) 的贡献。如果 \(s_{j-k}=M\),因为 \(s_{j-k}\) 之前所有的 \(D\) 对 \(j\) 的贡献都减完了,所以将 \(M\) 出现数量的和 \(-1\)(这个后面会用到)。如果 \(s_{j-k}=D\),其贡献是 \([j-k+1,j]\) 中 \(M\) 的数量,这个已经统计出来了,直接剪掉即可。如果 \(s_{j-k}=C\),则不理会,因为它本身不会产生贡献。至于 \(s_j=M,D\) 的情况,跟 \(k=n\) 的时候差不多,只需要注意 \(M\) 的数量。

单次询问的答案就是所有 \(s_j=C\) 的时候得到贡献之和。复杂度 \(O(qn)\)。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define PII pair<int,int>
#define x first
#define y second 

const int N=1e6+10;
int n,q,k;
string s;

il void solve(){
	cin>>n>>s>>q;
	while(q--){
		cin>>k;
		int ans=0,sum_d=0,sum_m=0,sum=0;
		for(re int i=0;i<n;++i){
			if(i-k>=0){
				if(s[i-k]=='D') sum-=sum_m,--sumd;
				if(s[i-k]=='M') --sum_m;
			}
			if(s[i]=='D') ++sum_d;
			if(s[i]=='M') sum+=sum_d,++sum_m;
			if(s[i]=='C') ans+=sum;
		}
		cout<<ans<<"\n";
	}
	return ;
}

signed main(){
	solve();
	return 0;
}

标签:DMC,int,题解,sum,贡献,--,le,prelims,define
From: https://www.cnblogs.com/harmisyz/p/18058637

相关文章

  • CF1899G Unusual Entertainment 题解
    分析一眼树上启发式合并。定义\(x_i\)为节点\(i\)在序列\(p\)中的下标。则问题转化为:对于每组\(l,r,k\),询问以\(k\)为根的子树中是否有一个以上的节点,满足\(l\lex_j\ler\)。使用set存以\(i\)为根的子树中\(x_j\)的有序排列。则对于每个\(k=i\)的询问,去合......
  • AT_abc328_f [ABC328F] Good Set Query 题解
    分析考虑并查集。对于\(a_i,b_i,d_i\),若\(a_i,b_i\)在之前的满足要求的操作中,\(a_i,b_i\)不在同一个集合里,则在之前\(X_{a_i},X_{b_i}\)的相对差值是可以任意改变的。令\(k=X_{a_i}-X_{b_i}\),则我们需要将\(a_i\)所在集合中所有元素的值增加\(d_i-k\)。然后将\(a_i,b......
  • CF1895D XOR Construction 题解
    分析对于异或,有性质\(a\oplusb=c,a\oplusc=b,a\oplusa=0\)。则对于\(a_i\oplusa_{i+1}\),其表示的结果就是\(b_{i}\oplusb_{i+2}\)。做一个前缀异或和,就能够得到\(b_1\)与\(b_2,b_3,\dots,b_n\)的异或结果。考虑枚举\(b_1\),因为在有解的情况下\(b_1\op......
  • CF1896D 题解
    Solution令\(l,r\)能使\(\sum\limits_{i=l}^{r}a_i=S\)。考虑先令\(l=1\),那么如果存在\(\sum\limits_{i=1}^{r}=S\),即输出YES。如果没有,则一定有\(\sum\limits_{i=1}^{r}=S-1\),且\(a_{r+1}=2\)。考虑对\(l,r\)进行调整:将\(l\)向左移,\(r\)向右移。可以发现当\(......
  • AT_abc222_f [ABC222F] Expensive Expense 题解
    分析没脑子的题目。一眼换根DP。定义\(\mathit{f}_{i}\)表示\(i\)到\(i\)为根子树中某一个节点的距离最大值;\(\mathit{g}_{i}\)表示\(i\)经过其父节点到某个节点的距离最大值。那答案就是\(\max(\mathit{f}_i,\mathit{g}_i)\)。考虑转移。\(\mathit{f}_i\)的转移很......
  • CF1223F Stack Exterminable Arrays 题解
    分析接着这个说。现在我们需要优化\(\mathit{nxt}_{i}\)。重新定义一下,\(\mathit{nxt}_{i,j}\)表示在后\(i\)个数中,\(j\)第一次出现的位置,且\([i+1,\mathit{nxt}_{i+1,a_i}-1]\)是一个合法串。这玩意很像一个DP,所以完全可以按照DP的转移思路转移:\(\mathit{nxt}_{i,j}=......
  • CF514D R2D2 and Droid Army 题解
    分析乱搞题。考虑将区间\([l,r]\)中所有人干掉的代价。设\(cnt_{i}=\max\limits_{j=l}^{r}a_{j,i}\),则代价为:\(\sum\limits_{i=1}^{m}cnt_i\)。很显然,只有在\(\sum\limits_{i=1}^{m}cnt_i\lek\)是,我们才能将这些人全部干掉。考虑枚举右端点\(r\),与每个\(r\)对应的最......
  • P4863 题解
    Solution为了方便,我们定义\(f_n=\sum_{i=1}^{n}\sum_{j=i}^{n}\lfloor\frac{i}{j}\rfloor\times(-1)^j\)。于是答案即为\(f_b-f_{a-1}\)。观察到如果我们直接计算这个式子而不做丝毫变形的话时间复杂度是\(O(n^2)\)的。考虑把先枚举\(j\),计算\(j\)的贡献。此时就有......
  • CF1066E Binary Numbers AND Sum 题解
    分析因为\(a\)是一直没有改变的,移动的只有\(b\),所以从\(a\)的每一位的贡献入手。对于\(a\)中的从低到高第\(i\)位,其对应的十进制值是\(a_{n-i+1}\times2^{i-1}\)。注意到\(b\)是每次右移一位的,所以在\(b\)中能与\(a_{n-i+1}\)匹配的都是在下标区间\([1,m-i+1]......
  • ABC263F 题解
    Solution考虑\(f_{i,j}\)表示第\(i\)个人赢下了第\(j\)场的最大价值,答案即为\(\max_{i=1}^{n}f_{i,m}\)。然后考虑状态转移,令\(l,r\)为第\(i\)个人在打第\(j\)场比赛时的区间,\(mid\)为区间中点,然后分为两种情况:第\(i\)个人在左半部分,转移即为\(f_{i,j}=f_{i......