首页 > 其他分享 >AtCoder Beginner Contest 223 H Xor Query

AtCoder Beginner Contest 223 H Xor Query

时间:2023-06-14 18:23:06浏览次数:61  
标签:AtCoder typedef Xor log Beginner ll long 线性

洛谷传送门

AtCoder 传送门

考虑一个无脑做法:线段树维护区间线性基。时间复杂度是 \(O(m \log n \log^2 V)\),过于优秀以至于无法接受。

事实上我们并不需要维护区间线性基,因为不带修。考虑“可持久化线性基”,开 \(n\) 个线性基,第 \(i\) 个维护前缀 \([1, i]\) 的数。并且插入线性基时优先选择出现位置靠后的数,这样使得查询时左端点的限制更容易被满足。查询的时候,直接查第 \(r\) 个线性基能不能凑出 \(x\) 并且不使用出现位置 \(< l\) 的数。

但是这样空间复杂度是 \(O(n \log V)\) 的,不够优秀。考虑我们其实可以离线,按右端点从小到大插入并且回答询问,就不用开 \(n\) 个线性基了,空间复杂度降为 \(O(n + \log V)\),时间复杂度是 \(O((n + m) \log V)\)。

code
// Problem: H - Xor Query
// Contest: AtCoder - AtCoder Beginner Contest 223
// URL: https://atcoder.jp/contests/abc223/tasks/abc223_h
// Memory Limit: 1024 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 mems(a, x) memset((a), (x), sizeof(a))

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

const int maxn = 400100;

ll n, m, a[maxn], p[66], d[65], b[maxn];

struct node {
	ll p, x, id;
	node(ll a = 0, ll b = 0, ll c = 0) : p(a), x(b), id(c) {}
};

vector<node> vc[maxn];

inline void insert(ll x, ll t) {
	for (int i = 59; ~i; --i) {
		if (x & (1LL << i)) {
			if (!p[i]) {
				p[i] = x;
				d[i] = t;
				break;
			}
			if (d[i] < t) {
				swap(x, p[i]);
				swap(t, d[i]);
			}
			x ^= p[i];
		}
	}
}

inline bool check(ll x, ll t) {
	for (int i = 59; ~i; --i) {
		if (x & (1LL << i)) {
			if (!p[i] || d[i] < t) {
				return 0;
			}
			x ^= p[i];
		}
	}
	return 1;
}

void solve() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	for (int i = 1; i <= m; ++i) {
		ll l, r, x;
		scanf("%lld%lld%lld", &l, &r, &x);
		vc[r].pb(l, x, i);
	}
	for (int i = 1; i <= n; ++i) {
		insert(a[i], i);
		for (node u : vc[i]) {
			b[u.id] = check(u.x, u.p);
		}
	}
	for (int i = 1; i <= m; ++i) {
		puts(b[i] ? "Yes" : "No");
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Xor,log,Beginner,ll,long,线性
From: https://www.cnblogs.com/zltzlt-blog/p/17481050.html

相关文章

  • AtCoder Beginner Contest 215 H Cabbage Master
    洛谷传送门AtCoder传送门考虑第一问。发现这个东西长得很像二分图匹配,考虑建图,第\(i\)个盒子建\(b_i\)个左部点,第\(i\)个球建\(a_i\)个右部点,每个盒子的每个点往可以放的球的每个点连边。显然要求能被满足等价于,这个二分图存在一个左部点的完全匹配。因为一个盒子的......
  • AtCoder Regular Contest 141 C Bracket and Permutation
    洛谷传送门AtCoder传送门考虑给出\(S\),如何求\(P,Q\)。先考虑\(P\),那我们肯定想让\(P\)的每一项都尽量往前靠。设\([1,k]\)为合法括号串,\(S_{k+1}=\texttt{)}\),那\(P\)的前\(k\)项依次为\(1\simk\),第\(k+1\)项不能为\(k+1\)了,那找到\(k+1\)之......
  • AtCoder Beginner Contest 273(E)
    AtCoderBeginnerContest273(E)E(链式结构,思维)E题目大意就是原本有一个空的序列,我们后面会进行\(q\)次操作,每次操作我们都需要输出此时的序列的最后数字下面有几种操作\(ADD\)\(x\),代表在这在这个序列的最后面添加一个\(x\)\(DELETE\),代表如果此时的序列存在数字的话,......
  • AtCoder Beginner Contest 265 F Manhattan Cafe
    洛谷传送门AtCoder传送门考虑dp,\(f_{i,j,k}\)表示考虑到第\(i\)维,\(\sum\limits_{x=1}^i|p_x-r_x|=j,\sum\limits_{x=1}^i|q_x-r_x|=k\)的方案数。转移是容易的,枚举\(r_i\)即可,\(f_{i,j,k}=\sum\limits_rf_{i-1,j-|p_i-r|,k-|q_i-r|}......
  • The XOR Largest Pair
    #include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;intbit[32];intn,num[5211314];structTrie{ inttrie[5211314][2],tot=1; inlinevoidInsert(inta){ ......
  • Atcoder Beginner Contest 301
    A-OverallWinner题目大意A和T两人玩游戏,给定一串只由A和T组成的字符串,如果第i个字符是A,则A赢得第i轮的胜利,反之则T赢;当遍历完整个字符串后,谁赢的轮数多谁就是最终赢家,如果一样则谁最先达到该轮数谁赢,输出赢家的名字解题思路签到题不多嗦了神秘代码......
  • AtCoder Beginner Contest 278 ABCDE
    AtCoderBeginnerContest278A-ShiftProblemStatement题意:给你一个长度为n的序列,让你移走前面k个后面补k个0。Solution思路:按照题意模拟即可。#include<bits/stdc++.h>usingnamespacestd;inta[1100];intmain(){ intn,k; cin>>n>>k; k=min(k,n); for(int......
  • UNIQUE VISION Programming Contest 2023 New Year (AtCoder Beginner Contest 287) A
    UNIQUEVISIONProgrammingContest2023NewYear(AtCoderBeginnerContest287)A-MajorityProblemStatement题意:给你n个字符串,字符串是For表示agree,字符串Against表示disagree,让你判断最终是否通过。Solution思路:统计For和Against的数量,比较一下即可。#include......
  • AtCoder Beginner Contest 284 ABCDE
    AtCoderBeginnerContest284A-SequenceofStringsProblemStatement题意:给你n个字符串,让你倒序输出Solve#include<bits/stdc++.h>usingnamespacestd;constintN=20;strings[N];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) cin>>s......
  • Atcoder-AGC033C
    看到这道题,是个博弈论,没见过树上的,于是想到在数列里的博弈论,又联想到树的特殊形式————链。于是我们来讨论一下链的情况(对于没有硬币的点,我们就视为它被删掉了):讨论链的情况发现若是选择两端的点,顶点数会减一;若是选择中间的点,顶点数会减二。现在我们站在链的角度来思考......