首页 > 其他分享 >CF997E Good Subsegments

CF997E Good Subsegments

时间:2023-12-31 16:34:27浏览次数:19  
标签:ch freopen 标记 int CF997E Good Subsegments && define

对于这一类析合树问题有简单的线段树扫描线做法:考虑一个长为 \(len\) 的区间内一定有 \(len-1\) 个数值相邻的对,于是每次新加一个数 \(a_i\) 可以考虑相邻的两个数的出现位置 \(p\),若 \(p\le i\) 就对 \([1,p]\) 区间加,表示左端点在 \([1,p]\) 的区间内多出一个相邻对

接下来的问题是一个线段树对历史最值求和的问题,可以设计两类标记,一个是 \(\text{maxcnt}\),另一个是对最值加 \(1\) 的标记,考虑如何合并标记序列,发现只有当父结点的 \(\max\) 与儿子相同时整个标记序列才是有贡献的,所以可以直接下传,不需要考虑顺序问题

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 500005
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
using namespace std;
int read(){
	int w=0,h=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')h=-h;ch=getchar();}
	while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
	return w*h;
}
struct MaxCnt{int max,cnt;};
MaxCnt operator+(MaxCnt x,MaxCnt y){
	MaxCnt res;res.max=max(x.max,y.max);
	res.cnt=x.cnt*(x.max==res.max)+y.cnt*(y.max==res.max);
	return res;
}
int n,q,p[N],ip[N],ans[N];
vector<pair<int,int>>que[N];
namespace SGT{
#define ls k<<1
#define rs k<<1|1
#define mid ((l+r)>>1)
	MaxCnt Max[N<<2];int Sum[N<<2],Tag[N<<2],Lzy[N<<2];
	void Pushup(int k){Max[k]=Max[ls]+Max[rs];Sum[k]=Sum[ls]+Sum[rs];}
	void Add(int k,int v){Sum[k]+=Max[k].cnt*v;Lzy[k]+=v;}
	void Update(int k,int v){Max[k].max+=v;Tag[k]+=v;}
	void Pushdown(int k,int l,int r){
		if(Tag[k])Update(ls,Tag[k]),Update(rs,Tag[k]),Tag[k]=0;
		if(Lzy[k]){
			if(Max[k].max==Max[ls].max)Add(ls,Lzy[k]);
			if(Max[k].max==Max[rs].max)Add(rs,Lzy[k]);
			Lzy[k]=0;
		}
	}
	void Build(int k,int l,int r){
		if(l==r)return void(Max[k]=(MaxCnt){l,1});
		Build(ls,l,mid);Build(rs,mid+1,r);Pushup(k);
	}
	void Modify(int k,int l,int r,int x,int y,int z){
		if(l>=x&&r<=y)return Update(k,z);
		Pushdown(k,l,r);
		if(x<=mid)Modify(ls,l,mid,x,y,z);
		if(mid<y)Modify(rs,mid+1,r,x,y,z);
		Pushup(k);
	}
	void Change(int k,int l,int r,int x,int y,int z){
		if(l>=x&&r<=y)return Max[k].max==z?Add(k,1):void();
		Pushdown(k,l,r);
		if(x<=mid)Change(ls,l,mid,x,y,z);
		if(mid<y)Change(rs,mid+1,r,x,y,z);
		Pushup(k);
	}
	int Query(int k,int l,int r,int x,int y){
		if(l>=x&&r<=y)return Sum[k];
		Pushdown(k,l,r);
		if(y<=mid)return Query(ls,l,mid,x,y);
		if(mid<x)return Query(rs,mid+1,r,x,y);
		return Query(ls,l,mid,x,y)+Query(rs,mid+1,r,x,y);
	}
}
using namespace SGT;
signed main(){
	n=read();Build(1,1,n);
	for(int i=1;i<=n;i++)ip[p[i]=read()]=i;
	q=read();
	for(int i=1,l,r;i<=q;i++)l=read(),r=read(),que[r].emplace_back(l,i);
	for(int i=1;i<=n;i++){
		if(p[i]>1&&ip[p[i]-1]<=i)Modify(1,1,n,1,ip[p[i]-1],1);
		if(p[i]<n&&ip[p[i]+1]<=i)Modify(1,1,n,1,ip[p[i]+1],1);
		Change(1,1,n,1,i,i);
		for(auto u:que[i])ans[u.second]=Query(1,1,n,u.first,i);
	}
	for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
	return 0;
}

标签:ch,freopen,标记,int,CF997E,Good,Subsegments,&&,define
From: https://www.cnblogs.com/pidan123/p/17937633

相关文章

  • 初中英语优秀范文100篇-043Is Television Good or Bad?看电视是好是坏?
    PDF格式公众号回复关键字:SHCZFW043记忆树1Moreandmorepeoplelikewatchingtelevision.翻译越来越多的人喜欢看电视简化记忆电视句子结构1"Moreandmorepeople"是主语,表示越来越多的人。2"like"是谓语,表示喜欢或愿意。3"watchingtelevision"是宾语,表示......
  • 初中英语优秀范文100篇-042Is It Good for Students to Play Video Games?学生玩游戏
    PDF格式公众号回复关键字:SHCZFW042记忆树1Videogameshavebecomemoreandmorepopularnow.翻译现在视频游戏变得越来越流行。简化记忆流行句子结构1主语(Subject):"Videogames"(电子游戏)是句子的主题,表示现在完成时态的承受者。2谓语(Predicate):"havebe......
  • ARC167D Good Permutation 题解
    ARC167D看到排列并且有\(i\getsa_i\),就可以直接建出图来,显然是若干个不相干的环。如果不求字典序最小,就可以直接不在同一个环中的\(i,j\)直接交换就可以了,因为它要求了最小化操作数。如果求字典序最小,直接从前往后扫一遍,可以用set维护不在这个环中且\(j>i\)的最小值,如果......
  • AtCoder Regular Contest 168 E Subsegments with Large Sums
    洛谷传送门AtCoder传送门尝试二分答案,问题变为要求恰好选\(x\)段\(\ges\),最大化选的段数。发现我们不是很会算段数的\(\max\),因为要求段不重不漏地覆盖\([1,n]\)。考虑给每个\(\ges\)段\([l,r]\)一个\(r-l\)的代价,于是变成了算代价的\(\min\)。此时不再要求......
  • 数据备份软件GoodSync
    为什么需要数据备份软件?重要的数据无价,而一块机械硬盘的理论使用寿命是5-10年。一块盘里的数据更改,希望能及时、正确,备份到另外一块硬盘里。只想备份更改,不想全盘备份。毕竟有的情况下会有动辄几十TB的数据。那能不能使用云服务?免费云服务的速度并不理想。部分资源可能会......
  • [ABC328F] Good Set Query 题解
    复习了一下边带权并查集板子。设\(d_{x}\)表示当前点到它所在连通块根节点的距离。合并点\(x\)和点\(y\)所在两个连通块时需要更新\(d\)。因为将\(x\)点所在连通块的根节点的父亲节点设为了\(y\)点所在连通块的根节点,所以有\(x\toy\toFind(y)=x\toFind(x)\to......
  • 初中英语优秀范文100篇-028How to Be a Good Internet User-如何成为一名合格的网民
    PDF格式公众号回复关键字:SHCZFW028记忆树1Withthedevelopmentofthetechnology,mostofusareabletousetheInternet.翻译随着科技的发展,我们大多数人都能够使用互联网。简化记忆互联网句子结构这句话的结构是:时间状语从句(Withthedevelopmentofthet......
  • 题解 CF1887E【Good Colorings】
    萌萌交互题。对网格图进行二分图建模,左部\(n\)个点表示每一行,右部\(n\)个点表示每一列。若格子\((i,j)\)被染成\(c\)色,就连接\((L_i,R_j,c)\)的边。由抽屉原理易证,在初始局面中至少有一个各边颜色均不同的偶环。获胜条件相当于存在一个各边颜色均不同的四元环。讨论......
  • [good]visual studio 2022 创建空的win32程序
    参考这个VS创建空的Win32程序-fenggwsx-博客园(cnblogs.com)   编译运行 ......
  • E. Good Triples
    首先假定已经找到abc符合题目条件。则我们假定a1,a2,a3...;b1,b2,b3...;c1,c2,c3...为abc各个位置上的数字,那么  a1 a2 a3  b1 b2 b3+c1 c2 c3----------------  x1  x2  x3又由digsum等式可知a1+b1+c1+...=x1+x2+x3。那么我们根据竖式不难发......