初始有一个长度为 的序列 ,初始全 。
共 次修改,每次修改 ,让 。求出所有操作后的 。
其中这 次修改的生成方式为:
给定初始的位非负整数
调用 次上图中的 ,记结果为 。其中第 次修改的 为:
共 组数据,每次给定 。
,,,
其实就是区间取 ,最后需要给出整个序列,朴素的线段树过不了,由于修改的 在一定程度上是随机的,所以考虑剪枝优化。
第一种方法:标记永久化,维护一下每个区间的永久标记,最后在线段树上跑一边 dfs 统计结果(抄自oi-wiki)。剪枝优化:如果当前区间的永久标记已经 当前修改的值,直接返回,不继续向下修改。
第二种方法:维护区间最小值,这个就不用标记永久化了。剪枝优化:如果当前区间的最小值已经 当前修改的值,直接返回,不继续向下修改。
第一种方法:
#include<iostream>
#include<cstdio>
#include<algorithm>
namespace do_while_true {
#define ld double
#define ll long long
#define ui unsigned int
#define re register
#define pb push_back
#define fir first
#define sec second
#define pp std::pair
#define mp std::make_pair
const ll mod = 998244353;
template <typename T>
inline T Max(T x, T y) { return x > y ? x : y; }
template <typename T>
inline T Min(T x, T y) { return x < y ? x : y; }
template <typename T>
inline T Abs(T x) { return x < 0 ? -x : x; }
template <typename T>
inline T& read(T& r) {
r = 0; bool w = 0; char ch = getchar();
while(ch < '0' || ch > '9') w = ch == '-' ? 1 : 0, ch = getchar();
while(ch >= '0' && ch <= '9') r = r * 10 + (ch ^ 48), ch = getchar();
return r = w ? -r : r;
}
template <typename T>
inline T qpow(T x, T y) {
re T sumq = 1; x %= mod;
while(y) {
if(y&1) sumq = sumq * x % mod;
x = x * x % mod;
y >>= 1;
}
return sumq;
}
char outch[110];
int outct;
template <typename T>
inline void print(T x) {
do {
outch[++outct] = x % 10 + '0';
x /= 10;
} while(x);
while(outct >= 1) putchar(outch[outct--]);
}
}
using namespace do_while_true;
const int N = 100010;
const int M = 5000100;
int n, m, a[N];
ui f[M*3];
#define ls tree[x].lson
#define rs tree[x].rson
int trnt = 1;
struct SGT {
int l, r, lson, rson, tag;
}tree[N<<1];
void build(int x, int l, int r) {
tree[x].l = l; tree[x].r = r; tree[x].tag = 0;
if(l == r) return ;
ls = ++trnt; rs = ++trnt;
build(ls, l, (l+r)>>1); build(rs, tree[ls].r+1, r);
}
void modify(int x, int l, int r, int v) {
if(tree[x].tag >= v) return ;
if(tree[x].l >= l && tree[x].r <= r) {
tree[x].tag = Max(tree[x].tag, v);
return ;
}
int mid = (tree[x].l + tree[x].r) >> 1;
if(mid >= l) modify(ls, l, r, v);
if(mid < r) modify(rs, l, r, v);
}
void query(int x, int mx) {
mx = Max(tree[x].tag, mx);
if(tree[x].l == tree[x].r) {
a[tree[x].l] = mx;
return ;
}
query(ls, mx); query(rs, mx);
}
#undef ls
#undef rs
void solve() {
read(n); read(m);
trnt = 1; build(1, 1, n);
ui x, y, z; read(x); read(y); read(z);
for(int i = 1; i <= 3 * m; ++i) { x = x ^ (x << 11),x = x ^ (x >> 4),x = x ^ (x << 5),x = x ^ (x >> 14);ui w = x ^ (y ^ z);x = y,y = z,z = w,f[i] = z;}
for(int i = 1, l, r, v; i <= m; ++i) {
l = Min(f[3*i-2] % n + 1, f[3*i-1] % n + 1);
r = Max(f[3*i-2] % n + 1, f[3*i-1] % n + 1);
v = f[3*i] % (1 << 30);
modify(1, l, r, v);
}
query(1, 0); ll ans = 0;
for(int i = 1; i <= n; ++i)
ans ^= 1ll * i * a[i];
printf("%lld\n", ans);
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T = 1;
read(T);
while(T--) solve();
fclose(stdin);
return 0;
}
第二种方法:
#include<iostream>
#include<cstdio>
#include<algorithm>
namespace do_while_true {
#define ld double
#define ll long long
#define ui unsigned int
#define re register
#define pb push_back
#define fir first
#define sec second
#define pp std::pair
#define mp std::make_pair
const ll mod = 998244353;
template <typename T>
inline T Max(T x, T y) { return x > y ? x : y; }
template <typename T>
inline T Min(T x, T y) { return x < y ? x : y; }
template <typename T>
inline T Abs(T x) { return x < 0 ? -x : x; }
template <typename T>
inline T& read(T& r) {
r = 0; bool w = 0; char ch = getchar();
while(ch < '0' || ch > '9') w = ch == '-' ? 1 : 0, ch = getchar();
while(ch >= '0' && ch <= '9') r = r * 10 + (ch ^ 48), ch = getchar();
return r = w ? -r : r;
}
template <typename T>
inline T qpow(T x, T y) {
re T sumq = 1; x %= mod;
while(y) {
if(y&1) sumq = sumq * x % mod;
x = x * x % mod;
y >>= 1;
}
return sumq;
}
char outch[110];
int outct;
template <typename T>
inline void print(T x) {
do {
outch[++outct] = x % 10 + '0';
x /= 10;
} while(x);
while(outct >= 1) putchar(outch[outct--]);
}
}
using namespace do_while_true;
const int N = 100010;
const int M = 5000100;
int n, m, a[N];
ui f[M*3];
#define ls tree[x].lson
#define rs tree[x].rson
int trnt = 1;
struct SGT {
int l, r, lson, rson, mn, tag;
}tree[N<<1];
inline void pushup(int x) { tree[x].mn = Min(tree[ls].mn, tree[rs].mn); }
inline void pushdown(int x) {
if(tree[x].tag) {
int p = tree[x].tag; tree[x].tag = 0;
tree[ls].tag = Max(tree[ls].tag, p); tree[rs].tag = Max(tree[rs].tag, p);
tree[ls].mn = Max(tree[ls].mn, p);
tree[rs].mn = Max(tree[rs].mn, p);
}
}
void build(int x, int l, int r) {
tree[x].l = l; tree[x].r = r; tree[x].tag = 0; tree[x].mn = 0;
if(l == r) return ;
ls = ++trnt; rs = ++trnt;
build(ls, l, (l+r)>>1); build(rs, tree[ls].r+1, r);
}
void modify(int x, int l, int r, int v) {
if(tree[x].mn >= v) return ;
if(tree[x].l >= l && tree[x].r <= r) {
tree[x].mn = Max(tree[x].mn, v);
tree[x].tag = Max(tree[x].tag, v);
return ;
}
pushdown(x);
int mid = (tree[x].l + tree[x].r) >> 1;
if(mid >= l) modify(ls, l, r, v);
if(mid < r) modify(rs, l, r, v);
pushup(x);
}
void query(int x) {
if(tree[x].l == tree[x].r) {
a[tree[x].l] = tree[x].mn;
return ;
}
pushdown(x);
query(ls); query(rs);
}
#undef ls
#undef rs
void solve() {
read(n); read(m);
trnt = 1; build(1, 1, n);
ui x, y, z; read(x); read(y); read(z);
for(int i = 1; i <= 3 * m; ++i) { x = x ^ (x << 11),x = x ^ (x >> 4),x = x ^ (x << 5),x = x ^ (x >> 14);ui w = x ^ (y ^ z);x = y,y = z,z = w,f[i] = z;}
for(int i = 1, l, r, v; i <= m; ++i) {
l = Min(f[3*i-2] % n + 1, f[3*i-1] % n + 1);
r = Max(f[3*i-2] % n + 1, f[3*i-1] % n + 1);
v = f[3*i] % (1 << 30);
modify(1, l, r, v);
}
query(1); ll ans = 0;
for(int i = 1; i <= n; ++i)
ans ^= 1ll * i * a[i];
printf("%lld\n", ans);
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T = 1;
read(T);
while(T--) solve();
fclose(stdin);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?