首页 > 其他分享 >P6550题解

P6550题解

时间:2024-01-19 15:35:28浏览次数:26  
标签:两行 ch putchar int 题解 抛弃 P6550

P6550 [COCI2010-2011#2] LUNAPARK

题目传送门

题解

论证简单,构造逆天(好吧其实就是烦了点)。

每个格子是正整数,所以我们必然尝试多走格子。我们发现,只要 \(r,c\) 中有一个是奇数,我们就可以全部走到,构造很简单:我们找准奇数边,假设是 \(r\),蛇形地走,显然在奇数行我们会结束在末尾,在偶数行我们会结束在开头,所以是可行的。

if(r%2==1) {
    for(int i=1;i<=r;i++) {
        for(int j=1;j<c;j++)
            if(i%2==1) putchar('R');
            else putchar('L');	
        if(i!=r) putchar('D');
    }
    return 0;
}
if(c%2==1) {
    for(int i=1;i<=c;i++) {
        for(int j=1;j<r;j++)
            if(i%2==1) putchar('D');
            else putchar('U');	
        if(i!=c) putchar('R');
    }
    return 0;
}

我们现在只要考虑 \(r,c\) 均为偶数。

首先证明:此时不能走完。黑白染色易证(可以看其他题解)。

顺带的,我们可以证明:至少要抛弃一个白格才能走到终点(设起点是黑格)。

至于抛弃的白格有什么限制吗?答案是没有。

构造如下(以下建议画图理解):

我们每两行一考虑。

\(1\) 这两行没有出现要抛弃的点,且该点在这两行下面:按 \(RRR\cdots RDLLL\cdots LD\) 走。

\(2\) 这两行没有出现要抛弃的点,且该点在这两行上面:按 \(LLL\cdots LDRRR\cdots LR\) 走。

\(3\) 这两行出现了要抛弃的点:

再分类,我们每两列一考虑。

\((1)\) 这两列没有出现要抛弃的点,且该点在这两列右面:按 \(DRUR\) 走。

\((2)\) 这两行没有出现要抛弃的点,且该点在这两列左面:按 \(URDR\) 走。

\((3)\) 这两列出现了要抛弃的点:

分奇偶行考虑:

  • 在奇数行:按 \(DRR\) 走。

  • 在偶数行:按 \(RDR\) 走。

就构造完成了。

结束了吗?还有一个恶心的东西叫边界,一定不要走出去了!

完整代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd() {
	int s=0,m=0;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
	while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
	return m?-s:s;
}
int r,c,a[1005][1005];
int minn=LLONG_MAX,minx,miny;
signed main() {
	cin>>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			a[i][j]=rd();
	if(r%2==1) {
		for(int i=1;i<=r;i++) {
			for(int j=1;j<c;j++)
				if(i%2==1) putchar('R');
				else putchar('L');	
			if(i!=r) putchar('D');
		}
		return 0;
	}
	if(c%2==1) {
		for(int i=1;i<=c;i++) {
			for(int j=1;j<r;j++)
				if(i%2==1) putchar('D');
				else putchar('U');	
			if(i!=c) putchar('R');
		}
		return 0;
	}
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			if((i+j)%2==1&&a[i][j]<minn)
				minn=a[i][j],minx=i,miny=j;
	for(int i=1;i<=r;i+=2) {
		if(i+1<minx) {
			for(int j=1;j<c;j++)
				putchar('R');
			putchar('D');
			for(int j=1;j<c;j++)
				putchar('L');
			if(i+1!=r) putchar('D');
		}
		else if(i>minx) {
			for(int j=1;j<c;j++)
				putchar('L');
			putchar('D');
			for(int j=1;j<c;j++)
				putchar('R');
			if(i+1!=r) putchar('D');
		}
		else {
			for(int j=1;j<=c;j+=2) {
				if(j+1<miny) {
					putchar('D');
					putchar('R');
					putchar('U');
					if(j+1!=c) putchar('R');
				}
				else if(j>miny) {
					putchar('U');
					putchar('R');
					putchar('D');
					if(j+1!=c) putchar('R');
				}
				else {
					if(minx%2==1) {
						putchar('D');
						putchar('R');
						if(j+1!=c) putchar('R');
					}
					else {
						putchar('R');
						putchar('D');
						if(j+1!=c) putchar('R');
					}
				}
			}
			if(i+1!=r) putchar('D');
		}
	}
	return 0;
}

标签:两行,ch,putchar,int,题解,抛弃,P6550
From: https://www.cnblogs.com/operator-/p/17974766

相关文章

  • P5133题解
    P5133tb148的客人题目传送门题解唯一的一篇题解还是交错题的……很简单的一个二分加差分题。显然是二分答案,考虑检验。如果\(2mid+1\gen\),那么所有人可以自由去到任意位置,一定可行;否则,我们求出每个人可以去到的区间范围,并以此推出要满足这个人的限制,\(1\)号需要在哪个区......
  • P3867题解
    P3867[TJOI2009]排列计数题目传送门题解\(k\)很小,不是分讨就是突破口。如果我们用这种方式生成排列:将\(1\)到\(n\)按顺序插入当前状态,那么你会发现当前的数\(x\)的插入被很大程度的限制住了,我们只需记录当前\(x-k\)到\(x-1\)的位置即可枚举出所有可能的下一状态,因......
  • P7312题解
    P7312[COCI2018-2019#2]Sunčanje题目传送门题解分类讨论的思想有点像P4169?要你对于每一个矩形,求是否存在编号比它大,与它有交的矩形。直接做需要用一个比较神仙的线段树用法,所以我们可以容斥:我们求出编号比它大,与它无交的矩形数量,最后与所有可能覆盖它的矩形共\(n-i\)个......
  • P6554题解
    P6554PromisesICan'tKeep题目传送门题解看题解都有些做烦了,就来发一篇。换根dp。第一遍dfs处理出\(Lef_u\)表示\(u\)子树内的叶子个数(包含自己),然后求出以\(1\)为根时的答案\(\sumLef_u*val_u\),注意特判根为叶子的情况。第二遍dfs大力换根就好了,从根\(u\)......
  • P9744题解
    P9744「KDOI-06-S」消除序列题目传送门题解记错时间错过模拟赛的sb来也。题目中的最关键信息就是\(a_i,b_i,c_i\ge0\),这意味着多做无用的操作一定不优,所以有:结论\(1\):优先进行\(1\)操作。这是因为我们不管我们在\(1\)操作前做什么操作都会被其推平覆盖,是无用操......
  • P8047题解
    P8047[COCI2015-2016#4]GALAKSIJA题目传送门题解显然是要删边变加边的,然后联通性也是显然要用并查集维护的,就是路径异或和需要一个数据结构来维护。发现:加边删边不影响两个点的路径异或和。所以我们可以处理出每个点到\(1\)号节点的路径异或和\(d\),于是\(Path_{u,v}=d_u......
  • P8034题解
    P8034[COCI2015-2016#7]Ozljeda题目传送门题解评橙差不多了。手玩一下样例,很容易发现\(x\)的循环节为\(K+1\),每一段分别为\(a_1,a_2,a_3,\dots,a_K,\bigoplus_{i=1}^Ka_i\)这几项,然后恰好循环节的异或值为\(0\),所以就可以直接维护前缀异或值,然后取模求答案。代码:#i......
  • [AGC048D] Pocky Game 题解
    题目链接点击打开链接题目解法好难的题,想不出来一点!!!首先给出一个第一个结论:最优策略下,每个人每次只会取一个石子或者取完一堆石子题解区都没有严谨证明,\(at\)的\(editorial\)也没证,所以我只能感性理解:下面以先手为例。如果最左边的石子数\(>\)其余所有堆的石子数,那么先......
  • 题解 WD与数列
    P5161WD与数列可以想到原条件是一个差分形式,所以我们对原数组差分。然后发现答案其实就是\(\sum_{i<j}\min(lcp(i+1,j+1)+1,j-i)\)。这个东西先跑SA,然后建笛卡尔树。考虑对于一个区间,其值为\(x\)。那么相当于是求\(\sum_{l\inS,r\inT}\min(|sa_{l}-sa_{r}|,x)\)。笛......
  • AT_arc115_b [ARC115B] Plus Matrix 题解
    AT_arc115_b[ARC115B]PlusMatrix题解题意给定矩阵\(C_{n\timesn}\),求两个数列\(A_n,B_n\),使得\(C_{i,j}=A_i+B_j\)。分析画出一个表格来:213243502131324可以看出来,对于任意一列\(j\),\(C_{*,j}\)都存在有\(B_j\)的贡献。那么我们......