牛客练习赛37B 筱玛的排列(字典树 + dfs)

2020牛客多校Graph(boruvka)(Trie字典树) Statement Solution 可以发现任意两个点之间连边的权值都是固定的。由于图始终联通,所以两点间始终存在至少一条 路径,如果存在多条,根据环的异或和为0,两点间的路径的异或和应该相等,且始终是固定的。 所以可以给每个点一个权值,那么两点间的连边权值就应该是两端点权的异或。 接下来的问题就是01字典树。 Code #include <bits/stdc++.h> #define ll long long const int N=1e5+10,M=6e6+10; using nam 阅读详情

题目链接
题解:
由于 n n n 最大有 20,那所有从 1 到 n 的情况有 C 2 n n C_{2n}^n C2nn​ 种情况,肯定不能暴力搜索,那么我们可以把图分成两个部分来搜索,分别从 ( 1 , 1 ) (1,1) (1,1) , ( n , n ) (n,n) (n,n) 开始走 n n n 步到对角线上,然后用字典树求最大异或和就行啦。
代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define P pair<int, int>
#define debug(x) cout << (#x) << ": " << (x) << " "
#define fastio ios::sync_with_stdio(false), cin.tie(0)
const int mod = 1e9 + 7;
const int M = 6000000 + 10;
const int N = 20 + 10;

int n, e, a[N][N];
int tree[M][2], cnt;
vector<int> v11[N], vnn[N];

void add(int x)
{
    int now = 1;
    for(int i = 31; i >= 0; -- i) {
        int &son = tree[now][(x >> i) & 1];
        if(!son) son = ++cnt;
        now = son;
    }
}

int query(int x)
{
    int now = 1, ans = 0;
    for(int i = 31; i >= 0; -- i) {
        int &son = tree[now][!((x >> i) & 1)];
        if(son) ans += (1 << i), now = son;
        else now = tree[now][(x >> i) & 1];
    }
    return ans;
}

void dfs11(int x, int y, int sum, int num)
{
    if(num == n) {
        v11[x].push_back(sum ^ a[x][y]);
        return ;
    }
    if(x + 1 <= n) dfs11(x + 1, y, sum ^ a[x + 1][y], num + 1);
    if(y + 1 <= n) dfs11(x, y + 1, sum ^ a[x][y + 1], num + 1);
}

void dfsnn(int x, int y, int sum, int num)
{
    if(num == n) {
        vnn[x].push_back(e ^ sum);
        return ;
    }
    if(x - 1 >= 1) dfsnn(x - 1, y, sum ^ a[x - 1][y], num + 1);
    if(y - 1 >= 1) dfsnn(x, y - 1, sum ^ a[x][y - 1], num + 1);
}

signed main()
{
    scanf("%d %d", &n, &e);
    for(int i = 1; i <= n; ++ i) {
        for(int j = 1; j <= n; ++ j) {
            scanf("%d", &a[i][j]);
        }
    }

    dfs11(1, 1, a[1][1], 1);
    dfsnn(n, n, a[n][n], 1);

    int ans = 0;
    for(int i = 1; i <= n; ++ i) {
        memset(tree, 0, sizeof tree);
        cnt = 1;
        for(int j = 0; j < v11[i].size(); ++ j) {
            add(v11[i][j]);
        }
        for(int j = 0; j < vnn[i].size(); ++ j) {
            ans = max(ans, query(vnn[i][j]));
        }
    }

    printf("%d\n", ans);

    return 0;
}

/*

  Rejoicing in hope, patient in tribulation .

*/

从SPICE到电磁场:非线性器件在CST场路协同仿真中的建模艺术 本文深入探讨了非线性器件在CST场路协同仿真中的建模技术,重点分析了SPICE模型与电磁场仿真的集成方法。通过对比线电流模型和面电流模型的优缺点,结合实际案例展示了二极管阵列在电磁散射调控中的应用,为工程师提供了优化仿真精度与效率的实用技巧。 阅读详情

相关推荐

【前端HTML生成条形码——MQ】

本文将展示前端HTML如何根据用户输入内容生成对应的条形码,附HTML和JS代码。代码如下(示例):

weixin_42588676的博客 1955

牛客 单词查找树 题解(字典树 Tire)

①注意单词的输入方式 ②注意题中给的都是大写字母 #include<iostream> using namespace std; const int N = 1e4 + 10; int son[N][26], idx; char str[N]; void insert(char str[]){ int p = 0; for(int i = 0; str[i]; i ++ ){ int u = str[i] - 'A'; if(!son[p][u]) son[p][u] = +

qiaodxs的博客 201

保姆级教程:在树莓派4B上用V4L2驱动USB摄像头(附完整代码)

本文提供树莓派4B上使用V4L2驱动USB摄像头的完整教程,涵盖环境配置、V4L2架构解析、代码实现及问题排查。通过详细步骤和完整代码示例,帮助开发者快速掌握嵌入式Linux下的摄像头驱动开发,解决实际应用中的兼容性和性能问题。

weixin_30312563的博客 382

筱玛的排列

链接:https://ac.nowcoder.com/acm/contest/342/B 来源:牛客网   题目描述 筱玛是一个快乐的男孩子。 筱玛在一次数学考试中看到了这样一道题: 求有多少个长度为 n 的不同的排列 A,满足对于任意的 i 均有 A[A[i]] + i = n + 1。 聪明的筱玛当然一眼就秒掉了这道题,现在他想来考考你。   输入描述: 一行一个整数 n...

20164225的博客 352

当预编译包失效时:手把手教你在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu

本文详细指导在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu的全流程,解决预编译包兼容性问题。涵盖环境准备、工具链配置、源码编译、常见问题解决及性能优化技巧,帮助开发者在边缘计算设备上实现高效AI模型推理。

weixin_29062823的博客 135

AMD 3D V-Cache技术解析:CPU缓存堆叠如何突破性能瓶颈

在半导体领域,缓存(Cache)是提升处理器性能的关键技术,其核心原理是在高速CPU核心与慢速主存之间建立数据中转站,以缓解“内存墙”问题。随着摩尔定律放缓,传统平面扩展缓存面临面积成本高、延迟增加等挑战。3D封装技术应运而生,通过垂直堆叠实现极致的互联密度与带宽,成为突破性能瓶颈的重要工程路径。这项技术的价值在于能以更优的功耗和延迟,显著提升缓存容量,从而改善游戏、科学计算等数据密集型应用的性能。以AMD 3D V-Cache为代表的Hybrid Bonding(混合键合)工艺,正是这一趋势的典型实践,它

weixin_30432579的博客 418

【牛客练习赛11】 B 假的字符串【字典树+topo判环】

链接:https://www.nowcoder.com/acm/contest/59/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们

lzs_lazy 852

22版本Altium Designer导出生产文件的规范化操作指南

本文详细介绍了PCB设计中的Gerber文件导出流程及相关文件生成方法。主要内容包括:1)Gerber文件导出的5个关键设置步骤;2)NC钻孔文件的导出方法;3)坐标文件的生成方式;4)文件打包规范要求必须包含Gerber文件、NC钻孔文件和坐标文件;5)文件提交的两种方式(新手推荐提交原始工程文件,量产推荐仅提交Gerber文件包)。文章还特别强调了单位一致性、精度验证等注意事项,为PCB设计文件的规范输出提供了完整指导。

qq_56506325的博客 1060

牛客练习赛53,C(字典树+暴力)

想到了字典树求解,但是TLE了,后来分析发现当询问的字符串中"_"的个数一多的话,我这个算法很容易就超时。不过因为我觉得这个算法其实还是可以的,而且以前也有过这种情况,所以就分类讨论,当询问的字符串中的“1”或“0”的个数超过20个时,我就用字典树求解,否则我就暴力求解。结果是200MS过题。 #include<cstdio> #include<iostream> #inc...

shamansi99的博客 185

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

瑞芯微RK3576开发实战:固件烧录与内核启动的典型问题解析

本文详细解析了瑞芯微RK3576开发板在固件烧录与内核启动过程中遇到的典型问题及解决方案。从开发工具版本检查、DDR配置调整到内核启动异常的设备树适配和电源管理问题,提供了系统性的调试方法和实用技巧,帮助开发者高效解决RK3576开发中的常见挑战。

weixin_33700350的博客 455

牛客多校5 - Graph(字典树+分治求最小生成树)

题目链接:点击查看 题目大意:给出一棵树,每条边都有一个权值,每次操作可以删除任意一条边或者增加任意权值的一条边,现在可以执行数次操作,不过任何时间都要满足以下两个条件: n 个点互相连通 所有环的权值异或和为 0 求数次操作后图上边权之和的最小值 题目分析:将题意转换一下就可以转换为经典问题:完全图上的最小生成树,给出 n 个点,每个点都有权值 a[ i ] ,每条边的权值为 a[ i ] ^ a[ j ] 现在需要求最小生成树 这个题目只需要 dfs 跑一遍就可以转换为上述问题了,这里不多赘述

Falcon的博客 1408

Debian下Rust环境极速安装指南:国内镜像+避坑配置(附清华/中科大源对比)

本文详细介绍了在Debian系统上快速安装和配置Rust开发环境的完整指南。针对国内网络环境,重点对比评测了清华大学、中国科学技术大学等主流镜像源,提供了详细的安装配置步骤、Cargo优化技巧以及常见问题排查方案,帮助开发者显著提升依赖下载和编译效率。

s8t9u0v1w的博客 1162

程序员代码面试指南刷题--第五章.字典树的实现

题目描述 字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构。假设组成所有单词的字符仅是‘a’~‘z’,请实现字典树的结构,并包含以下四个主要的功能。void insert(String word):添加word,可重复添加;void delete(String word):删除word,如果word添加过多次,仅删除一次;boolean search(String word):查询word是否在字典树中出现过(完整的出现过,前缀式不算);int prefixNumber(String pre):

我不是什么好人 483

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

线段树yy (线段树维护等比数列的和)

没有题目链接 一个长度为 n 的序列,Q 次操作: 对于区间 l 到 r 的所有位置 i,a[i]+=bi−la[i]+=b^{i - l}a[i]+=bi−l 求区间 l 到 r 的和 mod 1e9 + 7 对于所有操作,b 不变。(1 <= n, Q <= 1e5, 1 < b <= 1e9) 题解: 由于每次加的是一个等比数列,那么可以将等比数列的首项作为下传标...

ttoobne 1015

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

线段树yy(线段树维护括号序列+LCA)

没有题目链接 一颗有 n 个节点的树,q 组询问,支持两种操作:1.单点修改 2.路径求和。(1 <= n, Q <= 1e5) 题解: 用 dfs 建出树的括号序列(好像也叫欧拉序),用基本的线段树维护这个括号序列,每个点在括号序列中为左括号时在线段树中加上该点权值,为右括号的位置减去该点权值,那么在一条路径中从起始点左括号到终点左括号一定包含路径中的每个点,并且不包含不再路径...

ttoobne 629

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

南昌网络赛 Max answer(单调栈 + 线段树维护前缀和最大最小值)

题目链接 题意: 给一串序列,要求选任意连续的一段区间,使得这一段区间中最小值乘以区间总和尽量大。 题解: 首先先单调栈求出每个数字作为最小值所在的区间。 如果数据范围只有正数那么只用单调栈就可以解决,但是数据有负数,那么怎么高效查询使得总乘积最大的区间呢? 那么这时候我们可以用线段树维护前缀和的最大最小值,要使得负数乘以一个数尽量大,那么这个数就得尽量小。 前缀和能够 O(1) 的...

ttoobne 617

带权并查集

以前写过带权并查集的题目,自己琢磨半天判断了很多情况,最后终于能过题了,但是写法之麻烦实在是没法保证再写一次也不会出错。看网上的博客才发现能够有简单许多的方法来搞定带权并查集。 首先就是获取祖先的函数,这个函数中与普通的并查集唯一的不同之处就是更新 dis 数组的部分,dis 中存的为该点到其祖先的距离。 int get_root(int x) { if(father[x] == x...

ttoobne 586

HDU6703 CCPC-网络赛 1002 array (主席树 + set)/(权值线段树)

题目链接 题解: 由于序列所有元素都是唯一的,在 1 ~ n 的范围内。可以用主席树维护权值,查询在树中 ala_lal​ 到 ara_rar​ 区间大于等于 k 的最小的数,但是还有操作 1。 操作 1 可以视为为操作 2 提供答案(因为加了一个很大的值,查询保证 k≤nk\leq nk≤n,那加了之后的值就查不到了),这样的话进行操作 1 ,就将 aposa_{pos}apos​ 插入 set...

ttoobne 531

poj 3667 (线段树区间合并)

题意: 一家旅馆共有N个房间,这N个房间是连成一排的,标号为1-N。 现在有很多旅客以组为单位前来入住,每组旅客的数量可以用DiDi来表示。 旅店的业务分为两种,入住和退房: 1、旅客入住时,第i组旅客需要根据他们的人数DiDi,给他们安排DiDi个连续的房间,并且房间号要尽可能的小。如果房间不够,则无法安排。 2、旅客退房时,第i组旅客的账单将包含两个参数XiXi和DiDi,你需要将房...

ttoobne 509

CodeForces - 840D Destiny (主席树)

题目链接 题解: 由于每次查询的符合条件的数字不会达到k 个(k <= 5),所以大胆用主席树暴力往下左右子树都查符合条件的解即可。每次查询时间复杂度O(k*logn)。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long...

ttoobne 489

POJ 1417(带权并查集 + dp 记录路径)

题意: 一个岛上存在着两种居民,一种是天神,一种是恶魔。 天神永远都不会说假话,而恶魔永远都不会说真话。 岛上的每一个成员都有一个整数编号(类似于身份证号,用以区分每个成员)。 现在你拥有n次提问的机会,但是问题的内容只能是向其中一个居民询问另一个居民是否是天神,请你根据收集的回答判断各个居民的身份。 题解: 不难发现,如果输入 a b yes 则表示 a 与 b 在同一个种族, a ...

ttoobne 427

杭电多校第六场 E Snowy Smile (线段树维护二维最大子段和)

题目链接 题解: 枚举上下边界,用线段树维护区间最大子段和。 具体的,首先枚举下界,固定下界的情况下,上界的枚举与计算答案并更新可以 O(n) 完成。 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define...

ttoobne 412

校赛题解

A.CQW又迟到了 水题。 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define int ll #define INF 0x3f3f3f3f3f3f3f3f #define fastio ios::sync_with_stdio(false), cin.tie(0) cons...

ttoobne 404

ZOJ - 3261 Connections in Galaxy War (逆向并查集 离线操作)

题目链接 题意: 有n个星球(编号 0 ~ n ),每个星球都有自己的power值,有m条线连接着星球,接下来有q个操作要求如下: "destroy a b" 破坏a与b之间的连接。 "query a" 询问与a星球直接或间接连接的星球中power值最大的星球的编号,如果power值相同,则输出最小的编号。 题解: 思路:这题看到直接或间接连接就想到并查集,但是并查集没办法维...

ttoobne 395

CodeForces - 652D Nested Segments (树状数组 + 离散化)

题目链接 题意: 给 n 个区间,求每个区间包含多少子区间。 题解: 将每个区间的 r 存进树状数组里,然后对每个区间的 l从大到小进行排序,每次查询时查的一定是比自己 l 大的,并且比自己 r 小的,即自己的子区间。由于数字比较大,需要离散化处理。 代码: #include<cstdio> #include<iostream> #include<al...

ttoobne 394
上一篇: 2019南京网络赛 D. Robots(概率DP与拓扑排序)
下一篇: Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection (DP)
ttoobne
博客等级 码龄9年 13粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值