首页 > 其他分享 >线性基学习DAY2

线性基学习DAY2

时间:2024-09-26 22:23:41浏览次数:9  
标签:return int DAY2 len 学习 异或 base 线性

今天是第二题学习线性基,让我对线性基的认识更多了,线性基其实就是去处理整个区间异或最值问题的

我们来看一下昨天的一道题

P4570 [BJWC2011] 元素

昨天其实这题我尝试了两次,一种是普通消元去求解,另一种是高斯消元去求解,但是发现高斯消元的方法只有30分,哪里有问题呢?

原来是因为可能会将排好序的元素换到下方,导致出现结果有问题,因此我们用高斯消元去求解的时候,每次交换后,要将有效区间以下的元素再排一次序,然后进行高斯消元就可以完美ak了

#include<bits/stdc++.h>
using namespace std;
#define int long long 
int n;
int len=1;
int bit=60;
struct node{
	int x;//该矿石的编号 
	int y; 
}a[1005];

bool cmp(node a,node b)
{
	return a.y>b.y;
}

void solve()
{
	len=1;
	for(int i=bit;i>=0;i--)
	{
		for(int j=len;j<=n;j++)
		{
			if((a[j].x>>i)&1LL)
			{
				swap(a[len],a[j]);
				sort(a+len+1,a+n+1,cmp);
				break;
			}
		}
		if((a[len].x>>i)&1)
		{
			for(int j=1;j<=n;j++)
			{
				if(j==len)
				continue;
				if((a[j].x>>i)&1LL)
				{
					a[j].x^=a[len].x;
				}
			}
			len++;
		}
	}
}

signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
	}
	sort(a+1,a+1+n,cmp);
	solve();
	int sum = 0;
    for (int i = 1; i <= len-1; i++) 
	{
        sum+=a[i].y;
    }
    cout << sum;
	return 0;
}

今日份例题

P4301 [CQOI2013] 新Nim游戏

题意:就是说在正常的nim博弈前面加上一组特殊的操作,我们可以拿多堆石子一次性拿一堆,然后问让自己能赢最少拿的火柴数,那么我们就应该有这种思维,什么情况下我们才能获胜呢?也就是说,无论让后手拿到几堆石子,都无法形成异或为0的形式 ,那么我们就可以用线性基的性质,如果要异或为0,那么就是说明插入的时候出现了0,这样会插入不进去,因此会与线性基里面的内容异或为0,因此我们只需要判断有几堆插不进去即可,将插不进去的元素累加在一起就是最终的答案

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[105];
int d[32];
bool cmp(int a,int b)
{
	return a>b;
}

bool solve(int x)
{
	for(int i=32;i>=0;i--)
	{
		if((x>>i)&1LL)
		{
			if(!d[i])
			{
				d[i]=x;
				return true;
			}
			else
			{
				x^=d[i];
			}
		}
	}
	return false;
}

signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+1+n,cmp);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(!solve(a[i]))
		{
			ans+=a[i];
		}
	}
	cout<<ans;
	return 0;
}

P4151 [WC2011] 最大XOR和路径

这题我也是没解出来,看了评论区的大犇才知道该怎么去写出来这个题。

我们可以将整个无向图拆分为一个主链a和一些小环b,我们的的异或最大值,如果只是一个线性的,我们就每次去判断是否比以前更大就行了,我们该如何去处理这个环呢?

 我们发现,如果要走一个环的话,当前的点和下一个点之间的路径就白走了,也就是贡献就是0,因此,我们只需要每次将环加入到线性基当中,然后去求取最大值即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int u,v,w;
struct node{
	int to;
	int w;
};
vector<node> e[500005];
int ans[500005];//表示从起点到i这个点所用的最大异或值
int vis[500005];
int base[70];

void solve(int x)
{
	for(int i=63;i>=0;i--)
	{
		if((x>>i)&1)
		{
			if(!base[i])
			{
				base[i]=x;
				return ;
			}
			x^=base[i];
		}
	}
	return ;
}

void dfs(int v,int sum)
{
	ans[v]=sum;
	vis[v]=1;
	for(auto u:e[v])
	{
		if(vis[u.to]==0)
		{
			dfs(u.to,sum^u.w);
		}
		else
		{
			solve(sum^u.w^ans[u.to]);
		}
	}
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v>>w;
		e[u].push_back((node){v,w});
		e[v].push_back((node){u,w});
	}
	dfs(1,0);
	int z=ans[n];
	for(int i=63;i>=0;i--)
	{
		if((z^base[i])>z)
		{
			z=z^base[i];
		}
	}
	cout<<z<<'\n';
	return 0;
}

总结:线性基就是为了去求解区间中的异或最值问题

希望各位在长大之前能找到属于自己的宝物,并且能够好好珍惜,我也早就已经找到那一份宝物了

标签:return,int,DAY2,len,学习,异或,base,线性
From: https://blog.csdn.net/2301_80475191/article/details/142578540

相关文章

  • springboot+vue青年大学习数据分析系统的设计与实现5ek29
    目录功能和技术介绍系统实现截图开发核心技术介绍:使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取功能和技术介绍本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。对项目进行分阶段,分模块的开发,对项目进行黑盒......
  • 通过构建具有依赖关系的后端框架来学习 Nodejs
    我在github上为每个尝试涉足后端开发世界(不仅仅是Node.js)的人创建了一本开源(免费)书籍您还可以在本书的网站上以更易于理解的方式访问内容-CacheLane-LearnNode.jstheHardWay这将需要很长时间来构建完成版本(几个月),但不用担心,我已经承诺并承诺每天都会添加新内容。因此,即......
  • ETL: 学习搭配PENTAHO-SERVER-CE-9.4.0.0-343 + MYSQL8.0.35 部分错误日志
     学习搭配PENTAHO-SERVER-CE-9.4.0.0-343+ MYSQL8.0.35 ,启动PENTAHO 后,日志显示:UsingCATALINA_BASE:"E:\Programs\pentaho-server\tomcat"UsingCATALINA_HOME:"E:\Programs\pentaho-server\tomcat"UsingCATALINA_TMPDIR:"E:\Programs......
  • D18【python接口自动化学习】-python基础之内置数据类型
    day18综合练习:实现手机通讯录(下)学习日期:20240925学习目标:内置数据类型--27小试牛刀:如何使用类型转换实现手机通讯录(下)学习笔记:实现手机通讯录案例文件withopen('27-demo.csv')asf:file_data=f.readlines()print(file_data)#[',张三,同事,13511112222\n......
  • 编写您的第一个 Web 组件(学习 Modulojs - 第 f 部分
    ?欢迎所有新订阅者和返回的组件编码者!我即将开始一个新的10部分教程系列。虽然我的其他教程使用modulo.js构建特定的、有趣的小应用程序,例如口袋妖怪舞会、复古挤压文本编辑器或视频游戏画廊,但本教程系列将建立在基本原则上,从第一部分开始:什么是web组件吗?html和css......
  • 学习day1
    什么是并发,同时做多件事情。高并发是,需要做的事情数量超过了承载限度。为了解决高并发问题,所以要用多线程。 线程的生命周期线程的创建可以实现runnable接口,继承Thread类,实现Callable/Future,线程的状态有new,runnable,blocked,waitting,timed_waitting,terminated. 打开终端命......
  • 虚树 学习笔记
    虚树VirtualTree学习笔记引入P2495[SDOI2011]消耗战题目大意:给一棵\(n\)个点的树,\(m\)次询问\(k\)个点,要求切断一些边使点1不可达这些点,求最小切断的边权和。\(n\le2.5*10^5,m\le5*10^5,\sumk\le5*10^5\)先考虑一个朴素的DP,每次询问扫一遍整个树。设\(f_......
  • 2-SAT 学习笔记
    2-SAT学习笔记本文同载于本人的洛谷文章。参考资料算法2-SAT用于解决什么样的问题?问题给定\(n\)个大小为2的集合,每个集合要选其中一个元素,不能同时选,有\(m\)个条件\((a,b)\)代表元素\(a,b\)不能同时选,构造方案或判定无解。例子有3个集合:\(\{a,\nega\},\{b,......
  • Python从0到100(五十八):机器学习-随机森林及对复杂数据集分类
    随机森林通过构建多个决策树来完成分类或回归任务。随机森林的核⼼思想是通过多个弱学习器(决策树)的集成来构建⼀个强学习器,从⽽提⾼模型的泛化能⼒和稳定性。1.基本原理随机森林的基本原理如下:从训练集中随机抽取⼀定数量的样本(有放回抽样),构建⼀个决策树(称为⾃助采样法或......
  • 卷积神经网络-迁移学习
    文章目录一、迁移学习1.定义与性质2.步骤二、BatchNormalization(批次归一化)三、ResNet网络1.核心思想2.残差结构(1)残差块(2)残差结构类型四、总结一、迁移学习迁移学习(TransferLearning)是一种强大的机器学习方法,其核心思想是将在一个任务(源任务)上学到的知识或模型......