首页 > 其他分享 >洛谷CF1473D

洛谷CF1473D

时间:2022-12-10 20:55:55浏览次数:44  
标签:CF1473D maxx 洛谷 minn sum last now mx

分析
题意:给定l,r,将1~l-1的符号于r+1~n的符号合并。
从左往右依次计算,求过程中最大值与最小值的差+1。
For example:
n=4 l=2 r=3 符号串为+-+-
则依次进行“+”“-”运算,原来为0,+1后为1,-1后为0
其中最大值为1,最小值为0,故输出2
算法
因n较大,考虑倍增算法。
用st表储值(f[i][j]中mx表示i~i+(1<<j)-1的最大值,mn表示最小值,sum表示当前数值)
对于每一次询问,我们可以先处理1~l-1段(O(log n)),再处理r+1~n段(O(log n))
时间复杂度(O(n log n+m log n))
AC Code
#include<bits/stdc++.h>
using namespace std;
struct xx{int mx,mn,sum;}f[200005][25];
int t,i,j,n,m,l,r;
int main(){
  scanf("%d",&t);
  while(t--){
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++){
      char ch=getchar();
      if(ch=='-')f[i][0].mx=f[i][0].mn=f[i][0].sum=-1;
      else f[i][0].mx=f[i][0].mn=f[i][0].sum=1;
    }
    for(i=1;i<=log2(n)+1;i++)
    for(j=1;j+(1<<i)-1<=n;j++){
      f[j][i].mx=max(f[j][i-1].mx,f[j][i-1].sum+f[j+(1<<(i-1))][i-1].mx);
      f[j][i].mn=min(f[j][i-1].mn,f[j][i-1].sum+f[j+(1<<(i-1))][i-1].mn);
      f[j][i].sum=f[j][i-1].sum+f[j+(1<<(i-1))][i-1].sum;
    }//较为简单的st表预处理
    for(i=1;i<=m;i++){
      scanf("%d%d",&l,&r);
      int now=1,last=0,maxx=0,minn=0;//last表示上一次运算完的结果,maxx表示最大值,minn表示最小值
      for(j=log2(n)+1;j>=0;j--){
        if(now+(1<<j)<l){
          maxx=max(maxx,last+f[now][j].mx);
          minn=min(minn,last+f[now][j].mn);
          last+=f[now][j].sum;
          now+=(1<<j);
        }//倍增跳跃到下一个点
      }
      if(now<l){maxx=max(maxx,last+f[now][0].mx);minn=min(minn,last+f[now][0].mn);last+=f[now][0].sum;}//处理1~l-1段
      now=r+1;
      for(j=log2(n)+1;j>=0;j--){
        if(now+(1<<j)<=n){
          maxx=max(maxx,last+f[now][j].mx);
          minn=min(minn,last+f[now][j].mn);
          last+=f[now][j].sum;
          now+=(1<<j);
        }//倍增跳跃到下一个点
      } 
      if(now<=n){maxx=max(maxx,last+f[now][0].mx);minn=min(minn,last+f[now][0].mn);last+=f[now][0].sum;}//处理r+1~n段
      printf("%d\n",maxx-minn+1);
    }
  }
}

标签:CF1473D,maxx,洛谷,minn,sum,last,now,mx
From: https://www.cnblogs.com/louzhengzhe2009/p/16972303.html

相关文章

  • 洛谷P8767 [蓝桥杯 2021 国 A] 冰山 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P8767​​鸣谢:这道题的顺利解决得到了​​7KByte​​大佬的大力帮助,在此再次表示感谢。首先,我的想法是这样的:使用一个spl......
  • 【LGR-(-16)】洛谷入门赛 #7 解题报告
    https://www.luogu.com.cn/contest/94670whk作业一堆没写完。打了\(20\)分钟就去写作业了......每道题全都没有用快读谔谔离开时的榜单八点多回来了,写了H题,又走了......
  • 洛谷P8872 莲子的物理热力学
    你可以在一次操作中将一个数变为全局最大值或最小值,问n个给定的数在m次操作后最小的极差是多少考虑将n个数排序,假设\(m\)次操作后,剩下来的数字的值域为\([l,r]\),那么......
  • 洛谷P8848 [JRKSJ R5] 1-1 B
    给定一个由\(1\)和\(-1\)序列\(a\),询问有多少个将\(a\)重排后的序列使得该序列的最大子段和最小化,称两个序列不同,当且仅当这两个序列有任意一个位置上的数不同考......
  • 洛谷月赛简单题目选做
    简单题目指黄+~蓝P5888传球游戏Easy考虑朴素dp,设\(dp[i][j]\),表示第\(j\)轮球在\(i\)手中的方案数,时间复杂度\(O(nm)\)。观察到如果两个人均不是\(1\)号......
  • 洛谷 P1957 口算练习题
        实现代码(原创):#include<stdio.h>#include<string.h>#include<stdlib.h>char*itoa(intvalue,char*str,intradix){staticchardig[]=......
  • 洛谷P2504聪明的猴子
    思路:最小生成树1#include<cstdio>2#include<cstdlib>3#include<iostream>4#include<cstring>5#include<cmath>6#include<algorithm>7#include<vecto......
  • 洛谷P1111修复公路
    思路:并查集1#include<cstdio>2#include<iostream>3#include<algorithm>4#include<math.h>5#include<vector>6#include<set>7usingnamespacestd;......
  • 【洛谷P8866】喵了个喵
    题目题目链接:https://www.luogu.com.cn/problem/P8866小E喜欢上了一款叫做《喵了个喵》的游戏。这个游戏有一个牌堆和\(n\)个可以从栈底删除元素的栈,任务是要通过游......
  • 洛谷 P1891 疯狂 LCM
    \(\text{lcm}\)不好处理,转化为\(\gcd\):\[n\sum_{i=1}^n\frac{i}{\gcd(i,n)}\]\(\gcd\)相关题目的套路——枚举因数:\[n\sum_{d|n}\sum_{i=1}^n\fracid[......