题目链接

BZOJ2217

题解

如果只判定存不存在方案的话,我倒是想到可以将\(2\)拆成两个\(1\),其中一个不能作为区间开头,线段树优化计算补集方案数

但是一看这道题要输出方案啊,,,
怎么办?
考虑如果凑不出\(x\),那一定可以凑出\(x + 1\)
我们就找到前缀和为\(x\)的位置,如果没有,就找\(x + 1\)
前缀和为\(x\)当然就得到答案啦
前缀和为\(x + 1\),我们考虑将区间整体右移,如果左端点出去和右端点进来的数相同,区间值不变,如果不同,那我们就可以通过调整使得区间的值减少\(1\)
贪心预处理一下答案即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 1000005,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int ansl[maxn << 1],ansr[maxn << 1],sum[maxn],R[maxn],n,m,N;
char S[maxn];
int main(){n = read(); m = read();scanf("%s",S + 1);REP(i,n) sum[i] = sum[i - 1] + (S[i] == 'W' ? 1 : 2);for (int i = n - 1; ~i; i--){if (sum[i + 1] - sum[i] == 2) R[i] = R[i + 1] + 1;else R[i] = 0;}//REP(i,n + 1) printf("R[%d] = %d\n",i - 1,R[i - 1]);int pos = 1;for (int i = 1; i <= sum[n]; i++){while (sum[pos] != i && sum[pos] != i + 1) pos++;if (sum[pos] == i) ansl[i] = 1,ansr[i] = pos;else {if (R[0] == R[pos]){ansl[i] = R[0] + 2,ansr[i] = pos + R[pos];}else if (R[0] < R[pos]) ansl[i] = R[0] + 2,ansr[i] = pos + R[0];else if (pos + R[pos] < n) ansl[i] = R[pos] + 2,ansr[i] = pos + R[pos] + 1;}}int len;while (m--){len = read();if (!ansl[len] || ansl[len] > ansr[len]) puts("NIE");else printf("%d %d\n",ansl[len],ansr[len]);}return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9222829.html

BZOJ2217 [Poi2011]Lollipop 【贪心】相关推荐

  1. BZOJ2217 [Poi2011]Lollipop

    结论:假如存在一个子串和为x,那么一定存在一个前缀,和为x或x+1 证明:可以认为原串是由和为x的串在开头和结尾添加若干数得到,再后边添加数不会对产生和为x或x+1的前缀产生影响,所以只考虑在前边添加 ...

  2. 【BZOJ2217】[Poi2011]Lollipop 乱搞

    [BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...

  3. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special Judge Submit: 383  Solve ...

  4. BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】

    题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...

  5. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

  6. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  7. Too Many Segments CF595D 贪心乱搞

    传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...

  8. Roundgod and Milk Tea 贪心

    这个题好像可以用一种类似与置换的贪心方法来做~ sum记为剩余奶茶,一开始sum等于奶茶和 ans记录已经喝的奶茶数 不用排序,我们就从前往后直接处理,考虑的是每一个班最多可以喝多少杯奶茶 就是从剩余 ...

  9. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

最新文章

  1. Ubuntu 系统 下 AndroidStudio 工具 使用ctrl+z 回退上一步的方法
  2. educoder python入门之基础语法-用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...
  3. aMCMC for Horseshoe: algorithms
  4. com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy
  5. 一篇文章让你真正了解Java
  6. Arthas 使用的四种方式
  7. Android基础 EventBus3 0实用教程
  8. php 常用简单函数,PHP中常用函数简单介绍
  9. PAT练习题:D进制的A+B(C++)
  10. 手握14万,博越是最佳选?这车配钢炮动力,可双屏互动,不香?
  11. tomcat + apache组合配置
  12. 电脑ps4,人在外心在家,教你用PC/MAC远程打PS4
  13. unity开发罗技G29方向盘(制作操作汽车)
  14. Winform/C#入门编程之第三部分容器(四:缩放控件SplitContainer)
  15. PreparedStatement的使用
  16. IDEA类图标有小叉叉×
  17. ERNIE: Enhanced Language Representation with Informative Entities
  18. oracle缩小数据文件大小,怎样将数据文件的大小变小
  19. java实现发送手机验证码功能
  20. NIO与Netty编程(三)之Netty编程

热门文章

  1. 手机有信号但是连不上网是怎么回事?
  2. ASP.NET 是什么
  3. 养老金总额和个人账户本息总额啥区别,退休后按照哪个账户计算养老金呢?
  4. 一公顷等于多少平方米
  5. 马化腾一直都在闷声发财,马云却到处开课当导师
  6. 对中小电商卖家来说,找1-2个靠谱的供应链,不需要多
  7. “画大饼”行走江湖的必备技能
  8. 为什么越有钱的人负债越多?
  9. 为什么Mate40Pro没有OIS光学防抖?
  10. pickle使用实例