首页 > 其他分享 >hugeの张江蔡唐氏模拟赛题解

hugeの张江蔡唐氏模拟赛题解

时间:2024-01-23 12:00:54浏览次数:26  
标签:huge ch int 题解 环形 len 分界 唐氏

晚三huge不让去一机房,说便于管理,我的评价是:唐氏
况且二机房没有luogu,改完题后没事干(指写不了狼人),遂写个没人看的题解。
T1 纯哈希,不写。
T2 纯tarjan,一直没学,不写。

T3 比较套路的双指针,赛时降智
题意:给定由 \(B\) 和 \(R\) 组成的字符串,环形结构,每次可以交换相邻,问最少多少次可以将 \(B\) 放到一块,\(R\) 放到一块。多测(范围 \(10^6\))
阳历

输入
1 
BRRBRRRRBR
输出
3

我们先假设没有环形的交换,那么对于一个序列来说就是在一个分界处,分界左边的 \(B\) 全去左边,右边的全去右边。
显然这个分界是单调的,(因为如果当前分界比上一个不优时,那之后的分界一定严格劣于当前)
然后考虑环形,我们发现环形的交换还是不好处理,于是可以每次枚举环形的断点,对于每个断开的新序列进行如上操作。
显然分界不会受其影响,仍然是单调的。
于是我们复制一遍后进行双指针即可,时间复杂度 \(O(n)\)

#include<bits/stdc++.h>
#define int long long
inline int read(){
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
const int N=2e6+10;
char s[N];
int num_b[N],num_r[N];
inline int work(int l,int r,int ed){
	int x=ed+1;
	if(s[x]=='R')return 0;
	return (num_r[x]-num_r[l-1])-(num_r[r]-num_r[x-1]);
}
signed main(){
	// freopen("in.in","r",stdin),freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0),std::cout.tie(0);
	int T;std::cin>>T;
	while(T--){
		std::cin>>s+1;
		int len=strlen(s+1),n=len*2;
		for(int i=len+1;i<=n;++i)s[i]=s[i-len];
		for(int i=1;i<=n;++i){
			num_b[i]=num_b[i-1];
			num_r[i]=num_r[i-1];
			if(s[i]=='B')num_b[i]++;
			else num_r[i]++;
		}
		int ed=1,r,last_ans=0;
		for(int i=1;i<=len;++i){
			if(s[i]=='B'){
				if(num_r[i]>num_r[len]-num_r[i-1])break;
				last_ans+=num_r[i];
			}
			ed=i;
		}
		for(int i=ed+1;i<=len;++i)
			if(s[i]=='B')last_ans+=num_r[len]-num_r[i-1];
		int ans=last_ans;
		for(int l=2;l<=len;++l){
			r=len+l-1;
			if(s[r]=='B')continue;
			int pd=(num_b[r]-num_b[ed])-(num_b[ed]-num_b[l-1]);
			last_ans=last_ans+pd;
			int zc;
			while((zc=work(l,r,ed))<=0)last_ans+=zc,ed++;
			ans=std::min(last_ans,ans);
		}
		std::cout<<ans<<'\n';
	}
}

标签:huge,ch,int,题解,环形,len,分界,唐氏
From: https://www.cnblogs.com/Ishar-zdl/p/17981204

相关文章

  • 01.22 ARC170 题解慢报
    补完了,来发题解慢报。AB就不写了。CPrefixMexSequence考虑DP,\(f(i,j)\)表示前\(i\)个数,填了\(j\)个不同的数。如果\(s_{i+1}=1\)那么这位唯一确定,只需要保证\(j<m\)即可转移到\(f(i+1,j+1)\);如果\(s_{i+1}=0\)那么可以选旧的数也可以选新的数,分别转移即可。D......
  • 「Daily OI Round 1」block 题解
    设\(c_u\)表示节点\(u\)的颜色,\(f_u\)表示只考虑原树中\(u\)的子树中的点、选择点\(u\)的方案数。对于儿子\(v\),可以选择同色儿子节点,也可以跳过这个儿子节点,选择\(v\)的与\(u\)同色的儿子节点\(w\),故状态转移方程为:\[f_u=\prod[c_u=c_v]f_v+\left(\prod[c_u=c_w]......
  • CF1424M Ancient Language 题解
    1.题意描述一本字典中有\(r\)\((1\leqr\leq10^6)\)个单词,单词长度不超过$10^3$,所有字母都是小写英文字母,但字母排序不是按英文字母排序,求所有出现字母的一种排序,如果不存在,输出"IMPOSSIBLE"。2.题目分析由排序规则可知,对于字符串\(s\)和\(t\),\(s\)排在\(t\)......
  • CF618C Constellation 题解
    题意描述给定\(n\)个点(\(n\leq10^5\)),找到三个点满足这三个点不在同一直线上且三个点构成的三角形中不包含其他点,保证所有点不会在同一直线上。题目分析首先必然每一个点都可以作为一组解中的点。不妨其中一个点编号为\(1\)。找一个点作为第二个点,为了使没有点在这条边上,这......
  • CF1036F Relatively Prime Powers 题解
    题目分析对于一个不合法的数\(x(x\ge2)\),设\(x=\prodp_i^{r_i}\),令\(g=\gcd(r_1,r_2,\ldots,r_k)\),则\(x=\left(\prodp_i^{r_i/g}\right)^g\),所以\(x\)是一个正整数的\(g\)次方。所以可以枚举上文的\(g\),把每一类不合法方案排除掉,就是答案。设\(f(i)\)表示\(2\)......
  • AT_arc098_d Donation 题解
    一道在kruskal重构树上DP的题。首先,捐钱比较难想,可以反过来思考倒着走领钱的思路。显然,在第一次经过一个节点的时候领钱是最优的,对于节点\(i\),令\(c_i=\max\{a_i-b_i,0\}\),若当前的钱数是\(v\),到节点\(i\)的条件是\(v\gec_i\),如果不满足则把\(v\)补充到\(c_i\),同......
  • P5618 SDOI2015 道路修建题解
    题目分析虽然数据范围只有\(n\le60000\),但是完全可以直接用线段树做。首先考虑那种状态的图在左边和右边加入节点和边之后可以连通。容易发现,这种图有这两个性质:至少有一条路径,经过最左端和最右端中的点。所有点至少和最左端和最右端的点连通。于是可以划分成以下几种状态......
  • [ARC155C] Even Sum Triplet 题解
    一道大分类讨论。如果有一个可以交换的段包含奇数,那么你可以把所有奇数移到最左边并任意调整相对顺序,然后回到任意一种有一个可以交换的段包含奇数的状态。这种情况,如果偶数的数量为\(2\),这两个偶数是不能交换相对位置的,有至少\(3\)个偶数就能交换偶数间相对位置。所以只需要......
  • P7618 [COCI2011-2012#2] FUNKCIJA 题解
    看起来比较复杂,但实际上是一个树上dp的模型。因为每一重循环都最多有一个依赖,可以转化为树上的父子关系,于是就形成了一个森林。对于非叶子节点,设\(f_{u,i}\)表示第\(u\)循环变量的值是\(i\)时所有直接或间接依赖于它的循环变量(即以它为根的子树除开它的部分)循环次数,对非......
  • 题解-[ABC288D] Range Add Query
    题目:[ABC288D]RangeAddQuery-洛谷|计算机科学教育新生态(luogu.com.cn) 大意:一些数,选一个区间A(L~R),并再选一个区间B(长度k),这个区间B的每个数加减(加负数=减一个数)一个数,最终使得区间A全部数为0举个例(样例)0.   3-11-2201.  0-4-2-220 (-3)2.  ......