关闭

BZOJ3416: Poi2013 Take-out

标签: BZOJpoi
547人阅读 评论(0) 收藏 举报
分类:

题目大意:有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("");
	}
}


 

0
0
查看评论

BZOJ3416 Poi2013 Take-out

我们把c看成-k,b看成1,那么我们搞一个栈,从前往后扫,每次如果当前往前长度k+1和为0就说明可以消掉,然后倒序输出 #include #include #include #include #include #include #include #include #include #include...
  • neither_nor
  • neither_nor
  • 2016-09-24 09:19
  • 244

POI2013 题解

明显感觉POI2013比14和15难很多.....不看题解只做上了四道...... 而且POI2013感觉网上题解不是很多啊,大部分还是得看波兰文题解,所以最后也没做上几道题,很悲剧啊 题解链接: Stage I:  Price List    ...
  • commonc
  • commonc
  • 2016-06-14 15:16
  • 663

3427: Poi2013 Bytecomputer

3427: Poi2013 Bytecomputer Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 202  Solved: 116 [Submit][Statu...
  • CRZbulabula
  • CRZbulabula
  • 2017-01-18 15:37
  • 131

BZOJ3414: Poi2013 Inspector

题目大意:一天公司有n个员工和m个员工记录,每个员工只会在连续的一段时间内工作。现在给出m条记录分别是谁写的、什么时候写的以及写的时候除了他还有多少人。求最大的k使得前k条记录互不矛盾   挺神的题... 首先二分答案转成判定性问题,这样记录就没有先后顺序之分了 然后考虑什么情况会...
  • commonc
  • commonc
  • 2016-05-31 19:52
  • 615

[POI 2013]Bytecomputer(DP)

题目链接http://main.edu.pl/en/archive/oi/20/baj题目大意给你一个长度为nn的序列aa,序列里每个元素要么是0,要么是-1,要么是1,每次操作可以让a[x]=a[x]+a[x−1]a[x]=a[x]+a[x-1],问至少要做多少次操作,才能让整个序列变成非降序列思...
  • qpswwww
  • qpswwww
  • 2015-05-14 15:11
  • 667

POI2013

bzoj 3144先二分答案,然后就是求一些条件是否都可行。 首先一个人一定在第一次记录到最后一次记录的这段区间内出现。 然后每段区间可以两边扩展,如果一个人没有记录过那么他的区间是任意的。 那么可以把当前工作的人分成三类:在区间内的人,区间未开始的人,区间已经结束的人。 没记录过的人属于第...
  • make_it_for_good
  • make_it_for_good
  • 2016-09-28 17:23
  • 245

BZOJ3427 Poi2013 Bytecomputer

发现答案肯定是前边一段-1,中间一段0,后边一段1的形式(可能有的段长度为0),可以证明出现2或者-2或者绝对值更大的数一定不是最优解 做一个f[i]和g[i],f[i]表示把i到n都变成1的代价,g[i]表示把1到i都变成-1的代价 那么如果第一个数就是1,那么肯定要把所有数都变成1,如果第一...
  • neither_nor
  • neither_nor
  • 2016-09-22 16:15
  • 347

[POI2013]MOR-Tales of seafaring 洛谷3556 bfs

DescriptionYoung Bytensson loves to hang out in the port tavern, where he often listens to the sea dogs telling their tales of seafaring.Initially, he...
  • jpwang8
  • jpwang8
  • 2017-04-17 19:38
  • 182

BZOJ3424: Poi2013 Multidrink

题目大意:给一棵树,每次步伐大小只能为1或2,要求不重复的遍历n个节点,且起点为1,终点为n 首先推荐Claris的题解,讲得还是挺详细的 其次推荐算是此题题解的英文论文,可以在看Claris题解的同时补充一下   不想看英文论文的就可以看我的补充了.... 1.首先证明当一个节...
  • commonc
  • commonc
  • 2016-05-29 20:49
  • 632

BZOJ3417 Poi2013 Tales of seafaring

我们可以在两个点之间来回反复,所以问题就变成了判断两点之间道路条数为奇数或偶数的最短路是否小于等于d 分成图,边都跨层连,即可算出奇数最短路和偶数最短路 注意特判孤立点询问自己的情况 #include #include #include #include #include #include #...
  • neither_nor
  • neither_nor
  • 2016-09-22 14:19
  • 438
    个人资料
    • 访问:100814次
    • 积分:2514
    • 等级:
    • 排名:第17293名
    • 原创:156篇
    • 转载:3篇
    • 译文:0篇
    • 评论:27条