LOJ #2156. 「POI2011 R1」棒棒糖 Lollipop(构造)

该博客详细解析了LOJ #2156题目的「POI2011 R1」棒棒糖(构造)问题。文章介绍了如何将价格2转化为长度2的棒棒糖,并提出了从左往右扫描的思路。通过分析不同情况,博主提出了一种优化算法:当坐标k的点为分界点时,答案区间为[0,k];否则,找到0和k后面第一个长度为1的段来确定合法方案。最终,博主分享了实现这一算法的AC代码。" 114245413,10012027,Java选择题详解与解析,"['Java', '基础语法', '数据类型', '数组操作', '字符串处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

我们把价格为 2 2 2看做是长度为 2 2 2,构成一个新的有很多个分界点为原来棒棒糖中不同口味的分界点的棒棒糖。
考虑暴力,我们是从左往右扫,如果相距为 k k k的两个点都是分界点,那么这就是一组答案。
考虑如果
1.当前两个点都不是分界点,那么右移长度1就一定两个都是。
2.如果有一个不是,
、那么如果是分界点那一个点后面是长度为1的口味,
、那么右移长度1也可以合法,
、否则:
、、右移长度1,重复2处的判断。

我们发现上面这个算法可以优化为:
如果坐标为 k k k的点事分界点,那么答案就是 [ 0 , k ] [0,k] [0,k]
否则,分别找到 0 0 0 k k k后面第一个长度为 1 1 1的段,求个合法方案即可。

A C   C o d e \mathrm {AC \ Code} AC Code

#include<bits/stdc++.h>
#define maxn 2000005
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
using namespace std;

int n,m,L,a[maxn],r[maxn];
char s[maxn];

int main(){
	scanf("%d%d",&n,&m);
	scanf("%s",s);
	rep(i,0,n-1){
		int t=L;
		L+=(s[i]=='T')+1;
		rep(j,t,L-1) a[j]=i;
 	}
 	int p=L+1;
 	per(i,L-1,0){
 		if(s[a[i]] == 'W') p=i;
 		r[i]=p;
	}
	for(int k;m--;){
		scanf("%d",&k);
		if(k>L) puts("NIE");
		else if(a[k]^a[k-1])	printf("%d %d\n",1,a[k-1]+1);
		else{
			int t=min(r[0]+1+k,r[k]+1);
			if(t > L) puts("NIE");
			else printf("%d %d\n",a[t-k]+1,a[t-1]+1);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值