2019徐州网络赛 XKC's basketball team 线段树

网址:https://nanti.jisuanke.com/t/41387

题意:

大家好,我是训练时长两年半的个人练习生蔡徐坤,我的爱好是唱,跳,rap,篮球。

给出一段长度为$n,(n \leq 1e5)$的序列,对每一个数,求出它和它后面比它大$m$的数中间夹着的数的数量,没有输出$-1$。

题解:

直接建线段树,维护最大值,然后查询时对第$i$个数,搜索区间$[i,n]$之中大于$num[i]+m$的值的位置的最大值,具体操作是先限定区间,然后求出所有合法位置,取最大值,如果搜索不到则返回$-1$,(注意考虑$m=0$的情况),剪枝的操作是如果区间最大值小于下界,就不用查找了,然后判断一下是否存在就好了。

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define ls (k<<1)
#define rs ((k<<1)+1)
const int MAXN = 5e5 + 5;
int num[MAXN];
struct segtree
{
	struct node
	{
		int l, r;
		long long val;
	};
	node tr[MAXN << 2];
	void build(int l, int r, int k)
	{
		tr[k].l = l, tr[k].r = r;
		if (l == r)
		{
			tr[k].val = num[l];
			return;
		}
		int m = (l + r) >> 1;
		build(l, m, ls);
		build(m + 1, r, rs);
		tr[k].val = max(tr[ls].val, tr[rs].val);
	}
	int query(int l, int r, int k, long long val)
	{
		//cout << tr[k].l << " " << tr[k].r << " " << tr[k].val << endl;
		if (l <= tr[k].l && r >= tr[k].r)
		{
			if (tr[k].l == tr[k].r)
				return tr[k].val >= val ? tr[k].l : -1;
			int pos = -1;
			//cout << "==" << tr[ls].val << " " << tr[rs].val << endl;
			if (tr[rs].val >= val)
				pos = max(pos, query(l, r, rs, val));
			else if (tr[ls].val >= val)
				pos = max(pos, query(l, r, ls, val));
			else
				pos = -1;
			return pos;
		}
		int m = (tr[k].l + tr[k].r) >> 1;
		int pos = -1;
		if (l <= m)
			pos = max(pos, query(l, r, ls, val));
		if (r > m)
			pos = max(pos, query(l, r, rs, val));
		return pos;
	}
};
segtree tr;
int main()
{
	int n;
	long long m;
	scanf("%d%lld", &n, &m);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &num[i]);
	tr.build(1, n, 1);
	for (int i = 1; i <= n; ++i)
	{
		int pos = tr.query(i, n, 1, num[i] + m);
		//cout << pos << endl;
		if (pos == i || pos == -1)
			printf("-1");
		else
			printf("%d", pos - i - 1);
		printf("%c", i == n ? ‘\n‘ : ‘ ‘);
	}
	return 0;
}

  

2019徐州网络赛 XKC's basketball team 线段树

原文地址:https://www.cnblogs.com/Aya-Uchida/p/11489292.html

时间: 2024-11-07 10:48:27

2019徐州网络赛 XKC's basketball team 线段树的相关文章

2019南昌网络赛-I(单调栈+线段树)

题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上弄了3小时,思路大体都是对的,但就是没法实现.这几天恶补线段树. 首先可以利用单调栈来查找满足a[i]为最小值的最大区间L[i]~R[i].然后利用线段树求一个段的和sum.最小前缀lsum和最小后缀rsum.然后遍历a[i]: a[i]>0:最优为sum(L[i],R[i])*a[i] a[i]<

2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组

TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已经不需要持久化了,直接动态开点就完事了...用主席树方法开过不去,要么超内存,要么越界... 大概思路...这题要求的[L,R]区间内,满足x<=a[i]<=y的连续的段数, 这题大概是个套路题,我们很容易想到,我们把连续的区间变成单点,把一段区间,类似1 1 1 3 5 变成 1 0 0 3 5

query 2019徐州网络赛(树状数组)

query \[ Time Limit: 2000 ms \quad Memory Limit: 262144 kB \] 题意 补题才发现比赛的时候读了一个假题意.... 给出长度为 \(n\) 的排列,在给出 \(m\) 次询问,每次询问有一对 \(l.r\),问满足 \(min(ai, aj) = gcd(ai, aj)\) 的 \(pair(i, j)\) 对数. 思路 考虑离线做 先把每个数出现的位置记录下来,然后预处理出所有的 \(pair\). 对于一个数字 \(x\),其满足条件

【2019.09.07】2019徐州网络赛

补题地址:https://www.jisuanke.com/contest/3005?view=challenges 题目: A:? B:? C:? D:? E:? F: G:? 回文树+二进制统计回文串内不同字母数技巧https://blog.csdn.net/Cassie_zkq/article/details/100606270 H: I:? J: K:? L: M:? 原文地址:https://www.cnblogs.com/ncu2019/p/11482910.html

2019徐州网络赛

I 题 query 题目链接 题目大意是给一个N(<=1e5) permutation  p (下标从1开始) , 现在定义一种pair( i ,j) ,其满足 min(pi?,pj?)=gcd(pi?,pj?),现在有M (<=1e5) 组区间查询[l,r]询问 满足 l <= i < j <= r 的pair有多少对. 这是一种偏序关系的问题,看了一点CDQ 解偏序的介绍 , 感觉也可以树状数组来搞.预处理出每个符合要求的点对( l , r )位置,在一维树状数组上修改点

2019徐州网络赛 I J M

I. query 比赛时候没有预处理因子疯狂t,其实预处理出来因子是\(O(nlog(n))\)级别的 每个数和他的因子是一对偏序关系,因此询问转化为(l,r)区间每个数的因子在区间(l,r)的个数 预处理出来每个位置上的数所有因子的位置,用可持久化线段树维护,区间询问 #include<bits/stdc++.h> #define ll long long #define mk make_pair #define ft first #define se second #define pii

2019 徐州网络赛 center

题意:n个点,求最小加上几个点让所有点关于一个点(不需要是点集里面的点)中心对称 题解:双重循环枚举,把中点记录一下,结果是n-最大的中点 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned long long ull; 5 #define mem(s) memset(s, 0, sizeof(s)) 6 const int INF = 0x3f3f3f3f;

2019徐州网络赛 H.function

题意: 先有\(n=p_1^{k_1}p_2^{k_2}\cdots p_m^{k_m}\),定义\(f(n)=k_1+k_2+\cdots+k_m\). 现在计算 \[ \sum_{i=1}^nf(i!)\% 998244353 \] 思路: 首先注意到\(f\)函数有这样一个性质:\(f(ab)=f(a)+f(b)\). 那么我们化简所求式子有: \[ \begin{aligned} &\sum_{i=1}^nf(i!)\=&\sum_{i=1}^n\sum_{j=1}^if(j)\=

ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 i题 Minimum(线段树)

描述 You are given a list of integers a0, a1, …, a2^k-1. You need to support two types of queries: 1. Output Minx,y∈[l,r] {ax?ay}. 2. Let ax=y. 输入 The first line is an integer T, indicating the number of test cases. (1≤T≤10). For each test case: The fi