题目链接

http://codeforces.com/contest/1205/problem/C

题解

菜鸡永远做着变巨的梦

然而依然连div1BC题都不会做

要是那天去打cf怕是又要1题滚粗了。。。。

首先第一步显然是对于所有\(i+j\)为偶数的点(下称“偶点”)求出\(a_{i,j}\)的值,对于所有\(i+j\)为奇数的点(下称“奇点”)求出它们之间的相对关系。也就相当于强行令\(a_{1,2}=x\)之后求出所有奇点是\(x\)还是\(x\ \text{xor}\ 1\).

然后我们就是要确定\(x\)的值。

后面题解给了两种做法,在上面的基础上分别只多询问\(1\)次:

做法一

比较暴力的做法。

暴力枚举\(x=0\)和\(x=1\)的情况,因为有解所以这两种情况肯定存在一组询问\((x_1,y_1,x_2,y_2)\)满足此询问在两种情况下答案不同。

于是我们可以暴力DP求出所有询问的答案,然后找到不同的位置询问一次来确定。

(果然是大力出奇迹啊)

做法二

这是我的最初想法,但是最终还是失败了。

对于任何联通的四个格\(c_1,c_2,c_3,c_4\) (注意只需联通即可,不一定非要在一条直线上),如果\(c_1\ \text{xor}\ c_4=c_2\ \text{xor}\ c_3\),那么询问\(c_1\)和\(c_4\)两点可以确定答案。因为如果\(c_1=c_4\)则\(c_2=c_3\)一定存在,否则一定不存在。

注意到题目里的限制\(a_{1,1}=1,a_{n,n}=0\), 可以证明一定存在连续的\(4\)个格使得这四个格上数异或和为\(0\). 证明: 假设不存在,那么考察一条\((1,1)\)到\((n,n)\)的NE Lattice Path, 其长度模\(4\)一定余\(1\), 且上面的数\(4\)个一循环,故有最后一个和第一个相等,矛盾。

于是随便找出一条\((1,1)\)到\((n,n)\)的异或和为\(0\)的四格连续路径,询问一下,做完了。

由于我太智障,思路一直局限在一条直线上的四个格,于是欢乐滚大粗……

代码

做法二

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<vector>
using namespace std; void read(int &x)
{
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
} const int N = 50;
int a[N+3][N+3];
vector<int> pth;
int n,ans; int query(int lx,int ly,int rx,int ry)
{
printf("? %d %d %d %d\n",lx,ly,rx,ry); fflush(stdout);
int ret; scanf("%d",&ret); return ret;
} int main()
{
scanf("%d",&n);
a[1][1] = 1; a[n][n] = 0;
for(int i=1; i<=n; i++)
{
if(i&1)
{
if(i!=1) {a[i][1] = a[i-2][1] ^ query(i-2,1,i,1)^1;}
for(int j=3; j<=n; j+=2)
{
if(i==n&&j==n) continue;
a[i][j] = a[i][j-2] ^ query(i,j-2,i,j)^1;
}
}
else
{
for(int j=2; j<=n; j+=2)
{
a[i][j] = a[i-1][j-1] ^ query(i-1,j-1,i,j)^1;
}
}
}
a[1][2] = 0;
for(int i=4; i<=n; i+=2) {a[1][i] = a[1][i-2] ^ query(1,i-2,1,i)^1;}
for(int i=3; i<=n; i+=2) {a[2][i] = a[1][i-1] ^ query(1,i-1,2,i)^1;}
a[2][1] = a[2][3] ^ query(2,1,2,3)^1;
for(int i=3; i<=n; i++)
{
if(i&1)
{
for(int j=2; j<=n; j+=2) {a[i][j] = a[i-2][j] ^ query(i-2,j,i,j)^1;}
}
else
{
for(int j=1; j<=n; j+=2) {a[i][j] = a[i-2][j] ^ query(i-2,j,i,j)^1;}
}
}
/* printf(":\n");
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) printf("%d",a[i][j]);
puts("");
}
*/ for(int i=1; i<=n; i++) {pth.push_back(a[i][1]);}
for(int i=2; i<=n; i++) {pth.push_back(a[n][i]);}
int lx,rx,ly,ry;
for(int i=3; i<=n+n-2; i++)
{
if((pth[i]^pth[i-1]^pth[i-2]^pth[i-3])==0)
{
lx = i-3<n ? i-3+1 : n;
ly = i-3<n ? 1 : i-3-n+2;
rx = i<n ? i+1 : n;
ry = i<n ? 1 : i-n+2;
break;
}
}
if(query(lx,ly,rx,ry))
{
ans = a[rx][ry]^a[lx][ly];
}
else
{
ans = a[rx][ry]^1^a[lx][ly];
}
puts("!");
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++) printf("%d",((i+j)&1)?(a[i][j]^ans):a[i][j]);
puts("");
}
fflush(stdout);
return 0;
}

Codeforces 1205C Palindromic Paths (交互题、DP)的更多相关文章

  1. @codeforces - 1205C@ Palindromic Paths

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...

  2. Codeforces 1137D - Cooperative Game - [交互题+思维题]

    题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不 ...

  3. Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)

    https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...

  4. Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分

    D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...

  5. Codeforces Round #499 (Div. 2) D. Rocket_交互题_二分

    第一次作交互题,有点不习惯. 由于序列是循环的,我们可以将一半的机会用于判断当前是否是在说谎,另一半的机会用于二分的判断. 对于判断是否实在说谎,用1判断即可.因为不可能有比1还小的数. 本题虽然非常 ...

  6. Codeforces Round #504 E - Down or Right 交互题

    1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1), ...

  7. Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(交互题 异或)

    题目 题意: 0≤a,b<2^30, 最多猜62次. 交互题,题目设定好a,b的值,要你去猜.要你通过输入 c d : 如果 a^c < b^d ,会反馈 -1 : 如果 a^c = b^ ...

  8. Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)

    人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...

  9. E. XOR Guessing 交互题 Educational Codeforces Round 71 (Rated for Div. 2)

    E. XOR Guessing 交互题. 因为这个数最多只有14位 0~13,所以我们可以先处理后面7位,然后再处理后面7位. 因为异或的性质,如果一个数和0异或,那么就等于本身. 所以我们第一次异或 ...

随机推荐

  1. 关于BIOS系统的认识和学习(源自摘录)

    BIOS系统的介绍与学习 BIOS (basic input output system 即基本输入输出系统)在计算机系统中起着非常重要的作用,其是计算机系统最底层的设置, BIOS设置程序是被固化到 ...

  2. Python Socket套接字编程

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  3. ggpubr进行“paper”组图合并,也许比PS,AI更简单

    本文转载自微信公众号 “生信补给站”,https://mp.weixin.qq.com/s/41iKTulTwGcY-dHtqqSnLA 多个图形进行组图展示,可以既展示一个“事情”的多个角度,也可以 ...

  4. django websocket 实现后台日志在web端展示(+前端vue设置)

    核心代码: @accept_websocket def get_log(req): if req.is_websocket(): print('收到websocket请求') with open(se ...

  5. C语言快速判断素数——不超时

    这属于算法上的问题,好好考虑一下算法,还要考虑一下素数的定义. 素数是只有1和本身能整除的整数.所以在求素数的时候,要将素数与1到素数本身中间的所有整数都相除,看是否有整除的数,如果有,那肯定不是素数 ...

  6. sql游标循环

    DECLARE @begindate DATETIME=CONVERT(DATETIME, '2019.05.06 09:40:50') ,@enddate DATETIME =GETDATE() , ...

  7. SQL优化的总结和一些避免全盘扫描的注意事项

    1.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描. 2.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一 ...

  8. JasperReport笔记

    参考: https://blog.csdn.net/dullchap/article/details/51799070 关于 ireport的初步使用 ,笔记记录

  9. Java和操作系统交互(Java 代码是怎么执行)(转)

    结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原 ...

  10. MySQL cmd操作

    1.开启关闭服务 net start mysql net stio mysql 2.登陆 在CMD命令窗口敲入命令 mysql -hlocalhost -uroot -p 后按回车(注意这里的&quo ...