首页 > 其他分享 >luogu2839题解

luogu2839题解

时间:2023-11-29 19:23:23浏览次数:48  
标签:p2 p1 luogu2839 int 题解 sum tr id

[国家集训队] middle

题目分析

代码如下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN=2e4+10;
int x,n,Q,a[MAXN],q[6],root[MAXN],b[MAXN],tot;
vector<int> locp[MAXN];
struct SegmentTreeNode{
	int l,r,lson,rson;
	int sum,lsum,rsum;
}tr[MAXN*25];
int newnode(){
	return ++tot;
}
void pushup(int id){
	tr[id].sum=tr[tr[id].lson].sum+tr[tr[id].rson].sum;
	tr[id].lsum=max(tr[tr[id].lson].lsum,tr[tr[id].lson].sum+tr[tr[id].rson].lsum);
	tr[id].rsum=max(tr[tr[id].rson].rsum,tr[tr[id].lson].rsum+tr[tr[id].rson].sum);
}
int build(int l,int r){
	int p=newnode();
	tr[p].l=l;tr[p].r=r;
	if(l==r){
		tr[p].lsum=tr[p].rsum=tr[p].sum=1;
		return p;
	}
	int mid=(l+r)>>1;
	tr[p].lson=build(l,mid);
	tr[p].rson=build(mid+1,r);
	pushup(p);
	return p;
}
void change(int p1,int &p2,int loc){//默认修改为-1 
	p2=newnode();
	tr[p2].l=tr[p1].l;tr[p2].r=tr[p1].r;
	if(tr[p1].l==tr[p1].r){
		tr[p2].lsum=tr[p2].rsum=tr[p2].sum=-1;
		return;
	}
	int mid=(tr[p1].l+tr[p1].r)>>1;
	if(loc<=mid){
		change(tr[p1].lson,tr[p2].lson,loc);
		tr[p2].rson=tr[p1].rson;
	}else{
		tr[p2].lson=tr[p1].lson;
		change(tr[p1].rson,tr[p2].rson,loc);
	}
	pushup(p2);
}
SegmentTreeNode query(int p,int l,int r){
	if(tr[p].l==l&&tr[p].r==r)return tr[p];
	if(r<=tr[tr[p].lson].r)return query(tr[p].lson,l,r);
	else if(tr[tr[p].rson].l<=l)return query(tr[p].rson,l,r);
	else{
		SegmentTreeNode ln=query(tr[p].lson,l,tr[tr[p].lson].r),rn=query(tr[p].rson,tr[tr[p].rson].l,r),rt;
		rt.lsum=max(ln.lsum,ln.sum+rn.lsum);
		rt.rsum=max(ln.rsum+rn.sum,rn.rsum);
		rt.sum=ln.sum+rn.sum;
		return rt;
	}
}
int read(){
	int f=1,x=0;
	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 f*x;
}
int main(){
	n=read();
	for(int i=0;i<n;++i){
		b[i]=a[i]=read();
	}
	sort(b,b+n);
	int bn=unique(b,b+n)-b;
	for(int i=0;i<n;++i){
		locp[lower_bound(b,b+bn,a[i])-b].push_back(i);
	}
	root[0]=build(0,n-1);
	for(int i=1;i<bn;++i){
		root[i]=root[i-1];
		for(int j:locp[i-1]){
			change(root[i],root[i],j);
		}
	}
	Q=read();
	while(Q){
		--Q;
		for(int i=0;i<4;++i){
			q[i]=(read()+x)%n;
		}
		sort(q,q+4);
		int l=0,r=bn-1;
		while(l<r){
			int mid=(l+r+1)>>1;
			int mval=query(root[mid],q[0],q[1]).rsum;
			if((q[1]+1)<=(q[2]-1))mval+=query(root[mid],q[1]+1,q[2]-1).sum;
			mval+=query(root[mid],q[2],q[3]).lsum;			if(mval>=0)l=mid;
			else r=mid-1;
		}
		x=b[l];
		printf("%d\n",b[l]);
	}
	return 0;
}

标签:p2,p1,luogu2839,int,题解,sum,tr,id
From: https://www.cnblogs.com/LiJoQiao/p/17865645.html

相关文章

  • CF1827C Palindrome Partition 题解
    题目链接点击打开链接题目解法首先考虑一个朴素的\(dp\)令\(f_i\)表示以\(i\)结尾的合法子串的个数为了不重不漏,我们令\(le_i\)表示以\(i\)为右端点,离\(i\)最近的偶回文串的左端点,然后不难得到转移为\(f_i=f_{le_i-1}+1\)为什么不会漏?考虑以\(i\)为右端点,且比......
  • NOIP2000提高组真题解析
    NOIP2000提高组真题解析第一题进制转换题目链接解析首先,我们知道对于10进制数x转2进制数,使用的算法是:求出x%2令x=x/2不断执行1,2,直至x为0,然后倒序输出步骤1的结果。一般可以用数组存步骤1的结果倒序输出或者使用dfs回溯回来再输出。对于负数的情况,比如\(-7=1*(-2)^3......
  • ISCTF 逆向题解
    ISCTF逆向题解用一个晚上的时间看了看ISCTF,有的题还蛮难的(毕竟得嘎嘎猜出题人想法)CrackMewinhex打开exe,修改标识头PFX为UPX然后放进UPXshell里面试试脱了,放进ida,直接反编译得到flagEasyReexeinfo看看这个是什么64位,放进ida反编译得到一段很清晰的逻辑反转+异或+单表代换。。。......
  • ICPC2022Xian L Tree 题解
    LinkICPC2022XianLTreeQuestion给出一个根为\(1\)的树,需要将树分成几个块每个块,一个块中的节点需要满足以下条件中的一个:对于所有的\(u,v\inS,\u\neqv\),满足\(u\insubtree(v)\)或\(v\insubtree(u)\)对于所有的\(u,v\inS,\u\neqv\),满足\(u\not......
  • [ABC277G] Random Walk to Millionaire 题解
    题目链接点击打开链接题目解法首先\(O(n^3)\)的\(dp\)是显然的,令\(f_{i,j,k}\)为第\(i\)步在\(j\),当前等级为\(k\)的\([i,n]\)步获得钱数的期望,转移枚举出边即可一个很妙的优化是:贡献都是\(k^2\)的形式,所以我们考虑维护\(k\)的\(0,1,2\)次幂,即\(\sum,\sum......
  • CF1900D - Small GCD 题解
    1900D-SmallGCD给定序列\(A\),定义\(f(a,b,c)\)为\(a,b,c\)中最小的次小的数的\(\gcd\),求:\[\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=j+1}^nf(a_i,a_j,a_k)\]题解目前来说有两种方法,都十分有启发意义,但是有共同的开头。考虑到\(A\)的顺序实际上没有......
  • SP19543 GSS8 - Can you answer these queries VIII 题解
    更好的阅读体验SP19543GSS8-CanyouanswerthesequeriesVIIIfhq+二项式定理。提供一个不太一样的思路。默认下标从\(1\)开始。首先插入删除,区间查询,想到可以平衡树维护或者离线下来做线段树。本文中是用的是fhq,好写一些。\(k\)非常的小,考虑对于每一个\(k\)的答......
  • 服务器数据库A的备份恢复到服务器B后出现问题解决
    消息10314,级别16,状态11,第2行尝试加载程序集ID65536时,Microsoft.NETFramework出错。服务器可能资源不足,或者程序集可能不受信任,PERMISSION_SET=EXTERNAL_ACCESS或UNSAFE。如上错误提示,解决办法: alterdatabasedatabasenamesettrustworthyon还有更改数据库......
  • 【题解】CF1550E Stringforces
    标签:DP\(B^+\)阅读须知:本题解较为详细地讲述的该题解法的思路和来龙去脉,但篇幅较长,请耐心阅读。Step1从题面获取信息我们考虑,因为最大值最小,所以我们首先想到二分答案。然后我们又看到\(k\leq17\)这个限制,所以会想到可能是关于一个\(2^k\)之类的复杂度。以上就是我......
  • ABC330 E Mex and Update 题解
    LinkABC330EMexandUpdateQuestion给一个数组\(a\),有\(Q\)次修改每次把\(a_i\)改成\(x\)问每次修改后,不在\(a\)数组中的最小非负数时多少Solution记录每个\(a_i\)出现的次数\(num\)每个修改操作可以看成时先删除,后添加用set维护为\(num_x=0\)的\(x\)......