D. Challenges in school №41(模拟)Codeforces Round #632 (Div. 2)

D. Challenges in school №41(模拟)Codeforces Round #632 (Div. 2)_第1张图片

传送门

思路:直接模拟预处理出所有学生同时转向的位置,然后拆成k次输出

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int maxn=2e5+10;
 
int n,k;
vector<int> vec[maxn];
string s;
 
int main()
{
	scanf("%d%d",&n,&k);
	cin>>s;
	s="0"+s;
	int cnt=0;
	ll sum=0;
	while(1)
	{
		bool valid=false;
		cnt++;
		for(int i=1;i<n;++i)
		{
			if(s[i]=='R'&&s[i+1]=='L')
			{
				vec[cnt].push_back(i);
				swap(s[i],s[i+1]);
				i++;
				valid=true;				
			}
		}
		if(!valid)
			break;
		sum+=vec[cnt].size();
	}
	if(vec[cnt].size()==0)
		cnt--;
	
	if(k<cnt||k>sum)
	{
		puts("-1");
		return 0;
	}
	
	for(int i=1;i<=cnt;++i)
	{
		int p=0,len=vec[i].size();
		while(p<len&&k>cnt-i+1)
		{
			printf("1 %d\n",vec[i][p]);
			p++;
			k--;
		}
		
		if(p<len)
		{
			printf("%d ",len-p);
			for(int j=p;j<len;++j)	
				printf("%d%c",vec[i][j],j==len-1?'\n':' ');
			k--;
		}
	}	
	return 0;
}

你可能感兴趣的:(模拟,思维)