JZOJ 5778

Description

被污染的灰灰草原上有羊和狼。有N只动物围成一圈,每只动物是羊或狼。

该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+K]区间的整数,游戏按顺时针方向进行。每只动物报的数字都不能超过M。

若一只动物报了M这个数,它所在的种族就输了。问以第i只动物为游戏的开始,最后哪种动物会赢?

Input

第一行输入三个正整数N,M,K。

接下来一行N个正整数,分别表示N只动物的种类,以顺时针的方向给出。0代表羊,1代表狼。

Output

一行输出N个整数,表示若从第i只动物开始,赢的动物的种类。同上,0代表羊,1代表狼。

Sample Input

Input 1

2 9 2
0 1

Input 2

6 499 5
1 0 0 1 1 0

Input 3

10 100 10
0 0 0 1 1 1 1 0 1 1

Sample Output

Output 1

0 1

Output 2

0 1 1 1 1 0

Output 3

1 1 1 1 1 1 1 1 1 1

Data Constraint

对于60%的数据,1 ≤ N, M, K ≤ 500。

对于100%的数据,1 ≤ N, M, K ≤ 5000。



一开始以为结论博弈题,玩了玩发现好像并不是

又以为是 SG 函数,心想只能打暴力了

yy 了一下写了个 dp  (差点就写对了?

一开始觉得破环成链复制出来 m 个很虚,也没敢接着想

反正状态是错的:f[i][j] 表示第 i 个数第 j 个人选是必胜还是必败

还有带个线段树优化成 O(n ^ 2 * logn)

居然还有8分

正解是这样的

f[i][j] 表示 在位置 i 这个人选择 j 这个数是必胜还是必败

最多每个人都选择增大 1 ,所以将人复制成为 n + m 个

边界:所有人选 m 都是必败,第 n + m - 1 个人只能选 1, 也是必败,就不用更新他了

倒着递推出之前的

f[i][j] 从 f[i][j + 1] ~ f[i][j + k] 更新

判断上一个人是不是队友,是队友只要有必胜态,此状态还是必胜

不是队友只要有必胜态,此状态为必败态,否则必胜

什么前缀和线段树什么的随便优化一下就好了



代码:

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cstdio>
using namespace std;

const int MAXN = 5005;

int n, m, k;
int per[MAXN << 1], f[MAXN << 1][MAXN];

inline int rd() {
	register int x = 0;
	register char c = getchar();
	while(!isdigit(c)) c = getchar();
	while(isdigit(c)) {
		x = x * 10 + (c ^ 48);
		c = getchar();
	}
	return x;
}

int main() {
	freopen("vode.in", "r", stdin);
	freopen("vode.out", "w", stdout);
	n = rd(); m = rd(); k = rd();
	for(int i = 1; i <= n; ++i) per[i] = rd();
	int ptr = n;
	while(ptr < m + n) {
		++ptr;
		per[ptr] = per[ptr - n];
	}
	for(int i = n + m - 2; i >= 1; --i) {
		int pre = 0;
		for(int j = m - 1; j >= 1; --j) {
			f[i][j] = ((per[i] == per[i + 1]) ? (!(pre == 0)) : (pre == 0));
			pre += f[i + 1][j];
			if(m - j + 1 >= k) pre -= f[i + 1][j + k];
		}
	}
	for(int i = 1; i <= n; ++i) {
		bool win = false;
		for(int j = 1; j <= k; ++j) win |= f[i][j];
		printf("%d ", win ? per[i] : (per[i] ^ 1));
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/xcysblog/p/9446016.html

时间: 2024-11-03 18:08:13

JZOJ 5778的相关文章

[DP][博弈][后缀和]JZOJ 5778 没有硝烟的战争

Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼.该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+K]区间的整数,游戏按顺时针方向进行.每只动物报的数字都不能超过M.若一只动物报了M这个数,它所在的种族就输了.问以第i只动物为游戏的开始,最后哪种动物会赢? Input 第一行输入三个正整数N,M,K.接下来一行N个正整数,分别表示N只动物的种类,以顺时针的方向给出.0代表羊,1代表狼. Outp

[jzoj]1383.奇怪的问题

Link https://jzoj.net/senior/#main/show/1383 Problem Alice总是会提出很多奇怪的问题,一天他让他的朋友Bob跟他一起研究一个奇怪的问题.问题是:[A,B]中有多少个数满足组成这个数的数字之和为S,另一个问题是[A,B]内满足这一要求最小的数是哪个? 编程帮Bob解决这个问题. Solution 30分 显然可以使用暴力枚举,像我这样的渣渣,考试的时候想到数位DP,设完一个不完整的状态,根本不知道如何统计答案 100分 聪明的人都知道,若要求

[jzoj]4216.【NOIP2015模拟9.12】平方和

Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X,在序列的第Y个数之前插入一个数X: ②Add L R X,对序列中第L个数到第R个数,每个数都加上X: ③Query L R,询问序列中第L个数到第R个数的平方和. Solution 我不会告诉你这道题我打了10000+byte,并且改了2个月,50多个小时,删掉代码重打了5次.这道题用splay来

[jzoj]3456.【NOIP2013模拟联考3】恭介的法则(rule)

Link https://jzoj.net/senior/#main/show/3456 Description 终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室.正当她们松了一口气时,这个世界却发生了天翻覆地的变化:地面开始下沉,天空开始变成血红色,海水沸腾……一幅世界末日的图景.美鱼从她手中的古籍<若山牧水诗歌集>中发现了原因:白鸟は かなしからずや 空の青 海のあをにも 染まずただよふ .大(xia)意(shuo)就是狡猾的恭介在创造这个世界的时候就篡改了法则.而这个法则

[jzoj]3875.【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)

Link https://jzoj.net/senior/#main/show/3875 Problem 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流. 但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个星球,使得它们能够相互到达.若两个星球属于同一个联盟,则必须存在一条环形线路经过这两个星球,即两个星球间存在两条没有公共隧道的路径. 为了壮大联盟的队伍,这些星球将建设P条新的太空隧道.这P条新隧道将按

[jzoj]2938.【NOIP2012模拟8.9】分割田地

Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分给这些儿子.分给每个儿子的土地最小的单位是一个栅格,同时,分给同一个儿子的土地要求要相邻连续的.地主觉得分给某个儿子的土地面积至少有一个栅格,但是具体多少可以随意. 请问,聪明的你,能够算出地主一共有多少种分土地的方法吗?也就是说要求把2*n的栅格分成k个连通区域,每个区域至少有一个栅格. Solu

[jzoj]1229.Hanoi

Link https://jzoj.net/senior/#main/show/1229 Description Mpq 小时候只玩过俄罗斯方块这个经典的小游戏,当时他还不知道Hanoi 究竟是什么东西.话说当Mpq 第一次认识Hanoi 是在初三那年的联赛.由于Mpq 之前并不知道Hanoi 是什么东西,所以那一年他做完前三题之后很郁闷地坐了1 个半小时...好了,现在Mpq 成长了,他已经解决当年联赛那道Hanoi 了,在前几个月,他又发现一道关于Hanoi 的题目了,很幸运的是这个题目他知

[jzoj]1115.【HNOI2008】GT考试

Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数字A1A2A3...Am-1Am(0<=Ai<=9)有m位,不出现是指X1X2X3...Xn-1Xn 中没有恰好一段等于A1A2A3...Am-1Am.A1和X1可以为0. 阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结

[jzoj]5478.【NOIP2017提高组正式赛】列队

Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n,列数为 m.       为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中从 1 到 n × m 编上了号码(参见后面的样例).即:初始时,第 i 行第 j 列的学生的编号是(