BZOJ3416: Poi2013 Take-out

原创 2016年05月31日 20:11:48

题目大意:有n块砖,其中白色是黑色的k倍,求一个消除序列,满足以下条件:

                  每次消除k+1个砖,其中k块白色,1块黑色,并且这k+1块砖从开始到结束,中间不能路过已经消除过的砖

                  数据保证有解

 

这真是一个悲伤的故事,首先我把题想偏了,以为是只能每次取两边,写了一发WA了

然后网上没有题解,就很悲催的去看了波兰文的题解,里面一大堆百度翻译都翻译不出来的波兰语,就是如同什么“好数”“谈笑风声”之类的定义

幸亏我机智的看懂了他说的一部分话,才发现题意想错了,具体做法其实很简单

 

我们把这个序列的白色看成1,黑色看成-k,这样的话可以求一个前缀和,最近的a[i]相同的两个点之间的距离一定恰好为k+1

那我们就可以弄一个栈,按顺序把前缀和推进去,每当新进来的元素和之前栈中某一个元素权值相同,就把新来的元素连同两个元素之间的元素全部弹出,作为一次消除操作

这样的话倒序的消除序列一定是合法的,我就不证了

时间复杂度O(N)

 

然后还有一件事,POI官方题解时间复杂度O(NlogK)我也不知道是什么鬼,有兴趣可以去看看 POI2013波兰文题解 第82页

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define N 1000010
using namespace std;
bool la[N<<1];
char s[N];
int a[N];
int q[N],t;
vector<int>ans[N];
int main()
{
	int n,k;
	scanf("%d%d%s",&n,&k,s+1);
	int i,j,x,y;
	for(i=1;i<=n;i++)
	{
		if(s[i]=='c') a[i]=a[i-1]-k;
		else a[i]=a[i-1]+1;
	}
	int cnt=0;
	la[n]=true;
	for(i=1;i<=n;i++)
	{
		a[i]+=n;
		if(la[a[i]])
		{
			cnt++;
			for(j=t-k+1;j<=t;j++)
			{
				ans[cnt].push_back(q[j]);
				la[a[q[j]]]=false;
			}
			ans[cnt].push_back(i);
			t-=k;
		}
		else
		{
			t++;q[t]=i;
			la[a[i]]=true;
		}
	}
	for(i=cnt;i>=1;i--)
	{
		for(j=0;j<ans[i].size();j++)
		printf("%d ",ans[i][j]);
		puts("");
	}
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BZOJ3421: Poi2013 Walk

题目大意:有2n2^n个长度为n的01串,两个01串之间有边当且仅当这两个01串只有一位不同,现在从这2n2^n个串中拿掉k个,问指定两个串之间能否到达吐槽: 先给这题100个差评,这题无论是POI...
  • commonc
  • commonc
  • 2016年06月14日 13:26
  • 514

【POI2013】【BZOJ3417】Tales of seafaring

DescriptionYoung Bytensson loves to hang out in the port tavern, where he often listens to the sea d...

BZOJ3426: Poi2013 Tower Defense Game

题目大意:有一个n个点m条边的图,每条边距离是1,已知用k个攻击距离为1的塔可以打到整个地图,让构造一个方案使得用小于等于k个攻击距离为2的塔打到整个地图   说是有spj,但是实际上没有,不过没...
  • commonc
  • commonc
  • 2016年05月29日 13:13
  • 385

BZOJ3419: Poi2013 Taxis

题目大意:一条线段有三个点,0为当前所在位置,d为车站位置,m为家的位置,人不想走路可以叫车,每辆车有一个路程上限,并且都从车站出发,叫的车行驶之后不必须回到车站,问最少叫几辆车   第一步想到的...
  • commonc
  • commonc
  • 2016年05月29日 14:22
  • 497

BZOJ 3417 Poi2013 Tales of seafaring BFS

题目大意:给定一张无向图,每条边边权都是1,多次询问是否存在某个点到达另一个点的长度为d的路径 首先如果s和t是同一点且这个点没有出边 那么s到t只存在长度为0的路径 否则: 如果s到t有长度为...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年03月24日 12:58
  • 1282

BZOJ3417: Poi2013 Tales of seafaring

题目大意:给n个点m条边无向图,每次询问两个点之间是否有长度为d的路径(不一定是简单路径)   从a到b假如有长度为x的路径,那就可以往回走一步再往前走一步得到长度为x+2的路径 所以可以求出每...
  • commonc
  • commonc
  • 2016年05月31日 14:46
  • 380

BZOJ3420: Poi2013 Triumphal arch

题目大意:给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜。求能让A获胜的最小...
  • commonc
  • commonc
  • 2016年05月29日 13:30
  • 419

BZOJ3424: Poi2013 Multidrink

题目大意:给一棵树,每次步伐大小只能为1或2,要求不重复的遍历n个节点,且起点为1,终点为n 首先推荐Claris的题解,讲得还是挺详细的 其次推荐算是此题题解的英文论文,可以在看Claris题解...
  • commonc
  • commonc
  • 2016年05月29日 20:49
  • 566

BZOJ3427: Poi2013 Bytecomputer

题目大意:给一个只包含-1,0,1的数列,每次操作可以让a[i]+=a[i-1],求最少操作次数使得序列单调不降   一看就是个DP,不妨用f[i][0..1..2]分别表示把第i位变成-1,0,...
  • commonc
  • commonc
  • 2016年05月29日 10:58
  • 487

louboutin france t namely warm canvas shoes ought be take out the fashion stage in this fresh season

t namely lukewarm canvas shoes should be take out the fashion stage in this fresh season,louboutin f...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ3416: Poi2013 Take-out
举报原因:
原因补充:

(最多只允许输入30个字)