首页 > 其他分享 >一些题目

一些题目

时间:2024-10-29 09:32:25浏览次数:4  
标签:le 题目 int times trie 一些 now id

一些最近刷到的好题,还有一些没见过的处理方式。

原题:Function Query

定义 \(f(x)=(x\oplus a)-b\),其中 \(a,b\) 是给定的参数。

给定 \(n\) 个变量,\(x_1,x_2,x_3,\dots,x_n\),给出 \(q\) 组询问,对于每组询问,给定 \(a,b\),请你输出一个 \(i\),满足 \(i\in [1,n)\),且有 \(f(x_i)\times f(x_{i+1})\le 0\),如果无解则输出 \(-1\),如果有多组解输出任意一个即可。


很好的题目,根本不知道要用什么算法。思考过 Trie 树,但是感觉没有什么用。

看了题解,这东西竟然能二分????

有个很重要的结论:

如果 \(\max f(x)\times \min f(x)\le0\),那么肯定有解。

看上去非常不对,不是要相邻才行吗?

实际上无解的情况当且仅当所有 \(f(x)\) 同号,上面那个式子成立了就说明有正有负或者有零。

然后就可以对这个东西二分了。

找到 \(\max f(x)\) 和 \(\min f(x)\) 的位置,这个东西可以用 Trie 树搞。

不妨把它们的位置设为 \([l,r]\),那么 \([l,r]\) 长度为 \(2\) 的时候 \(l\) 就是答案了。

考虑不断去缩小这个区间。取 \(mid=\lfloor\frac{l+r}{2}\rfloor\),\(f(x_l)\times f(x_{mid})\le 0\) 和 \(f(x_{mid})\times f(x_r)\le 0\) 一定至少有一个成立,哪个成立往哪边缩小就好了。

代码的实现并不困难,时间复杂度 \(\mathcal O(q(\log V+\log n))\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+10;
int n,q,tot;
int trie[N][2],id[N],a[N];
void add(int x,int y)
{
	int now=0;
	for(int i=30;i>=0;i--)
	{
		int c=(x>>i)&1;
		if(!trie[now][c])trie[now][c]=++tot;
		now=trie[now][c];
	}
	id[now]=y;
}
int find(int x,int op)
{
	int now=0;
	for(int i=30;i>=0;i--)
	{
		int c=(x>>i)&1^op;
		if(trie[now][c])now=trie[now][c];
		else now=trie[now][!c];
	}
	return id[now];
}
bool check(int x,int y,int l,int r)
{
	return ((a[l]^x)-y)*((a[r]^x)-y)<=0;
}
signed main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		add(a[i],i);
	}
	while(q--)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		int l=find(x,0),r=find(x,1);
		if(l>r)swap(l,r);
		if(!check(x,y,l,r))
		{
			puts("-1");
			continue;
		}
		while(l+1<r)
		{
			int mid=(l+r)/2;
			if(!check(x,y,l,mid))l=mid;
			else r=mid;
		}
		cout<<r-1<<endl;
	}
	return 0;
}

标签:le,题目,int,times,trie,一些,now,id
From: https://www.cnblogs.com/XuFromGD-FS/p/18512193

相关文章

  • 操作系统一些常见疑问总结
    操作系统的定义和特性:定义:操作系统是核心系统软件,负责计算机系统软件硬件资源的分配和使用;控制和协调并发活动;提供用户接口,使用户获得良好的工作环境;特性:并发共享不确定性什么是多道程序设计技术?试述多道程序运行的特征。多道程序设计技术是指同时把多个作业(程序)放入内存......
  • RNC 中选择传感器算法的一些思路
    通过寻优算法,来自动计算最佳的传感器位置。这里用遗传算法示例:重点有两个,一个是约束,另一个是适应度函数输入设定输入x是一个0,1向量,0代表没有选取此处的通道,1代表选用了此处的通道注意x应该是整数,所以在函数中需要设置IntCon的数值,代表此处的索引需要是int类型%指......
  • 我有三台ubuntu服务器,手把手教我从0搭建HBase,然后往里存一些数据。
    好的,我们可以一步步来搭建一个基本的HBase集群,并在里面存储一些数据。这里的步骤包括在三台Ubuntu服务器上配置HBase所需的依赖、安装HBase、配置和启动集群、测试存储和查询数据。假设这三台服务器的IP地址分别为192.168.1.101、192.168.1.102和192.168.1.103,其中第......
  • PTA题目集1-3总结(22207331-张博文)
    总体情况预览:第一次:第二次:第三次:(1)前言:前三次作业题量适中,但是难度较大!题目集作业主要考察了以下知识点:一、基础语法1. 变量与数据类型:包括整型(int、long等)、浮点型(float、double)、字符型(char)、布尔型(boolean)等数据类型的定义和使用。2. 运算符:算术运算符(+、-、*、/、%......
  • 再学HBase,关于HBase的一些基础知识 | 如何集成在java中
    HBase简介在使用方面:HBase是一种数据仓库,是基于hdfs的nosql数据源,数据都是存放在hdfs上的,不需要像hive一样再去运行MapReduce进行长时间运算。特点:在phonenix/hive的集成下才可以支持sql,本身是有自己的dql语言的。具有一级索引rowKey,基于一级索引查询hbase的表都是物理表,......
  • 题目集1~3的总结
    一、前言这三次题目集主要考察的是我们对Java的面向对象的封装,还有关于方法的调用和返回,集合和正则表达式的使用,java已经封装好的类的使用,多个类之间的关系与使用,使用类来封装对象而不是用一个main解决所有问题,体现了面向对象的设计思想。这三次题目集的题量适中,每次的题目集前......
  • 题目集1~3总结与分析
    一.前言知识点考查和难度:题目集一第一题设计风扇Fan类考查了Java类的组成部分和具体的组成内容。题目集一第二题巩固了类和对象的使用,和其中的构造方法。题目集一第三题在第二题考查基础上添加了具体的方法。题目集一第四题进一步学习类的使用,做了简单的关联类体现数据的......
  • 题目集1~3总结
    前言经过三周的Java开发,课程从简单的题目设计逐渐深入复杂的题目逻辑。这三次作业不仅考验了我们对Java语言基础的理解,还涉及了面向对象设计、异常处理、以及复杂数据结构的使用。在写完三次题目集后,也是对这三次进行一个总结,首先题目集的题量是随着不断减少,但是难度不言而喻是逐......
  • 题目集1~3的总结性Blog
    一、前言   相关知识点:   1、第一次题目集主要是对java的类的设计以及相关的方法的使用,包括数组的使用方法,类和对象的使用等进行考察。   2、第二次题目集则是对第一次题目集的一次强化以及补充,要求掌握排序以及查找相关方法的使用,以及对于类与对象的概念进行了......
  • PTA题目集1~3的总结
    一、前言7-1答题判题程序-1(1)知识点:字符串解析:使用正则表达式或字符串分割来解析输入的题目信息和答案。控制结构:使用循环结构来处理多个输入行。条件判断:根据标准答案判断答题结果。数据结构:使用数组或集合来存储题目信息和答案。(2)题量:输入题目数量。输入题目内容(包括题......