BZOJ2217 [Poi2011]Lollipop 【贪心】
题目链接
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 【贪心】相关推荐
- BZOJ2217 [Poi2011]Lollipop
结论:假如存在一个子串和为x,那么一定存在一个前缀,和为x或x+1 证明:可以认为原串是由和为x的串在开头和结尾添加若干数得到,再后边添加数不会对产生和为x或x+1的前缀产生影响,所以只考虑在前边添加 ...
- 【BZOJ2217】[Poi2011]Lollipop 乱搞
[BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...
- bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
2217: [Poi2011]Lollipop Time Limit: 15 Sec Memory Limit: 64 MBSec Special Judge Submit: 383 Solve ...
- BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】
题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...
- 算法设计与分析第3章 贪心算法
第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- Too Many Segments CF595D 贪心乱搞
传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...
- Roundgod and Milk Tea 贪心
这个题好像可以用一种类似与置换的贪心方法来做~ sum记为剩余奶茶,一开始sum等于奶茶和 ans记录已经喝的奶茶数 不用排序,我们就从前往后直接处理,考虑的是每一个班最多可以喝多少杯奶茶 就是从剩余 ...
- 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码
1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...
最新文章
- Ubuntu 系统 下 AndroidStudio 工具 使用ctrl+z 回退上一步的方法
- educoder python入门之基础语法-用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...
- aMCMC for Horseshoe: algorithms
- com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy
- 一篇文章让你真正了解Java
- Arthas 使用的四种方式
- Android基础 EventBus3 0实用教程
- php 常用简单函数,PHP中常用函数简单介绍
- PAT练习题:D进制的A+B(C++)
- 手握14万,博越是最佳选?这车配钢炮动力,可双屏互动,不香?
- tomcat + apache组合配置
- 电脑ps4,人在外心在家,教你用PC/MAC远程打PS4
- unity开发罗技G29方向盘(制作操作汽车)
- Winform/C#入门编程之第三部分容器(四:缩放控件SplitContainer)
- PreparedStatement的使用
- IDEA类图标有小叉叉×
- ERNIE: Enhanced Language Representation with Informative Entities
- oracle缩小数据文件大小,怎样将数据文件的大小变小
- java实现发送手机验证码功能
- NIO与Netty编程(三)之Netty编程