POI2011 棒棒糖 Lollipop

POI2011 棒棒糖 Lollipop

题目传送门

题意

\(Byteasar\)在比特镇开了一家糖果店,草莓香草味的棒棒糖是当地孩子们的最爱。这些棒棒糖都是由长度相同的香草味或者草莓味的片段组成的。一整根棒棒糖的价格是每一段棒棒糖的价格之和,每一段香草味的棒棒糖价格为一元,草莓味的棒棒糖价格为两元。

图1:举个例子,这是一根由五段组成的棒棒糖,草莓味和香草味的棒棒糖交替排列,这根棒棒糖的价格为\(8\)元。

现在,\(Byteasar\) 只剩下最后一根棒棒糖了。这根棒棒糖太长了,因此 \(Byteasar\) 认为绝对没有人会买下这一整根。所以,他想要把这一整根在接缝处掰成几段,每一段单独出售。

\(Byteasar\) 的人生经验告诉他,他的顾客希望把自己的钱花在单独的一根棒棒糖上,于是他想知道这一根棒棒糖有没有连续的一段的价格是 \(k\)。但这个问题对他来说太难了,他希望你能帮帮他。

题解

考虑如何构造,假设当前考虑到了第\(i\)位,前\(i-1\)位的价值和为\(sum\),如果第\(i\)为价值为\(1\),那么很显然可以直接构造出\(sum+1\),如果价值为\(2\),那么我们只能够直接构造出\(sum+2\),接下来考虑如何构造\(sum+1\)。我们记\(ct_i\)表示从第\(i\)为开始有多少连续的\(2\),那么我们比较\(ct_1\)和\(ct_i\)。如果\(ct_1<ct_i\),那么我们可以去掉前\(ct_1\)个\(2\),加上\(i\)之后\(ct_i\)个\(2\),这样一段的和仍然是\(sum\),然后再加上\(1+ct_1+1\)这一位上的1,这样一段的和就是\(sum+1\),\(ct_1>=ct_i\)也是类似,如此\(O(n)\)构造即可。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=4e6+500;
int n,m,sum;
char s[N];
int l[N],r[N],ct[N];

int main() {
  scanf("%d%d",&n,&m);
  scanf("%s",s+1);
  for(int i=n;i;i--) {
    if(s[i]=='T') ct[i]=ct[i+1]+1;
    else ct[i]=0;
  }
  for(int i=1;i<=n;i++) {
    sum+=s[i]=='T'?2:1;
    l[sum]=1;r[sum]=i;
    if(s[i]=='T') {
      if(ct[1]<ct[i]) l[sum-1]=2+ct[1],r[sum-1]=i+ct[1];
      else l[sum-1]=1+ct[i],r[sum-1]=i+ct[i];
    }
  }
  for(int i=1,k;i<=m;i++) {
    scanf("%d",&k);
    if(l[k]>=1&&r[k]<=n) printf("%d %d\n",l[k],r[k]);
    else puts("NIE");
  }
  return 0;
}

原文地址:https://www.cnblogs.com/Apocrypha/p/10445935.html

时间: 2024-11-09 01:56:16

POI2011 棒棒糖 Lollipop的相关文章

Android发展历程

2003年10月,Andy Rubin等人创建Android公司,并组建Android团队. 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队.安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目. 2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商.软件开发商.电信运营商以及芯片制造商共同组成,并与84家硬件制造商.软件开发商及电信营运商

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

代号 版本号 API/NDK级别 发布时间 棉花糖 Marshmallow 6.0.1 API level 23 2015-12 6 2015-10-05 棒棒糖 Lollipop 5.1.1 API level 22 2015-04-21 5.1 2015-03-09 5.0.2 API level 21 2014-12-19 5.0.1 2014-12-02 5 2014-11-12 奇巧 KitKat 4.4W.2 API level 20 2014-10-21 4.4W.1 2014-0

DragLayout: QQ5.0侧拉菜单的新特效

一.项目概要 1.1 项目效果如图: 1.2 需要使用到的技术   ViewDragHelper: 要实现和QQ5.0侧滑的特效,需要借助谷歌在2013年I/O大会上发布的ViewDragHelper类,提供这个类目的就是为了解决拖拽滑动问题 1.3 侧滑菜单的实现方式 1. SlidingMenu 第三方库 2. DrawerLayout v4包中的类 3. 自定义控件 1.4 一些回调方法 - tryCaptureView: 用来决定是否可以拖动 - clampViewPositionHor

39.Android版本小知识

中文名----英文名----版本----对应API Level 棉花糖 Marshmallow - 6.0.1_r10 - API 23棉花糖 Marshmallow - 6.0.0_r5 - API 23棉花糖 Marshmallow - 6.0.0_r1 - API 23 棒棒糖 Lollipop - 5.1.1_r6 - API 22棒棒糖 Lollipop - 5.1.0_r1 - API 22棒棒糖 Lollipop - 5.0.0_r2 - API 21 Android Wear -

Android各版本代号、版本号、API/NDK级别、发布时间及市场份额

Android各版本代号.版本号.API/NDK级别.发布时间及市场份额 代号 版本号 API/NDK级别 发布时间 棉花糖 Marshmallow 6.0.1 API level 23 2015-12 6 2015-10-05 棒棒糖 Lollipop 5.1.1 API level 22 2015-04-21 5.1 2015-03-09 5.0.2 API level 21 2014-12-19 5.0.1 2014-12-02 5 2014-11-12 奇巧 KitKat 4.4W.2

【BZOJ2217】[Poi2011]Lollipop 乱搞

[BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T").现在有m个询问,每个询问是询问有没有一个连续的子序列,满足其和为q. Input 第一行n,m (1<=n,m<=1000000)第二行这个序列,起始编号为1,终止编号为n下面每行一个询问q,询问有没有一个连续的子序列,满足其和为q (1<=q<=2000000) Out

BZOJ 2217 Poi2011 Lollipop

题目大意:给定一个由1和2组成的序列,多次询问是否存在一个区间满足区间和=x 如果x>sum显然无解 如果存在一个前缀和为x则直接输出 否则一定存在一个前缀和[1,i]等于x+1 然后我们将左右端点同时右移 显然如果某一时刻a[l]=1或者a[r+1]=1那么我们就找到解了 记录exti表示从i开始有多少个连续的2 如果ext1<exti,那么解为[1+ext1+1,i+ext1] 如果ext1≥exti且i+exti≠n+1,那么解为[1+exti,i+exti] 否则无解 O(n)预处理所

BZOJ2217 : [Poi2011]Lollipop

若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间. 所以只需要分别找到和最大的和为奇数和偶数的区间,然后$O(n)$完成构造即可. #include<cstdio> #define N 1000010 int n,m,i,s[N],b,c,d,t,l,r,f[N<<1][2];char a[N]; inline void read(int&a){char c;while(!(((c=getchar())>='0')&&

android Lollipop勿扰模式

android的L新版本中增加了"打扰"的新功能,相信很多同学搞不明白.找了一篇介绍勿扰模式很好的文章,可惜是英文的,现翻译如下,相信读完此问,你会理解android对勿扰模式的设计. 原文链接:http://www.addictivetips.com/android/do-not-disturb-comes-to-android-lollipop-as-interruptions/ 更多信息:http://www.howtogeek.com/203716/how-to-manage-