首页 > 其他分享 >Ciel and Flipboard

Ciel and Flipboard

时间:2023-08-24 20:12:13浏览次数:37  
标签:ch Ciel int Flipboard ans define getchar

Ciel and Flipboard

一道好题,很有思维难度。
首先,我们发现 \(n\) 很小,所以对于一些位置应该是可以枚举的,再通过一些限制来确定其他位置。
对于操作的矩阵 \(m * m\),我们发现中间一行必会被操作,而 \(i\) 和 \(i + m\) 行有且仅有一个被操作,那么设 \(f_{i,j}\) 表示 \(i\) 行 \(j\) 列的点是否操作,那么 \(f_{i,j} \oplus f_{m,j} \oplus f_{i + m,j} = 0\),列同理。
这样,我们只需要确定四分之一个矩形的状态即可,但这样还不够,因为 \(n \le 33\),猜想一下时间复杂度应该为 \(O(2^m m^k)\),那么我们考虑如何只确定一行,我们发现只要确定第 \(m\) 行,其他位置的状态是独立的,可以直接一位一位贪心,这样这题就解决了,时间复杂度\(O(2^mm^2)\)。

Code
#include<bits/stdc++.h>
#define LL long long
#define eb emplace_back
#define IN inline
using namespace std;
const int N = 50, inf = 1e9;
int n, m, a[N][N], b[N];

IN int read() {
	int t = 0,res = 0; char ch = getchar();
	for (; !isdigit(ch); ch = getchar()) t |= (ch == '-');
	for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
	return t ? -res : res;
}
int work() {
	int res = 0;
	for (int i = m + 1; i <= n; i++) b[i] = b[m] ^ b[i - m];
	for (int i = 1; i <= n; i++) res += b[i] ? -a[i][m] : a[i][m];
	for (int i = 1; i < m; i++) {
		int mz = -inf;
		for (int j = 0; j < 2; j++) {
			int tmp = 0;
			for (int k = 1; k < m; k++) {
				int fl1 = b[k] ? -1 : 1, fl2 = j ? -1 : 1, fl3 = j ^ b[m + k] ? -1 : 1;
				int z = a[k][i] + a[k][i + m] * fl1 + a[k + m][i] * fl2 + a[k + m][i + m] * fl3;
				if (z < 0) z = -z;
				tmp += z;
			}
			int fl1 = j ? -1 : 1, fl2 = j ^ b[m] ? -1 : 1;
			mz = max(mz, tmp + fl1 * a[m][i] + fl2 * a[m][i + m]);
		}
		res += mz;
	}
	return res;
}
int main() {
	n = read(), m = n / 2 + 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) 
			a[i][j] = read();
	int ans = -inf;
	for (int i = 0; i < (1 << m); i++) {
		for (int j = 1; j <= m; j++) b[j] = (i >> j - 1) & 1; 
		ans = max(ans, work());
	}
	printf("%d\n", ans); 
}

标签:ch,Ciel,int,Flipboard,ans,define,getchar
From: https://www.cnblogs.com/nibabadeboke/p/17655052.html

相关文章

  • CF321C Ciel the Commander 题解 点分治
    题目链接:http://codeforces.com/problemset/problem/321/C解题思路:点分治模板题。每次找到重心给他分配一个字符,分治往下走的时候分配的字符ASCII码\(+1\)即可。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;vector<int>g[maxn];i......
  • Codeforces Round #190 (Div. 2)-C. Ciel and Robot
    原题链接C.CielandRobottimelimitpertestmemorylimitpertestinputoutputs.Eachcharacterof sU':goup,(x,y)  → D':godown,(x,y)  → L':goleft,(x,y)  → R':goright,(x,y) ......
  • CF321E - Ciel and Gondolas
    考虑\(dp_{i,j}\)表示用\(i\)条船载走前\(j\)个人的最小贡献,\(w_{i,j}\)表示区间\([i,j]\)里的人同乘一条船的代价。则\(dp_{i,j}=\min_{1\lek\ltj}(dp_{i-1,k}+w_{k+1,j})\)。我们发现,\(w_{i,j}\)可以通过\(w_{i,j-1}+s_{j,j}-s_{j,i-1}\)递推计算。其中\(s_{i,......
  • [CF321E]Ciel and Gondolas
    做题时间:2022.10.18\(【题目描述】\)有\(n(n\leq4000)\)个人按\(1\rightarrown\)编号,并按这个顺序站成一排,现在要将他们分成连续的\(k(k\leq\min(n,800))\)组,对......
  • cf321 C. Ciel the Commander
    题意:用'A'~'Z'​给一棵树上的点染色,要求若两点字符相同则两点间的路径上一定有字符更小的点。思路:法一:点分治树的重心能把树划分成每块大小不超过\(n/2\)的连通块......