首页 > 其他分享 >LY1099 [ 20230222 CQYC模拟赛 T2 ] 相似序列

LY1099 [ 20230222 CQYC模拟赛 T2 ] 相似序列

时间:2023-12-25 21:57:19浏览次数:35  
标签:20230222 LY1099 int T2 mid edge 1e5 query rot

题意

给定一个序列。

每次询问求两个区间排序后是否只有一个或者没有位置不同。

Sol

不难想到主席树维护值域。

考虑如何判断。

注意到当前答案正确,当且仅当值域上两点不同且相邻。

维护每个点的哈希值判断即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}

const int N = 1e5 + 5;

array <int, N> idx;

namespace Sgt {

array <int, N * 800> lc, rc;
array <int, N * 800> edge;
int cnt;

void pushup(int x) {
	edge[x] = edge[lc[x]] + edge[rc[x]];
}

void modify(int &x, int l, int r, int y) {
	cnt++;
	lc[cnt] = lc[x];
	rc[cnt] = rc[x];
	edge[cnt] = edge[x];
	x = cnt;
	if (l == r) {
		edge[x] += idx[y];
		return;
	}
	int mid = (l + r) >> 1;
	if (y <= mid) modify(lc[x], l, mid, y);
	else modify(rc[x], mid + 1, r, y);
	pushup(x);
}

int query(int x1, int x2, int l, int r, int L, int R) {
	if (L > r || R < l) return 0;
	if (L <= l && R >= r) return (edge[x1] - edge[x2]);
	int mid = (l + r) >> 1, ans = 0;
	if (L <= mid) ans += query(lc[x1], lc[x2], l, mid, L, R);
	if (R > mid) ans += query(rc[x1], rc[x2], mid + 1, r, L, R);
	return ans;
}

}

array <int, N> rot;

signed main() {
#ifdef ONLINE_JUDGE
	freopen("similar.in", "r", stdin);
	freopen("similar.out", "w", stdout);
#endif
	int n = read(), q = read();
	idx[0] = 1;
	for (int i = 1; i <= 1e5; i++)
		idx[i] = idx[i - 1] * 131ll;
	for (int i = 1; i <= n; i++) {
		int x = read();
		rot[i] = rot[i - 1];
		Sgt::modify(rot[i], 1, 1e5, x);
	}
	while (q--) {
		int x_1 = read(), y_1 = read(), x_2 = read(), y_2 = read();
		int tp1, tp2;
		if ((tp1 = Sgt::query(rot[y_1], rot[x_1 - 1], 1, 1e5, 1, 1e5)) ==
			(tp2 = Sgt::query(rot[y_2], rot[x_2 - 1], 1, 1e5, 1, 1e5))) {
			puts("YES");
			continue;
		}
		/* cout << tp1 << " " << (int)tp2 << endl; */
		int l = 1, r = 1e5 + 1, itl = 0;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (Sgt::query(rot[y_1], rot[x_1 - 1], 1, 1e5, 1, mid) ==
				Sgt::query(rot[y_2], rot[x_2 - 1], 1, 1e5, 1, mid))
				itl = mid, l = mid + 1;
			else
				r = mid - 1;
		}
		l = 1, r = 1e5 + 1;
		int itr = 0;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (Sgt::query(rot[y_1], rot[x_1 - 1], 1, 1e5, mid, 1e5) ==
				Sgt::query(rot[y_2], rot[x_2 - 1], 1, 1e5, mid, 1e5))
				itr = mid, r = mid - 1;
			else
				l = mid + 1;
		}

		itl += 2, itr -= 2;
		/* write(itl), putchar(32); */
		/* write(itr), puts(""); */
		if (!Sgt::query(rot[y_1], rot[x_1 - 1], 1, 1e5, itl, itr) &&
			!Sgt::query(rot[y_2], rot[x_2 - 1], 1, 1e5, itl, itr))
			puts("YES");
		else
			puts("NO");

	}
	return 0;
}

标签:20230222,LY1099,int,T2,mid,edge,1e5,query,rot
From: https://www.cnblogs.com/cxqghzj/p/17927049.html

相关文章

  • Linux文件系统(以ext2为例)
    所有的计算机程序都需要存储和检索信息。长期存储信息有三个基本要求:能够存储大量信息。存储必须持久化。多个进程可以并发访问这些信息。这些任务一般由磁盘来进行。虽然固态硬盘在近年逐渐流行,但传统磁盘依然是存储大量数据的首选。本文只针对磁盘,不对固态硬盘进行讨论。使用磁盘......
  • 4、SpringBoot2之整合SpringMVC
    创建名为springboot_springmvc的新module,过程参考3.1节4.1、重要的配置参数在springboot中,提供了许多和web相关的配置参数(详见官方文档),其中有三个比较重要:4.1.1、server.port该配置参数用于设置web应用程序的服务端口号,默认值为80804.1.2、server.servlet.cont......
  • 我依然没有用quest2串流过一次...
    我在前几年买了quest2在它刚上市的时候,从日本amazon邮过来64gb版本全新没开封是将近2400rmb, 激活quest2于国内是一件蛮麻烦的事,但是毕竟quest2是一个比较便宜的vr头盔,说起来我想要vr头盔这件事,早在2016年我在微软上班的时候就很想了. 那时候vr概念很火,htc的vr已经上市了,......
  • ZROI 2023.12.24 T2
    很硬的题目!题意给出一棵\(n\)个点的树以及它以\(1\)为根时的一种DFS序,\(q\)组询问(强制在线):给定\(k\)个区间\([l_1,r_1],[l_2,r_2]\dots[l_k,r_k]\),问DFS序在这些区间内的点构成几个连通块。80分解法对\(k\)根号分治,\(k>\sqrt{n}\)直接暴力,\(k\le\sqrt{n}\)的......
  • USACO 2023 Pt T2
    有趣的小清新数据结构题。首先考虑这个合并每次找到最小的边的过程很类似于Kruskal最小生成树的合并过程,只不过每次是钦定了合并一个大联通块和一个点。由于需要从不同的起点开始考虑,也就是需要多次处理这个类似Kruskal的过程,自然想到Kruskal重构树。我们考虑建出Kruskal......
  • 2023南海区信息学区赛(初中组)T2棋盘(原始)
    第2题   棋盘(原始) 查看测评数据信息有一个R行C列的棋盘,共有R×C个单元格子,每个单元格子都要放一个棋子,棋子只有黑色或者白色。如果两个单元格子有公共边,那么称为相邻的格子。如果一个棋盘满足所有相邻格子的棋子都是不同颜色,那么就称为“优美”棋盘;否则称为“普通”......
  • Test20231016
    考得真烂。被初一dalao薄纱。[题面+std](https://www.wenshushu.cn/drive/cfraky1du37)。T1:数学结论题:裴蜀定理,即:$a\timesx+b\timesy=\gcd(a,b)$T2:小清新贪心题,清楚一点性质**从点$i\toj(j>i)$然后又从点$j\tok(j>k)$那么为什么不能从$i$直接到$k$呢?**根据......
  • EEPROM M24C64替换AT24C64出现读取数据为0xff情况解决办法
    EEPROMM24C64替换AT24C64出现读取数据为0xff情况解决办法硬件情况STM32F103CBT6+模拟IIC,主频72MHz,IIC上拉电阻3.3kΩ 出现原因在IIC停止信号上,SCL、SDA翻转间隔不足以被M24C64识别,导致读写出错。修改前IIC停止代码如下:voidI2C_Stop(void){I2C_SCL_LOW();I......
  • 如何新建SpringBoot2.7.X项目
    新版的idea在创建SpringBoot项目时最低的JDK都需要选择jdk17,可是我的本地只有jdk8,通过创建maven工程,然后在pom中手动填写相关依赖等信息来创建项目,pom文件内容(官网copy的)<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-......
  • TDengine 创始人陶建辉亮相 EDT2023 峰会,分享工业数据处理平台的创新实践
    随着大数据、物联网、人工智能、5G等数字技术的蓬勃发展,能源化工行业与新兴技术也在加速融合,推动着智能化、网格化和信息化进程的加速演进。在不稳定的外部环境下,数字化转型成为能源化工企业实现可持续发展的关键。12月14日,勤哲文化主办的“EDT2023中国能源化工数字科技峰会......