吐槽:数据好像有点水,直接枚举到200可以得80 points。

另:我还是太弱了,比赛的时候只有90 points,#7死卡不过去,最后发现是没有判断 \(z_1\) 和 \(z_2\) 的范围……


Subtask 1:

Method:

直接输出4,完。


Subtask 2:

Method:

直接暴力枚举 \(x\) , \(y\) , \(z\) ,判断是否满足一下关系即可:

\[\forall i\in\left[1,n\right],s.t.\left |a_i-x\right|\bigoplus \left|b_i-y\right| \bigoplus \left|c_i -z\right|=9
\]

时间复杂度:\(O(nM^3)\) ( \(n\leq 5\) ,可以忽略 )

可以通过 \(60\%\) 的数据。

Code

#include<bits/stdc++.h>
#define int long long
#define Maxn 10
using namespace std;
inline 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;
}
int n,M;
int ans=0;
int a[Maxn],b[Maxn],c[Maxn];
void solve1()
{
int flag=1;
for(int x=1;x<=M;x++)
{
for(int y=1;y<=M;y++)
{
for(int z=1;z<=M;z++)
{
for(int i=1;i<=n;i++)
{
if((((abs(a[i]-x))^(abs(b[i]-y)))^(abs(c[i]-z)))!=9)
{
flag=0;
break;
}
}
if(flag==1)
{
ans++;
}else
{
flag=1;
}
}
}
}
printf("%lld\n",ans);
return ;
}
signed main()
{
read(n),read(M);
for(int i=1;i<=n;i++)
{
read(a[i]);
read(b[i]);
read(c[i]);
}
ans=0;
if(M<=200)
{
solve1();
return 0;
}
}

Subtask 3:

**Method **:

考虑优化枚举。若满足一下的性质:

\[A\bigoplus B\bigoplus C=D
\]

则显然可以得到:

\[\begin{equation}
\begin{aligned}
& A\bigoplus B \bigoplus D\\
& =A \bigoplus B \bigoplus \left(A\bigoplus B\bigoplus C\right) \\
& = \left[\left(A \bigoplus B\right) \bigoplus \left(A\bigoplus B\right)\right]\bigoplus C\\
& \because x \bigoplus x=0,0\bigoplus x=x\\
& \therefore A \bigoplus B \bigoplus D =C
\end{aligned}
\end{equation}
\]

故只需要枚举 \(x\) 、\(y\) ,则:

\[\begin{equation}
\begin{aligned}
& \left|c_1-z\right|=\left|a_1-x\right|\bigoplus \left|b_1-y\right| \bigoplus 9
\end{aligned}
\end{equation}
\]

我们设

\[C=\left|a_1-x\right|\bigoplus \left|b_1-y\right| \bigoplus 9
\]

则:

\[z_1=c_1-C,z_2=c_1+C
\]

最后只需要判断一下 \(z_1\) 和 \(z_2\) 是否满足以下性质即可:

\[\forall i\in \left[2,n\right],s.t.\left |a_i-x\right|\bigoplus \left|b_i-y\right| \bigoplus \left|c_i -z_j\right|=9\text{且}z_j \in [1,M]\\
(j\in \{1,2\})
\]

时间复杂度:\(O(nM^2)\) ( \(n\leq 5\) ,可以忽略 )

Code:

#include<bits/stdc++.h>
#define int long long
#define Maxn 10
using namespace std;
inline 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;
}
int n,M;
int ans=0;
int a[Maxn],b[Maxn],c[Maxn];
map<int,int>mp;
void solve1()
{
int flag=1;
for(int x=1;x<=M;x++)
{
for(int y=1;y<=M;y++)
{
for(int z=1;z<=M;z++)
{
for(int i=1;i<=n;i++)
{
if((((abs(a[i]-x))^(abs(b[i]-y)))^(abs(c[i]-z)))!=9)
{
flag=0;
break;
}
}
if(flag==1)
{
ans++;
}else
{
flag=1;
}
}
}
}
printf("%lld\n",ans);
return ;
}
void solve2()
{
int flag1=1,flag2=1;
for(int x=1;x<=M;x++)
{
for(int y=1;y<=M;y++)
{
mp.clear();
int tmp=(((abs(a[1]-x))^(abs(b[1]-y)))^9);
int zkkk=c[1]-tmp;
int zwww=c[1]+tmp;
if(zkkk>=1&&zkkk<=M)
{
for(int i=2;i<=n;i++)
{
if((((abs(a[i]-x))^(abs(b[i]-y)))^(abs(c[i]-zkkk)))!=9)
{
flag1=0;
break;
}
}
if(flag1==1&&mp.find(zkkk)==mp.end())
{
ans++;
mp[zkkk]=1;
}else
{
flag1=1;
}
}else
{
flag1=1;
}
if(zwww>=1&&zwww<=M)
{
for(int i=2;i<=n;i++)
{
if((((abs(a[i]-x))^(abs(b[i]-y)))^(abs(c[i]-zwww)))!=9)
{
flag2=0;
break;
}
}
if(flag2==1&&mp.find(zwww)==mp.end())
{
ans++;
}else
{
flag2=1;
}
}else
{
flag2=1;
}
}
}
printf("%lld\n",ans);
return ;
}
signed main()
{
read(n),read(M);
for(int i=1;i<=n;i++)
{
read(a[i]);
read(b[i]);
read(c[i]);
}
ans=0;
if(M<=200)
{
solve1();
return 0;
}
else
{
solve2();
return 0;
}
}

洛谷 P5614题解的更多相关文章

  1. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  2. 洛谷P5759题解

    本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \ ...

  3. 关于三目运算符与if语句的效率与洛谷P2704题解

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  4. c++并查集配合STL MAP的实现(洛谷P2814题解)

    不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. ...

  5. 洛谷P2607题解

    想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...

  6. 【洛谷】题解 P1056 【排座椅】

    题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...

  7. 洛谷P3572题解

    这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简 ...

  8. [洛谷P1972][题解][SDOI2009]HH的项链

    别碰我! 自己还是太蒟了…… 看了好久,最后抄参考题解打出来的…… 前面的可能影响后面的,所以按照询问右端点排序 这时候维护一个前缀和数组就可以了, 那么问题又来了,去重? 可以这样,从前往后枚举,如 ...

  9. 【洛谷P1119题解】灾后重建——(floyd)

    这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...

随机推荐

  1. (原创)理解主机设备(PLC,PC机)之间的以太网通信

    主机设备:PC机,PLC 网络设备:家用路由器 局域网包括了有线局域网和无线局域网(WIFI).怎么去使用2者? 网络设备的职责最终目的为了帮助2台主机的数据传输.路由器,交换机范围不同,目的相同.在 ...

  2. 使用SqlBulkCopy将DataTable百万级数据瞬间入库

    #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致.// ...

  3. Linux下通过md5sum生成MD5文件&校验MD5

    生成md5值 随便找个文件执行:md5sum file_name  即可生成该文件对应md5值. 也可以一次生成多个文件的md5值:md5sum file_name1 file_name2 file_ ...

  4. MongoDB常用数据库命令第二集

    =======================基础命令======================= mongo 进入数据库操作界面db 查看当前使用的数据库show dbs 查看当前已经被创建出来的 ...

  5. Django:RestFramework之-------版本控制

    6.版本控制 从URL通过get传参获取版本. 6.1自定义版本控制 from rest_framework.views import APIView class ParamVersion(objec ...

  6. MySQL 如何优化大分页查询?

    一 背景 大部分开发和DBA同行都对分页查询非常非常了解,看帖子翻页需要分页查询,搜索商品也需要分页查询.那么问题来了,遇到上千万或者上亿的数据量怎么快速的拉取全量,比如大商家拉取每月千万级别的订单数 ...

  7. Java集合学习(7):ArrayList

    一.概述 ArrayList可以理解为动态数组,就是Array的复杂版本.与Java中的数组相比,它的容量能动态增长.ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包 ...

  8. Golang: 读取文件并统计内容

    上次我们从命令行接收用户输入,并统计了每次输入内容出现的次数,今天对程序加以改造,使其能够读取文件内容,并统计每行文本出现的次数. 首先,我们把接收输入的逻辑封装成一个函数: // scan.go p ...

  9. ARM处理器基础知识

    1.ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 http://blog.chinaunix.net/uid-28458801-id-3494646.html 2.ARM的7种工作模式. ...

  10. 百度云人脸识别API人脸库管理

      from urllib import request import base64 import requests import re import json import urllib impor ...