助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数。两个人轮流给格子染色,直到所有格子都染了色。在所有格子染色完后,计算双方的分数。对于任意两个相邻(即有公共边)的格子,如果它们都被同一个人染色,那么这个人将得到这两个格子中的数的异或的分数。所有的分数加和计算。

现在,Christina用这个游戏来挑战你,想让你一败涂地,因此她总是采用最优策略使得她的分数尽可能地比你多。为了不输得太惨,你需要知道自己最多比助手多多少分数,或最少比助手少多少分数——也就是你的得分减去助手的得分最大是多少。(先后手由输入给定)

输入

第一行一个正整数T,表示数据组数。

对于每组数据,输入第一行为三个整数n,m,f。其中f为0或1,当f=0,你是先手,当f=1,你是后手。

接着输入n行,每行m个非负整数,表示格子里的数。

输入保证2<=n,m<=400。格子里的数均为不超过int范围的非负整数。

此题有多组数据,数据组数T<=10。

输出

对于每一组数据,输出一行一个整数:你的得分减去助手的得分的最大值。

SOURCE:codeforces

输出时每行末尾的多余空格,不影响答案正确性

样例输入

1
3 3 0
1 2 3
4 5 6
7 8 9

样例输出

11

题目来源

ACM训练联盟周赛

分析:这题目的关键是怎么选择下一步。

题目求分数的过程中,如果有相邻的分数则两分数需异或,所以每个点的分数并不是最后可以用来算总分的分数。

他们的实际分数应该是这个点的分数和相邻所有点分数的异或和

然后我们根据所有的异或和相隔着一人取一个分数就可以得到每个人所能得到的最大分数

因为实际运算的结果中并不能取到结果点的所有相邻点,只能取到一半,所以在计算结果时还要再除以二

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 4*1e2 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
ll mapn[maxn][maxn], a[maxn*maxn];
ll dx[] = { 1, -1, 0, 0 }, dy[] = { 0, 0, 1, -1 };
bool cmp( ll x, ll y ) {
return x > y;
}
int main() {
ll t;
cin >> t;
while( t -- ) {
ll n, m, f;
memset( a, 0, sizeof(a) );
cin >> n >> m >> f;
for( ll i = 0; i < n; i ++ ) {
for( ll j = 0; j < m; j ++ ) {
cin >> mapn[i][j];
}
}
ll cnt = 0;
for( ll i = 0; i < n; i ++ ) {
for( ll j = 0; j < m; j ++ ) {
a[cnt] = 0;
for( ll k = 0; k < 4; k ++ ) {
ll x = i + dx[k];
ll y = j + dy[k];
if( x >= 0 && x < n && y >= 0 && y < m ) {
a[cnt] += (mapn[i][j]^mapn[x][y]);
}
}
cnt ++;
//cout << a[cnt-1] << " ";
}
//cout << endl;
}
sort( a, a + cnt, cmp );
ll sum1 = 0, sum2 = 0;
for( ll i = 0; i < cnt; i ++ ) {
if( i&1 ) {
sum2 += a[i];
} else {
sum1 += a[i];
}
}
//因为要取到相邻的所有点的时候才能得到结果,然而在我们实际的运算
//结果中只取到了这些结果点的一半相邻点,所以要除以二
if( !f ) {
cout << ( sum1 - sum2 ) / 2 << endl;
} else {
cout << ( sum2 - sum1 ) / 2 << endl;
}
}
return 0;
}

  

计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维的更多相关文章

  1. 计蒜客 ACM训练联盟周赛 第一场 从零开始的神棍之路 暴力dfs

    题目描述 ggwdwsbs最近被Zeratul和Kyurem拉入了日本麻将的坑.现在,ggwdwsbs有13张牌,Kyurem又打了一张,加起来有14张牌.ggwdwsbs想拜托你帮他判断一下,这14 ...

  2. 计蒜客 ACM训练联盟周赛 第一场 Alice和Bob的Nim游戏 矩阵快速幂

    题目描述 众所周知,Alice和Bob非常喜欢博弈,而且Alice永远是先手,Bob永远是后手. Alice和Bob面前有3堆石子,Alice和Bob每次轮流拿某堆石子中的若干个石子(不可以是0个), ...

  3. ACM训练联盟周赛(第一场)

    B:Zeratul与Xor 题目描述 Xor(按位异或),对应C++中的“^”运算符. Zeratul给出了一个数列A[n](n≤105),要做q(q≤105)组动作,这些动作包括: 1  a:数列中 ...

  4. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

  5. 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)

    M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...

  6. 计蒜客 ACM竞赛高校联盟训练赛 第8场 煎牛排

    水一水. https://nanti.jisuanke.com/t/24205 煎牛排 题目描述 又是一个难得的周六,是时候远离食堂和外卖出去大吃一顿了.圈内知名吃货AA正想着中午去吃汉堡炸鸡烤肉火锅 ...

  7. 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)

    I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...

  8. ACM训练联盟周赛 A. Teemo's bad day

    65536K   Today is a bad day. Teemo is scolded badly by his teacher because he didn't do his homework ...

  9. ACM训练联盟周赛 K. Teemo's reunited

    Teemo likes to drink raspberry juice.  He even spent some of his spare time tomake the raspberry jui ...

随机推荐

  1. 初次见面C#排坑记录

    排一次开发C#遇到的坑,同时说一下自己对C#中文件夹构建方式的体会. 一个开发Java的人留下了痛苦的泪水,变量命名规则不一样,连括号打的都不一样,

  2. WebGL简易教程(一):第一个简单示例

    目录 1. 概述 2. 示例:绘制一个点 1) HelloPoint1.html 2) HelloPoint1.js (1) 准备工作 (2) 着色器 (3) 顶点着色器 (4) 片元着色器 (5) ...

  3. Dubbo源码学习之-服务导出

    前言 忙的时候,会埋怨学习的时间太少,缺少个人的空间,于是会争分夺秒的工作.学习.而一旦繁忙的时候过去,有时间了之后,整个人又会不自觉的陷入一种懒散的状态中,时间也显得不那么重要了,随便就可以浪费掉几 ...

  4. 插入Oracle数据库后返回当前主键id

    最近做一个spring版本3.0.4的老项目功能,应用场景要用到插入oracle表后返回主键ID拿来和其他表关联. 用oralce的可以一直用这种处理方式,高兼容低,搜索网上的资料都不能和这个Spri ...

  5. springmvc原理详解(手写springmvc)

    最近在复习框架 在快看小说网搜了写资料 和原理 今天总结一下 希望能加深点映像  不足之处请大家指出 我就不画流程图了 直接通过代码来了解springmvc的运行机制和原理 回想用springmvc用 ...

  6. 算法之《图》Java实现

    数据结构之图 定义(百度百科) 图的术语表 无向图 深度优先搜索 广度优先遍历 有向图 路径问题 调度问题 强连通性 最小生成树(无向图) 最小生成树的贪心算法 加权无向图的数据结构 Kruskal算 ...

  7. Android Pie 私人 DNS 使用教程

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. ​「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章 ...

  8. Javasrcipt中从一个url或者从一个字符串中获取参数值得方法

    从url中获取参数值是che程序开发过程中的常用需求,偶然得闲,便抽空研究了一下javasrcipt下,获取参数的办法(JAVA中也类似). 首先看url的规范: URL组成:protocol :// ...

  9. 5G标准公布,你很快又要换手机了

    通常,在4G网络环境下,下载一部1G的电影只需要30秒时间,对于经历过2G和3G网络的我们来说已经非常快了. 但是听说,5G环境中下载一部同样的电影,根本不是用秒来计算的,甚至有外媒说,5G的速率会是 ...

  10. SQL TRUNCATE TABLE 命令

    SQL TRUNCATE TABLE 命令 SQL TRUNCATE TABLE 命令用于删除现有数据表中的所有数据. 你也可以使用 DROP TABLE 命令来删除整个数据表,不过 DROP TAB ...