首页 > 其他分享 >P7333 [JRKSJ R1] JFCA 题解

P7333 [JRKSJ R1] JFCA 题解

时间:2023-07-17 14:13:51浏览次数:36  
标签:二分 ch JFCA int 题解 mid 300010 P7333

前言

传送门

blog

思路

首先看数据范围 $10^5$,$O(n \log_2 n)$ 可以过,自然想到二分

二分具有单调性,那么如何确保整个 $a$ 序列按顺序排列呢?

我们可以使用 st 表维护区间最大值,如果在这个距离中已经有了 $a_i\ge b_j$ 那么最大值一定指向的是新加入进来的那个值,否则在之前二分就已经不会再继续扩展了。

对于环形结构我们必须断环为链,这样可以将环形变为链形,并且保证答案的正确性。

这时我们就必须要考虑二分断环为链了,因为二分会向右扩展 $mid$,所以两倍会越界,那么就需要开三倍。

那么我们如何判断无解呢?在 $l = n$ 时说明已经过了一圈但是还是没有找到 $a_i\ge b_j$,又回到了 $j$,说明无解。

#include <bits/stdc++.h>
using namespace std;

int n,a[300010],LOG2[300010],st[300010][30];

inline int read()
{
	int x = 0,f = 1;char ch = getchar();
	while (ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
	while (ch >= '0' && ch <= '9'){x = x * 10 + ch - 48;ch = getchar();}
	return x * f;
}

void init(){
	for(int i = 2;i <= 3 * n;i++)
		LOG2[i] = LOG2[i >> 1] + 1; 
	for(int i = 1;i <= n;i++)
		st[i][0] = st[i + n][0] = st[i + n + n][0] = a[i];
	int k = LOG2[3 * n];
	for(int i = 1;i <= k;i++)
		for(int j = 1;j + (1 << i) - 1 <= 3 * n;j++){
			st[j][i] = max(st[j][i - 1],st[j + (1 << i - 1)][i - 1]); 
		}	
}	

int num(int l,int r){
	int s = LOG2[r - l + 1];
	int x = max(st[l][s],st[r - (1 << s) + 1][s]);
	return x; 
}

int two(int x,int y){
	int l = 1,r = n;
	while(l < r){
		int mid = (l + r) >> 1;
		if(max(num(y - mid,y - 1),num(y + 1,y + mid)) >= x)
			r = mid;
		else
			l = mid + 1;
	}
	return l == n ? -1 : l;
} 

int main(){
	n = read(); 
	for(int i = 1;i <= n;++i)
		a[i] = read();
	init();
	for(int i = 1;i <= n;i++){
		int b = read();
		printf("%d ",two(b,i + n));
	}
	return 0;
}

标签:二分,ch,JFCA,int,题解,mid,300010,P7333
From: https://www.cnblogs.com/JJL0610/p/17559920.html

相关文章

  • P8708 [蓝桥杯 2020 省 A1] 整数小拼接 题解
    前言传送门blog思路这种选出两个数拼接在一起的题,一看就可以使用two-point,我们使用$l$和$r$分别从最大的和最小的开始搜索,进行两次。以$l$为头,$r$为尾。以$r$为头,$l$为尾。如何比较大小呢?我们可以先去做宇宙总统这道题。首先排序的$cmp$:boolcmp(strin......
  • UVA10791 最小公倍数的最小和 Minimum Sum LCM 题解
    前言长沙市一中8机房0714模拟测1。传送门blog思路本题思路,首先我们先看$\operatorname{lcm}$,明显要使得这些数的$\operatorname{lcm}=n$那么我们就需要所有的数的质因子必须包含$n$的质因子。若$1\lea,b$,则$a\timesb\gea+b$,所以我们就有了策略。将同一个质因......
  • P9451 [ZSHOI-R1] 新概念报数 题解
    目录DescriptionSolutionCodeDescription在此题中,对于一个数\(x\),若\(\texttt{popcount}(x)\geq3\)(即\(x\)在二进制下\(\texttt{1}\)的个数大于等于三时),那它是非法的,否则其为合法的。给定\(T\)个数,如果当前的数\(x\)是非法的,则输出No,Commander,否则输出第一个大于......
  • requests.exceptions.ProxyError问题解决方法
    出现这个问题是因为你系统上在使用代理,然后你的代理又是规则匹配的。https://stackoverflow.com/questions/36906985/switch-off-proxy-in-requests-library3种解决方法:headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:109.0)Gecko/20100101Fi......
  • CF512D Fox And Travelling 题解--zhengjun
    计数好题。首先对于每个连通块独立考虑,最后合并答案。发现点数超过1的强连通分量一定删不掉。若连通块中存在点数超过1的强连通分量tarjan缩点之后,称这些点数超过1的强连通分量为关键点;那么两关键点之间的点也不能删;于是对于剩下的点直接dp即可,由于可删的子树......
  • 你省(福建)省队集训模拟赛题解
    Day5$\texttt{T1}$简要题意有两个正整数\(a<b\le10^9\),给出\(\dfrac{a}{b}\)的小数点后\(19\)位,要求还原\(a,b\),保证有解。solution一个科技:\(\texttt{Stern-Brocottree}(SBT)\),可以参考这个博客学习。先给出$O(n)$找的代码#include<bits/stdc++.h>#defineLL......
  • 洛谷-P9455 题解
    写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被Hack请和我说),一种正解二分。正文1最坏时间复杂度:\(\mathcal{O}(n+\logV)(V=10^9)\)这个做法是很简单的,在此不多讲。只需要二分超频电压mid即可,若当前mid可行,则令右边界缩小至mid,否则令左边界扩大至mid。......
  • 230226题解
    A数列题目描述给定一个长为\(n\)的数列\(A_1,A_2,…,A_n\)。给出\(q\)次询问,每次询问给定\(X\),请你回答至少需要多少次操作,能够让数列中的每个数都变成\(X\)。每次操作你可以选择数列中的一个数加\(1\)或者减\(1\)。询问之间相互独立。输入格式第一行两个整数\(n,q\)。第......
  • 题解 HDU5726【GCD】/ LGT353762【Soso 的最大公约数】
    Problem给你一个长为\(N(1\leqN\leq1\times10^5)\)的整数序列:\(a_{1},\cdots,a_{n}(0<a_{i}\leq1\times10^9)\)。有\(Q(1\leqQ\leq1\times10^5)\)次提问。每次提问有个范围\(l,r\),你需要计算出\(\gcd(a_{l},,a_{l+1},...,a_{r})\),并且统计数对\((l’,r’......
  • Codeforces Round 896 Div2 A-D题解
    CodeforcesRound896A.Politics这题问的是,给一些人的在n个议题的观点,然后你可以随意安排顺序,每个议题人多的赢,反对派会离开,问随便安排议题,最多留下多少人,包括我自己这个题刚开始愣了半天,但是想到,那只要把所有和我观点一致的给留下来不就行了???然后交上去就AC了ACCode#inclu......