首页 > 其他分享 >洛谷 P8955 「VUSC」Card Tricks

洛谷 P8955 「VUSC」Card Tricks

时间:2023-11-23 18:33:06浏览次数:35  
标签:typedef 洛谷 VUSC Tricks long P8955 define

洛谷传送门

很显然每个数的每一位最多只会修改一遍。于是拆位,每一位开个并查集,存下一个不拥有这一位的数,就可以暴力修改了。

但是空间是 \(O(n \log V)\) 的,炸了。于是可以考虑手写 i24 类,同时并查集寻找祖先不要用递归版的路径压缩,然后就过了。

code
// Problem: P8955 「VUSC」Card Tricks
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P8955
// Memory Limit: 100 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

bool Mst;

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 20], *p1 = buf, *p2 = buf;
inline int read() {
    char c = getchar();
    int x = 0;
    for (; !isdigit(c); c = getchar()) ;
    for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    return x;
}

const int maxn = 1000100;

int n, m, K, a[maxn], ans[maxn];

struct i24 {
	unsigned char a, b, c;
	
	inline void set(int x) {
		a = x & 255;
		b = (x >> 8) & 255;
		c = (x >> 16) & 255;
	}
	
	inline int val() {
		return a + ((int)b << 8) + ((int)c << 16);
	}
} fa[30][maxn];

inline int find(int k, int x) {
	while (fa[k][x].val() != x) {
		int t = fa[k][fa[k][x].val()].val();
		fa[k][x].set(t);
		x = t;
	}
	return x;
}

void solve() {
	n = read();
	m = read();
	K = read();
	for (int i = 1; i <= n; ++i) {
		a[i] = read();
		ans[i] = -1;
	}
	for (int j = 0; j < 30; ++j) {
		for (int i = 1; i <= n + 1; ++i) {
			fa[j][i].set((a[i] & (1 << j)) ? i + 1 : i);
		}
	}
	for (int t = 1, l, r, x; t <= m; ++t) {
		l = read();
		r = read();
		x = read();
		for (int j = 0; j < 30; ++j) {
			if ((~x) & (1 << j)) {
				continue;
			}
			for (int i = find(j, l); i <= r; i = find(j, i)) {
				a[i] |= (1 << j);
				if (a[i] > K && ans[i] == -1) {
					ans[i] = t;
				}
				fa[j][i].set(i + 1);
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		printf("%d ", ans[i]);
	}
}

bool Med;

int main() {
	fprintf(stderr, "%.2lf MB\n", (&Mst - &Med) / 1048576.);
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,洛谷,VUSC,Tricks,long,P8955,define
From: https://www.cnblogs.com/zltzlt-blog/p/17852226.html

相关文章

  • 【模板】并查集 (洛谷P3367)
    1#include<bits/stdc++.h>2usingnamespacestd;3template<classT>4inlinevoidread(T&s)5{6s=0;7intw=1;8charch=getchar();9while(ch<'0'||ch>'9')10{11......
  • 【模板】线段树1(洛谷P3372)
    1#include<iostream>2#include<cstdio>34usingnamespacestd;56template<classT>7inlinevoidread(T&s)8{9s=0;10intw=1;11charch=getchar();12while(ch<'0�......
  • 【树链剖分】P3401 洛谷树 题解
    P3401考虑先将路径权值进行转化,因为很难对路径直接进行统计。考虑如何表示出这条路径的权值。记\(s_i=\oplus_{j\in\text{path}(1,i)}w_j\),其中\(\text{path}(i,j)\)表示\(i\)到\(j\)的路径上的边集。则\(u\tov\)的路径的权值为\(s_u\opluss_v\)。现在转变为......
  • 洛谷P8612 取宝
    经典的记忆化搜索,一开始因为最后的答案忘记加取模卡了半天,真是愚蠢至极。#include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include<cstring>usingnamespacestd;constintN=55,mod=1e9+7;intf[N][N][15][15];//横坐标纵......
  • 洛谷P8602 大臣的旅费
    这道题既可以用图论多次求单源最短路暴力来做,也可以用正解:求树的直径来做。#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;typedeflonglongll;constintN=1e5+5,M=N<<1;in......
  • 【洛谷 P1125】[NOIP2008 提高组] 笨小猴 题解(字符串+映射+集合)
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设是单词中出现次数最多的字母的出现次数,是单词中出现次数最少的字母的出现次数,......
  • 洛谷B2017 打印 ASCII 码(Python3)
    要点:1.Python的input()默认要换行,而在输入的时候即使只输了一个字符,也会被判定为输入两个字符。故此处要么只取字符串的第一位,要么在输入时用.strip()来删去首位字符,strip的介绍在这里2.Python中不能用强制类型转换来得到ASCII码,需要用到ord()函数。ord():括号内的字符的ASCI......
  • 洛谷B2016 浮点数向零舍入(Python3)
    要点:1.有正有负怎么办?正负分开写?如果只看数字部分,那取整的方式是一样的。所以我们可以先输出符号,把问题全都转化到非负数集中。2.如何取整?此处取整为向下取整。而强制类型转换把浮点数转化为整型数的时候是把小数部分全部去掉,而不是四舍五入,与题中取整方式相符,故可直......
  • 洛谷 P9869 [NOIP 2023] 三值逻辑 题解
    https://www.luogu.com.cn/problem/P9869?contestId=145259看到要给变量赋初始值,还是T,F,U之类的,容易想到2-SAT。设\(1\simn+m\)的点表示\(x_1,x_2,\dots,x_{n+m}\)为T的点,其中\(x_{k+n}(1\leqk\leqm)\)表示在第\(k\)次操作被操作的变量的值(操作......
  • 洛谷 B2006 地球人口承载力估计(Python3)
    这题难点在理解题意。没有任何技术含量:(题目分析:1.“可持续发展”到底什么意思?Makeendsmeet.也就是说能养活的那些人一年消耗的等于地球一年产生的。2.题中为什么要给x,a,y,b?为了求等量关系。注意,这里"x 亿人生活 a 年,或供 y 亿人生活 b年"用的是地球新生的资源和原有......