首页 > 其他分享 >CF1473D 题解

CF1473D 题解

时间:2023-04-13 18:36:48浏览次数:56  
标签:CF1473D ch puts int 题解 register define

题目传送门

题目分析

线段树、前缀和、\(\text{ST}\) 表题解都有了,我补一发猫树题解吧。

由于每次操作只能将大小改变成跟原来差 \(1\),所以只需要知道这段操作中的最大值和最小值,最后所求的答案的范围就被卡住了。对于每一次操作,我们把操作序列拦腰斩断,那么分别求两边的范围,最后减去重复的部分即可。

求最小值最大值部分可以用猫树维护,注意猫树空间要额外再开大一些。

贴上代码

#include<bits/stdc++.h>
// #define int long long
#define debug puts("Shiina_Mashiro_kawaii")
#define ok puts("Yes")
#define no puts("No")
#define inf 1e9
using namespace std;
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;
}
const int maxn=4e5+5;
int n,m;
int lmin,lmax,rmin,rmax,ans;
int a[maxn],b[maxn];
int lg[maxn<<2];
string s;
struct cat_tree1{
    int cat[25][maxn];
    void init_tree(int o,int l,int r){
        int mid=(l+r)>>1;
        for(register int i=mid-1;i>=l;--i) cat[o][i]=max(cat[o][i+1],a[i]);
        for(register int i=mid+2;i<r+1;++i) cat[o][i]=max(cat[o][i-1],a[i]);
    }
    void build_tree(int o){
        int n=1;while(n<o) n<<=1;
        for(register int i=o;i<n;++i) a[i]=0;
        for(register int j=1,cnt=0;j<=n;j<<=1,++cnt){
            for(register int i=0;i<n;++i) cat[cnt][i]=a[i];
            for(register int i=0;i<n;i+=j) init_tree(cnt,i,i+j-1); 
        }
    }
    int query(int l,int r){
        int o=lg[l^r];
        if(l==r) return cat[o][l];
        else return max(cat[o][l],cat[o][r]);
    }
}ct1;
struct cat_tree2{
    int cat[25][maxn];
    void init_tree(int o,int l,int r){
        int mid=(l+r)>>1;
        for(register int i=mid-1;i>=l;--i) cat[o][i]=min(cat[o][i+1],b[i]);
        for(register int i=mid+2;i<r+1;++i) cat[o][i]=min(cat[o][i-1],b[i]);
    }
    void build_tree(int o){
        int n=1;while(n<o) n<<=1;
        for(register int i=o;i<n;++i) b[i]=0;
        for(register int j=1,cnt=0;j<=n;j<<=1,++cnt){
            for(register int i=0;i<n;++i) cat[cnt][i]=b[i];
            for(register int i=0;i<n;i+=j) init_tree(cnt,i,i+j-1); 
        }
    }
    int query(int l,int r){
        int o=lg[l^r];
        if(l==r) return cat[o][l];
        else return min(cat[o][l],cat[o][r]);
    }
}ct2;
inline void init(){
    n=read();m=read();cin>>s;s=" "+s;
    for(register int i=1;i<=n;++i){
    	if(s[i]=='+'){
    		a[i]=a[i-1]+1;b[i]=b[i-1]+1;
    	}
    	else{
    		a[i]=a[i-1]-1;b[i]=b[i-1]-1;
    	}
    }
    int len=2;while(len<n) len<<=1;
    len<<=1;
    for(register int i=1;i<=len;++i) lg[i]=lg[i>>1]+1;
    ct1.build_tree(n+1);ct2.build_tree(n+1);
}
inline void solve(){
	init();
	while(m--){
		int l=read(),r=read();lmin=lmax=rmin=rmax=0;
		if(l==1&&r==n){
			puts("1");continue;
		}
		if(l>1){
			lmax=max(ct1.query(1,l-1),0);
			lmin=min(ct2.query(1,l-1),0);
		}
		if(r<n){
			rmax=ct1.query(r+1,n)-(a[r]-a[l-1]);
			rmin=ct2.query(r+1,n)-(a[r]-a[l-1]);
		}
		if(lmax<rmin||rmax<lmin) ans=lmax-lmin+rmax-rmin+2;
        else if(lmax<=rmax) ans=(lmax-lmin)+(rmax-rmin)-lmax+max(lmin,rmin)+1;
        else ans=(lmax-lmin)+(rmax-rmin)-rmax+max(lmin,rmin)+1;
        printf("%d\n",ans);
	}
}
int main(){
    int T=read();
    while(T--) solve();
}

标签:CF1473D,ch,puts,int,题解,register,define
From: https://www.cnblogs.com/yizhixiaoyun/p/17315972.html

相关文章

  • CF1758D 题解
    前言题目传送门!更好的阅读体验?用一种非常麻烦的做法把自己写自闭了,和题解区不一样,但是方法困难很多。思路代码属于混乱邪恶了,凑合着看看。#include<iostream>#include<cstdio>#include<cmath>usingnamespacestd;intn,ans[300005];longlongcalc(){ longlo......
  • ubuntu 20.04 基于docker快速搭建中文 的一些问题解决 Utilization of discoverer pro
    1.Utilizationofdiscovererprocessesover75%解决办法问题状态如下zabbixserver在开启Discovery功能后,zabbixweb页面报警提示:“Zabbixserver:Ulitizationofdiscovererprocessesover75%”。原因:每个discovery任务占用一个discovery进程,但是zabbixserver默认只配置了一......
  • scikit-learn 中 Boston Housing 数据集问题解决方案
    scikit-learn中BostonHousing数据集问题解决方案在部分旧教程或教材中是sklearn,现在【2023】已经变更为scikit-learn作用:开源机器学习库,支持有监督和无监督学习。它还提供了用于模型拟合、数据预处理、模型选择、模型评估和许多其他实用程序的各种工具。安装pipinsta......
  • 题解:C Future
    题目:给n个范围,第i个范围选pi,然后定义特征值k=p1+p2+...+pn。这次的开心度就是A(k%m)。m是给的一个数组A,长度为m。 要求:  就是个全排列组合的问题,找规律。 举个例子,有n个礼物,分别是(L1,R1)(L2,R2)(Ln,Rn)每个区间取个数然后相加,所有出现的结果,其实就是A[L1+L2+........
  • [ARC127E] Priority Queue 题解
    首先我们每次加入的数必定是一个\(1\sima\)的排列,但从排列角度考虑的话非常复杂,因为\(s\)是一个集合。所以我们考虑最后能剩下哪些数。考虑最后剩下的集合为\(\{a_i\}\),其中\(a_i<a_{i+1}\),显然这个集合里面的元素个数为\(A-B\)。那么我们会发现一件事情:我们按上升序依......
  • Grid++Report 锐浪报表开发常见问题解答集锦
    Grid++Report锐浪报表开发常见问题解答集锦,锐浪报表报表对VBAccessC#Delphi支持都非常好,也可用于BS架构。Grid++Report适用于C/S报表与WEB报表(B/S报表)开发桌面报表与WEB报表共享相同的开发知识与资源,大大提高报表开发效率。另特别说明一点,在Access中使用Grid++Report锐浪......
  • 【BUG】ExtJS 的Tab Reorder 插件持续更新布局问题解决办法 (Solution to layout issue
    更新记录2023年4月13日初始化。ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html问题不停的拖动tab栏,会不断更新布局。Draggingthetabbarcontinuouslywillupdatethelayoutconstantly.解决办法进入ExtJS包,打开ux目录下的BoxReorderer.js文件,找......
  • abc247_f Cards 题解
    Cards题意有\(N\)张卡片,每张卡片上都写有两个数字,第\(i\)张卡片上的数字分别为\(P_i,Q_i\)。同时,\(P=(P_1,P_2,\dots,P_N)\)和\(Q=(Q_1,Q_2,\dots,Q_N)\)都是\((1,2,\dots,N)\)的全排列。我们需要在\(N\)张卡片中选出一些卡片,并且\(1,2,\dots,N......
  • 2020计蒜之道预赛第二场-群星 题解
    题目描述蒜头君是一个P社玩家,每天从计蒜客下班回家之后的第一件事情就是打开《群星》,开始继续他的第四天灾之旅。这次他把注意力集中到了银河市场里面。银河市场里面商品的价格都通过以下公式计算:$$P=B*basePrice/S$$$$price=\displaystyle\frac{buy}{sell}*base......
  • 问题解决
    遇到的问题1.解决方法:将@RequestParam改为@PathVariable:@RequestParam接收的是?参数,@PathVariable接收直接参数2.Stream方法报红解决办法:jdk版本改为8版本及以上3.解决方法:导入以下依赖<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifac......