专栏文章

Educational Codeforces Round 183 (Rated for Div. 2)

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mino1kki
此快照首次捕获于
2025/12/02 05:33
3 个月前
此快照最后确认于
2025/12/02 05:33
3 个月前
查看原文

B: Deck of Cards

Sol: 看成一个双端队列。若队中元素通过0或1的操作出队,状态一定是‘-’。当通过2出队的可能是在队首也可能在队尾,极限情况是均在队尾或均在队首。通过这两种操作出队的元素状态为'?',剩余仍在队列中的为'+'。模拟即可。

C: Monocarp's String

Sol: 统计字符串A与B个数之差diff,找到最短的连续子串使得A与B的个数之差等于diff。实现的巧妙之处在于利用了map的find和end功能。
Code
CPP
        for(int i=0;i<n;i++)
		{
			if(s[i]=='a')d++;
			else d--;
		}
		if(d==0)puts("0");
		else
		{
			map<int,int>x;
			int d1=d,d2=0,mn=1e9;
			x[0]=-1;
            //d1表示diff+B-A的前缀和
            //d2表示A-B的前缀和
			for(int i=0;i<n;i++)
			{
				if(s[i]=='a')
				{
					d1--;
					d2++;
				}
				else
				{
					d1++;
					d2--;
				}
                //对于右端点i,find(-d1)可以找到A-B个数差为diff的左端点,使得子串满足条件
				if(x.find(-d1)!=x.end())mn=min(mn,i-x[d1]);
                //对于相同的d2,i大的会覆盖小的,即左端点会尽可能靠近右端点,所以每次计算得到的长度会尽可能的小
				x[d2]=i;
			}
			if(mn==n)puts("-1");
			else cout<<mn<<"\n";
		}

评论

0 条评论,欢迎与作者交流。

正在加载评论...