Kickstart Round H 2019 Problem B. Diagonal Puzzle
有史以来打得最差的一次kickstart竟然发生在winter camp出结果前的最后一次ks = = 感觉自己的winter camp要凉了
究其原因,无非自己太眼高手低,好好做B, C的小数据,也不至于最后才AC了第一题吧
B题,我花了两个小时也没AC = =,我的做法和题解大数据的第一种类似。
我们可以发现,每个点只由两个diagonal决定,然后每个diagonal至多做一次,做两次相当于白做嘛。
然后我们发现如果先讨论最长正对角线是否取,也就是从(0,0)到 (n-1,n-1),可以直接讨论出其中一半的diagonal和一半点的取舍问题,以5*5为例,如图所示。对于最长的正对角线上的每个元素,如果是'.', 那么必要动用他们所对应的反对角线才能翻过来,反之比不会动用这些反对角线。之后,如果这些被讨论到的反对角线上如果存在'.',那么我们就需要动用他们所对用的正对角线进行翻转。之后我们再判断是否所有点都被翻转了(图中最右边一张图重的所有黄色点)
上步我们发现我们只讨论一半的点和对角线的操作。对于 另一半,偶数长度边和奇数长度边的讨论是有些许不同的(如下图所示,奇数长度边的反最长对角线不在这一半中)。但是大方向一样,寻找剩下点中反对角线最长的一条,然后做和第二步类似的操作。要注意2,3两步都要先讨论对角线翻不翻转
细节还是看下代码 = = 写的有点长
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <bitset>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <functional>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <deque>
#include <stack>
#include <complex>
#include <cassert>
#include <random>
#include <cstring>
#include <numeric>
#define mp make_pair
#define ll long long
#define ld long double
#define null NULL
#define all(a) a.begin(), a.end()
#define forn(i, n) for (int i = 0; i < n; ++i)
#define sz(a) (int)a.size()
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define bitCount(a) __builtin_popcount(a)
template<class T> int gmax(T &a, T b) { if (b > a) { a = b; return 1; } return 0; }
template<class T> int gmin(T &a, T b) { if (b < a) { a = b; return 1; } return 0; }
using namespace std;
string to_string(string s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string) s); }
string to_string(bool b) { return (b ? "true" : "false"); }
template <typename A, typename B>
string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; }
template <typename A>
string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; }
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); }
#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
const int INF = 0x3f3f3f3f;
char seq[105][105];
int n;
int id1[105][105];
int id2[105][105];
int tmp[105][105];
vector<vector<pair<int, int> > > s1;
vector<vector<pair<int, int> > > s2;
void init() {
s1.clear(); s2.clear();
int cnt = 0;
for(int i = n-1; i >= 0; --i) {
int x = i; int y = 0;
vector<pair<int, int> > tmp;
while(1) {
id1[x][y] = cnt;
tmp.push_back(make_pair(x, y));
x ++; y ++;
if(x < 0 || x >= n || y < 0 || y >= n) break;
}
s1.push_back(tmp);
cnt ++;
}
for(int i = 1; i <= n-1; ++i) {
int x = 0; int y = i;
vector<pair<int, int> > tmp;
while(1) {
id1[x][y] = cnt;
tmp.push_back(make_pair(x, y));
x ++; y ++;
if(x < 0 || x >= n || y < 0 || y >= n) break;
}
s1.push_back(tmp);
cnt ++;
}
cnt = 0;
for(int i = 0; i <= n-1; ++i) {
int x = i; int y = 0;
vector<pair<int, int> > tmp;
while(1) {
id2[x][y] = cnt;
tmp.push_back(make_pair(x, y));
x --; y ++;
if(x < 0 || x >= n || y < 0 || y >= n) break;
}
s2.push_back(tmp);
cnt ++;
}
for(int i = 1; i <= n-1; ++i) {
int x = n-1; int y = i;
vector<pair<int, int> > tmp;
while(1) {
id2[x][y] = cnt;
tmp.push_back(make_pair(x, y));
x --; y ++;
if(x < 0 || x >= n || y < 0 || y >= n) break;
}
s2.push_back(tmp);
cnt ++;
}
// debug(s1, s2);
}
int solve1(int ty) {
// debug(ty);
int cnt = ty == 1; bool suc = true;
map<int, int> mp;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
tmp[i][j] = seq[i][j] == '#';
}
}
vector<int> diagnol;
int target = s1.size() / 2;
for(int i = 0, len = s1[target].size(); i < len; ++i) {
int x = s1[target][i].first; int y = s1[target][i].second;
// debug(tmp[x][y], (ty == 1));
if(tmp[x][y] == (ty == 1) ) {
cnt ++;
diagnol.push_back(id2[x][y]);
// debug("yingying");
}
if(ty == 1) tmp[x][y] = !tmp[x][y];
}
// debug(diagnol);
for(int i = 0, len = diagnol.size(); i < len; ++i) {
for(int j = 0, len2 = s2[diagnol[i]].size(); j < len2; ++j) {
int x = s2[diagnol[i]][j].first; int y = s2[diagnol[i]][j].second;
// debug(x, y);
tmp[x][y] = !tmp[x][y];
}
}
for(int i = target % 2; i < s1.size();i += 2) {
for(auto Point : s1[i]) {
int x = Point.first; int y = Point.second;
if(tmp[x][y] == 0) {
// debug(x, y);
mp[id1[x][y]] ++;
}
}
}
for(auto it : mp) {
// debug(it.first, it.second);
cnt ++;
if(s1[it.first].size() != it.second) {
suc = false; break;
}
}
if(suc == true) {
// debug(cnt);
return cnt;
}
else return INF;
}
int solve2(int ty) {
int cnt = ty == 1; bool suc = true;
map<int, int> mp;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
tmp[i][j] = seq[i][j] == '#';
}
}
vector<int> diagnol;
int target = s2.size() / 2;
if(n % 2) target --;
for(int i = 0, len = s2[target].size(); i < len; ++i) {
int x = s2[target][i].first; int y = s2[target][i].second;
if(tmp[x][y] == (ty == 1) ) {
cnt ++;
diagnol.push_back(id1[x][y]);
}
if(ty == 1) tmp[x][y] = !tmp[x][y];
}
// debug(diagnol);
for(int i = 0, len = diagnol.size(); i < len; ++i) {
for(int j = 0, len2 = s1[diagnol[i]].size(); j < len2; ++j) {
int x = s1[diagnol[i]][j].first; int y = s1[diagnol[i]][j].second;
tmp[x][y] = !tmp[x][y];
}
}
for(int i = 1; i < s2.size();i += 2) {
for(auto Point : s2[i]) {
int x = Point.first; int y = Point.second;
if(tmp[x][y] == 0) {
// debug(i, j)
mp[id2[x][y]] ++;
}
}
}
for(auto it : mp) {
cnt ++;
if(s2[it.first].size() != it.second) {
suc = false; break;
}
}
if(suc == true) return cnt;
else return INF;
}
int main() {
int T;
scanf("%d", &T);
for(int cas = 1; cas <= T; ++cas) {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%s", seq[i]);
}
init();
printf("Case #%d: ", cas);
if(n == 1) {
printf("%d\n", seq[0][0] == '.');
continue;
}
printf("%d\n", min(solve1(1), solve1(0)) + min(solve2(1), solve2(0)) );
}
return 0;
}
Kickstart Round H 2019 Problem B. Diagonal Puzzle的更多相关文章
- Kickstart Round D 2017 problem A sightseeing 一道DP
这是现场完整做出来的唯一一道题Orz..而且还调了很久的bug.还是太弱了. Problem When you travel, you like to spend time sightseeing i ...
- Kickstart Round H 2018
打了ks好久都没有更新 诶,自己的粗心真的是没救了,A题大数据都能错 A #include <iostream> #include <cstdio> #include < ...
- Let Me Count The Ways(Kickstart Round H 2018)
题目链接:https://code.google.com/codejam/contest/3324486/dashboard#s=p2 题目: 思路: 代码实现如下: #include <set ...
- Google Kick Start Round G 2019
Google Kick Start Round G 2019 Book Reading 暴力,没啥好说的 #include<bits/stdc++.h> using namespace s ...
- 清北学堂入学测试P4751 H’s problem(h)
P4751 H’s problem(h) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...
- 2019 google kickstart round A
第一题: n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同. 显然,如果存在p个人的技能值是相同的,输出0就可以了.如果不存在,就要找出p个人,对他们进行训练,治他 ...
- Kick Start 2019 Round H. Elevanagram
设共有 $N = \sum_{i=1}^{9} A_i$ 个数字.先把 $N$ 个数字任意分成两组 $A$ 和 $B$,$A$ 中有 $N_A = \floor{N/2}$ 个数字,$B$ 中有 $N ...
- Codeforces Round #172 (Div. 2) C. Rectangle Puzzle 数学题几何
C. Rectangle Puzzle Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/281/p ...
- 8VC Venture Cup 2016 - Final Round (Div. 2 Edition)B. sland Puzzle 水题
B. sland Puzzle 题目连接: http://www.codeforces.com/contest/635/problem/B Description A remote island ch ...
随机推荐
- 【LeetCode刷题】——两数之和.1
---恢复内容开始--- 一直想在leetcode上面刷题,但是java刚刚摸了一下门,所以迟迟没有动手,今天做了第一道题,感觉自己实在菜的不行,但是还是学到了很多东西, 就记录一下遇到的问题. 首先 ...
- MyEclipse10 使用JRebel实现热部署
MyEclipse10 使用JRebel实现热部署 Window --Preferences-Tomcat 6.x-JDK-JVM -noverify -javaagent:D:\JRebel\jre ...
- muduo Library
muduo是由陈硕(http://www.cnblogs.com/Solstice)开发的一个Linux多线程网络库,采用了很多新的Linux特性(例如eventfd.timerfd)和GCC内置函数 ...
- SpringBootSecurity学习(26)前后端分离版之github单点登录
单点登录(SSO) 关于oauth2.0,最后我们再来学习一下单点登录.前面介绍过单点登录的定义,单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一. ...
- boost::thread_specific_ptr
thread_specific_ptr代表了一个全局的变量,而在每个线程中都各自new一个线程本地的对象交给它进行管理. 线程之间就不会因为访问同一全局对象而引起资源竞争导致性能下降. 而线程结束时, ...
- Cocos Creator实现1024游戏,免费提供代码。
效果预览 获取代码 私信或留言. 游戏介绍 ● Github上的代码,不能进行合并操作,修改以后,功能类似2048,空白块赏随机位置,生成2,可以往左.右.上.下滑动,数字会朝着指定方向运动,相 ...
- webpack4+koa2+vue 实现服务器端渲染(详解)
_ 阅读目录 一:什么是服务器端渲染?什么是客户端渲染?他们的优缺点? 二:了解 vue-server-renderer 的作用及基本语法. 三:与服务器集成 四:服务器渲染搭建 4.1 为每个请求创 ...
- e.target与事件委托简例(原生和jQuery的区别)
target定义(英译:目标,目的): target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. 语法: event.target event.target.no ...
- 从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(一)
摘要:随着前端技术的飞速发展,越来越多的技术领域开始被前端工程师踏足.从NodeJs问世至今,各种前端工具脚手架.服务端框架层出不穷,“全栈工程师”对于前端开发者来说,再也不只是说说而已.在NodeJ ...
- java 实现基于opencv全景图合成
因项目需要,自己做了demo,从中学习很多,所以分享出来,希望有这方面需求的少走一些弯路,opencv怎么安装网上教程多多,这里不加详细说明,我安装的opencv-3.3.0 如上图所示,找到相应的j ...