Glad You Came hdu-6356(ST表 || 线段树)
第一种用线段树,用两颗数维护区间最大值和区间的最小值,然后更新的时候如果我目前区间内的最大值比我得到的v小,那么我就把这个区间修改成v,如果我的最小值比v大,那么v就是没有用的,直接跳过,然后这样每次更新[l, r]内的最大最小值,查询的时候返回每个位置的最大值,就可以求出答案
线段树:
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
typedef unsigned int ui;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 1e5;
const int maxm = 2e5+;
const int mod = <<;
const double eps = 1e-;
using namespace std; int n, m;
int T, tol;
ui X, Y, Z;
int mx[maxn << ];
int mn[maxn << ];
int lazy[maxn << ]; ui RNG61() {
X = X ^ (X<<);
X = X ^ (X>>);
X = X ^ (X<<);
X = X ^ (X>>);
ll W = X ^ (Y ^ Z);
X = Y;
Y = Z;
Z = W;
return Z;
} void init() {
memset(mx, , sizeof mx);
memset(mn, , sizeof mn);
memset(lazy, , sizeof lazy);
} void pushup(int root) {
mx[root] = max(mx[root << ], mx[root << | ]);
mn[root] = min(mn[root << ], mn[root << | ]);
} void pushdown(int root) {
if(lazy[root]) {
mx[root << ] = mx[root << | ] = lazy[root];
mn[root << ] = mn[root << | ] = lazy[root];
lazy[root << ] = lazy[root << | ] = lazy[root];
lazy[root] = ;
}
} void update(int left, int right, int prel, int prer, int val, int root) {
if(prel <= left && right <= prer) {
if(mx[root] < val) {
mx[root] = mn[root] = val;
lazy[root] = val;
return ;
}
if(mn[root] > val) return ;
}
if(mn[root] > val) return ;
pushdown(root);
int mid = (left + right) >> ;
if(prel <= mid) update(left, mid, prel, prer, val, root << );
if(prer > mid) update(mid+, right, prel, prer, val, root << | );
pushup(root);
} int query(int left, int right, int pos, int root) {
if(left == right) {
return mx[root];
}
pushdown(root);
int mid = (left + right) >> ;
if(pos <= mid) return query(left, mid, pos, root << );
else return query(mid+, right, pos, root << | );
} int main() {
scanf("%d", &T);
while(T--) {
scanf("%d%d%d%d%d", &n, &m, &X, &Y, &Z);
init();
for(int i=; i<=m; i++) {
ui f1 = RNG61();
ui f2 = RNG61();
ui f3 = RNG61();
int l = min(f1%n+, f2%n+);
int r = max(f1%n+, f2%n+);
int v = f3 % mod;
update(, n, l, r, v, );
}
ll ans = ;
for(int i=; i<=n; i++) {
ans ^= (1ll * i * query(, n, i, ));
}
printf("%I64d\n", ans);
}
return ;
}
原本的RMQ是得到每个位置的点值,然后一步一步更新成区间的最值,用
st[i][j] = max(st[i][j-1],st[i+(1<<(j-1))][j-1])
然后这里是先得到区间最值,然后往回更新到每个位置的点的最值,所以就是两个
st[i][j-1] = max(st[i][j-1], st[i][j])
st[i+(1<<(j-1))][j-1] = max(st[i+(1<<(j-1))][j-1], st[i][j])
倒着更新
然后题目里面数据很大,所以同样的log(r-l+1)/log(2.0)可能计算很多遍,可以把log(i)/log(2.0)打表出来,可以快一半的时间
ST表:
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x)) typedef unsigned long long int ull;
typedef long long int ll;
typedef unsigned int ui;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 1e5;
const int maxm = 2e5+;
const int mod = <<;
const double eps = 1e-;
using namespace std; int n, m;
int T, tol;
ui X, Y, Z; int st[maxm][];
int lg[maxn]; ui RNG61() {
X = X ^ (X<<);
X = X ^ (X>>);
X = X ^ (X<<);
X = X ^ (X>>);
ll W = X ^ (Y ^ Z);
X = Y;
Y = Z;
Z = W;
return Z;
} void init() {
memset(st, , sizeof st);
} void handle() {
lg[] = -;
for(int i=; i<maxn; i++) lg[i] = log(i) / log(2.0);
} int main() {
handle();
scanf("%d", &T);
while(T--) {
scanf("%d%d%d%d%d", &n, &m, &X, &Y, &Z);
init();
for(int i=; i<=m; i++) {
ui f1 = RNG61();
ui f2 = RNG61();
ui f3 = RNG61();
int l = min(f1%n+, f2%n+);
int r = max(f1%n+, f2%n+);
int v = f3 % mod;
int k = lg[r-l+];
st[l][k] = max(st[l][k], v);
st[r-(<<k)+][k] = max(st[r-(<<k)+][k], v);
}
int len = log(n) / log(2.0);
for(int j=len; j>=; j--) {
for(int i=; i<=n; i++) {
st[i][j-] = max(st[i][j-], st[i][j]);
st[i+(<<(j-))][j-] = max(st[i+(<<(j-))][j-], st[i][j]);
}
}
ll ans = ;
for(int i=; i<=n; i++) ans = ans ^ (1ll * i * st[i][]);
printf("%I64d\n", ans);
}
return ;
}
Glad You Came hdu-6356(ST表 || 线段树)的更多相关文章
- 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...
- 51nod 1593 公园晨跑 | ST表(线段树?)思维题
51nod 1593 公园晨跑 有一只猴子,他生活在一个环形的公园里.有n棵树围绕着公园.第i棵树和第i+1棵树之间的距离是 di ,而第n棵树和第一棵树之间的距离是 dn .第i棵树的高度是 hi ...
- Codeforces 487B Strip (ST表+线段树维护DP 或 单调队列优化DP)
题目链接 Strip 题意 把一个数列分成连续的$k$段,要求满足每一段内的元素最大值和最小值的差值不超过$s$, 同时每一段内的元素个数要大于等于$l$, 求$k$的最小值. 考虑$DP$ 设$ ...
- bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队【st表||线段树】
要求区间取min和max,可以用st表或线段树维护 st表 #include<iostream> #include<cstdio> using namespace std; c ...
- (DP ST表 线段树)51NOD 1174 区间中最大的数
给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...
- [luoguP1816] 忠诚(st表 || 线段树)
传送门 其实我就是想练练 st表 本以为学了线段树可以省点事不学 st表 了 但是后缀数组中用 st表 貌似很方便 所以还是学了吧,反正也不难 ——代码 #include <cstdio> ...
- RMQ--树状数组,ST表,线段树
RMQ Range Minimum/Maximum Query 区间最值问题 树状数组 https://www.cnblogs.com/xenny/p/9739600.html lowbit(x) x ...
- st表、树状数组与线段树 笔记与思路整理
已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...
- Hdu5737-Differencia(有序表线段树)
题意很直观,我就不说了. 解析:这是我以前没有接触过的线段树类型,有序表线段树,每个节点申请了两段空间,主要是为了保存左边儿子会有多少比v小的,右边儿子会有多少比v小 的,所以在建树过程中要归并排序. ...
随机推荐
- Linux 典型应用之Mysql
Mysql 的安装及连接 删除默认安装的 mariadb数据库 yum remove mariadb-libs.x86_64 mysql源下载的网址 https://dev.mysql.com/dow ...
- 社交CRM SCRM
社交CRM - 国际版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=%E7%A4%BE%E4%BA%A4CRM 社交CRM ...
- python 3.6.1 安装scrapy踩坑之旅
系统环境:win10 64位系统安装 python基础环境配置不做过多的介绍 window环境安装scrapy需要依赖pywin32,下载对应python版本的exe文件执行安装,下载的pywin32 ...
- python内涵段子爬取练习
# -*- coding:utf-8 -*-from urllib import request as urllib2import re# 利用正则表达式爬取内涵段子url = r'http://ww ...
- MT4用EA测试历史数据时日志出现:stopped because of stop out
今天用嘉盛的MT4测试一个EA,谁知道才走了十几天数据就完 了,看结果本金也没亏完啊,才亏了一半,而且我测的是1年的时间. 查看日志一有条警告:stopped because of stop out, ...
- C程序运行时的内存分布
该篇博客是自己学习的总结,如果有哪里理解的不对的地方,希望大家可以指点. 一.C内存空间分布图 二.各内存区域详解 1.代码区(.text): 该区域主要存放二进制可执行文件. 2.数据区(.data ...
- 【apache2】AH00543: httpd: bad user name apache
当启动 apache 时,出现一下异常:AH00543: httpd: bad user name daemon 解决方法: #groupadd daemon ...
- kibana——es的批量操作
一·_mget: 1.创建的索引如下: 2.批量查询: #查询两个 GET _mget { "docs":[ { "_index":"testdb&q ...
- centos7根分区扩容(亲测有效)
root@haojftest:~# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos_test2-root 28G 14G 15G % / devtmpfs ...
- Python——Button参数
anchor: 指定按钮上文本的位置: background(bg): 指定按钮的背景色: bitmap:指定按钮上显示的位图: borderwidth(bd): 指定按钮边框的宽度: c ...