首页 > 其他分享 >题解 CF1202C

题解 CF1202C

时间:2023-07-17 21:55:23浏览次数:30  
标签:int 题解 ll 最小值 l2 CF1202C 最大值

不错的题,需要点思维和码力。

容易发现,左右和上下互不影响,可以分开处理,这里以左右举例。

定义向左走一格 \(-1\),向右走一格 \(+1\),求个前缀和找到最大值和最小值,和出现最值的最早时间与最晚时间。定义为 \(l,r,l2,r2\)。

只有当我们放了一个 A 或 D 使得所有最大值 \(-1\) 且最小值不变,或最小值 \(+1\) 且最大值不变时,面积才会减小。

假如我们要让最大值 \(-1\),那么当且仅当 \(r<l2\) 且在坐标 \((r,l2)\) 中存在一个数不等于 \(r\) 对应的值时满足。原理很简单,不过多解释。

其他情况同理。

复杂度 \(O(n)\)。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll T,n,sum[N],sum2[N];
string s;
bool chk(int l,int r){
  for(int i=l+1;i<=r;++i)if(sum[i]!=sum[l])return true;
  return false;
}
bool chk2(int l,int r){
  for(int i=l+1;i<=r;++i)if(sum2[i]!=sum2[l])return true;
  return false;
}
int main(){
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>T;
  while(T--){
    cin>>s;n=s.size();s="."+s;
    ll ma=0,mi=0,ma2=0,mi2=0;
    for(int i=1;i<=n;++i){
      sum[i]=sum[i-1];
      if(s[i]=='A')--sum[i];
      if(s[i]=='D')++sum[i];
      ma=max(ma,sum[i]);mi=min(mi,sum[i]);
      sum2[i]=sum2[i-1];
      if(s[i]=='S')--sum2[i];
      if(s[i]=='W')++sum2[i];
      ma2=max(ma2,sum2[i]);mi2=min(mi2,sum2[i]);
    }
    int l=1e9,r=-1e9,l2=1e9,r2=-1e9;
    for(int i=0;i<=n;++i){
      if(sum[i]==mi)l=min(l,i),r=max(r,i);
      if(sum[i]==ma)l2=min(l2,i),r2=max(r2,i);
    }
    ll tot=(ma2-mi2+1)*(ma-mi+1),ans=tot;
    if((l>r2||r<l2)&&(chk(r2,l-1)||chk(r,l2-1)))ans=min(ans,tot-(ma2-mi2+1));
    l=l2=1e9;r=r2=-1e9;
    for(int i=0;i<=n;++i){
      if(sum2[i]==mi2)l=min(l,i),r=max(r,i);
      if(sum2[i]==ma2)l2=min(l2,i),r2=max(r2,i);
    }
    if((l>r2||l2>r)&&(chk2(r2,l-1)||chk2(r,l2-1)))ans=min(ans,tot-(ma-mi+1));
    cout<<ans<<endl;
  }
  return 0;
}

标签:int,题解,ll,最小值,l2,CF1202C,最大值
From: https://www.cnblogs.com/HQJ2007/p/17561360.html

相关文章

  • 题解 P8338 [AHOI2022] 排列
    恶心题。每次操作,相当与把第\(i\)个数置换到\(p_i\),于是可以连边。因为\(i\)和\(p_i\)互不相同,所以对于每一个点,有且仅有一条出边和一条入边,即若干个简单环。那么最少操作\(\operatorname{lcm}(a_1,a_2,a_3...a_{x-2},a_{x-1},a_x)\)次点会都回到原位。其中\(a_i\)......
  • 题解 CF840C On the Bench
    这是一篇简洁易懂的良心题解,提供了多种做法。对于两个数\(x,y\),定义\(x=n^2\cdottx,y=m^2\cdotty\)。如果\(x\cdoty\)为平方数,则说明\(tx=ty\)。所以我们可以将每个数除去其平方因子,比较相邻两数是否相等即可。F1:定义\(f_{i,j,k}\)为插入\(i\)个数、有\(j\)对......
  • 题解 P3803 【模板】多项式乘法(FFT)
    感觉题解区不是写的太高深,就是写的太高深。所以给初中、小学和幼儿园的萌新准备一篇简单易懂的良心题解~前置知识一、多项式的系数表示法和点值表示法。\(A(x)=\sum\limits_{i=0}^{n-1}a_i\cdotx^i\)系数:\((a_0,a_1,a_2...a_{n-2},a_{n-1})\)。点值:\((x_0,y_0),(x_1,y_1)...(......
  • 题解 CF41D
    基础DP题。定义\(f_{i,j,k}\)表示从第一行走到\((i,j)\),且数字总和模\(p\)等于\(k\)。转移方程为:\[f_{i+1,j-1,(k+a_{i+1,j-1})\bmodp}=\max(f_{i,j,k}+a_{i+1,j-1})\]\[f_{i+1,j+1,(k+a_{i+1,j+1})\bmodp}=\max(f_{i,j,k}+a_{i+1,j+1})\]同时还需要定义\(g_{i,j......
  • 题解 P6091 【模板】原根
    题解太高深,自己整理一份。阶的定义:若\(\gcd(a,m)=1\),则使\(a^l\equiv1\pmod{m}\)的最小的\(l\)称为\(a\)关于模\(m\)的阶,记为\(\operatorname{ord}_ma\)。阶的性质:根据欧拉定理,\(a^{\varphi(m)}\equiv1\pmod{m}\),所以\(\operatorname{ord}_ma\mid\varphi(m)\)......
  • 题解 CF417D
    \(m\le20\),状压DP。首先可以根据每个人的\(k\)从小到大排序。定义\(f_{i,j}\)表示考虑到第\(i\)个人,完成了\(j\)状态的题目,不考虑显示器所需的最小价格。转移显然为\(f_{i,j|s_i}=\min(f_{i-1,j}+x_i)\)。最终答案为\(ans=\min\limits_{i=1}^{n}f_{i,S}+b\cdotk_......
  • 题解 CF985E
    贪心+DP。先从小到大排序。定义\(f_i\)表示序列\([1,i]\)能否分组。转移为\(f_i|=f_j[a_i-a_j\led,j\lei-k+1]\)。右区间可以直接算出来,左区间可以二分或根据单调性弄个指针。定义\(sum_i=\sum\limits_{t=1}^{i}f_t\),前缀和减一下判断是否为正即可。复杂度\(O(n\lo......
  • 题解 P4815 [CCO2014] 狼人游戏
    看题目限制,可以发现如果将机器人作为点,指控和保护关系作为边,可以建出一个森林,就下来就是传统的树形背包了。设\(f_{i,j,0/1}\)表示当前点为\(i\),子树内有\(j\)个狼人,当前点是否为狼人的方案数。初始化:\(f_{u,0,0}=f_{u,1,1}=1\)当前点为狼:指控:\(f_{u,j,1}=f_{u,j-k,......
  • 题解 [ABC276F] Double Chance
    很容易想到分类。我们可以把\(1\)到\(i-1\)的球分为两类,一类是权值小于\(val_i\),另一类是权值大于\(val_i\)。对于第一类,\(sum\)加上小于\(val_i\)的球的个数乘以\(val_i\)。对于第二类,\(sum\)加上所有大于\(val_i\)的球的权值。这显然可以用两个树状数组维护。......
  • 题解 P5426 [USACO19OPEN]Balancing Inversions G
    来一篇简单易懂的良心题解。由于数值不是\(0\)就是\(1\),我们可以考虑将逆序对的统计方式化简。以左区间为例,设\(x\)为\(1\)的个数,\(p_i\)为第\(i\)个\(1\)的坐标,则逆序对个数为\(\sum\limits_{i=1}^{x}n-p_i-(x-i)\)。也就是\((n-x)\cdotx+\frac{x\cdot(x+1)}{......