首页 > 其他分享 >CF 1980 F1 Field Division (easy version) (*1900)

CF 1980 F1 Field Division (easy version) (*1900)

时间:2024-06-17 18:43:17浏览次数:19  
标签:Division const 1980 F1 int 横坐标 喷泉 col define

CF 1980 F1 Field Division (easy version) (*1900)

题目链接

题意

有一个大小为 \(n \times m\) ($2 \le n,m\le 10^9 $)的矩形。其中有 \(k\) 个喷泉,你现在可以从左侧或者上侧任意一个不是喷泉的单元格出发,每次只能移向相邻的下或者右的单元格。直到走到矩阵的右侧或者底侧结束。并且中途不能经过任何一个喷泉。走过的路径将整个矩阵分成了两个部分。请你求出左下这一部分的面积最大值(包含走过的单元格)。并且回答对于每个喷泉,如果允许经过,面积是否会增大。

思路

显然,我们每次都贴着喷泉去走,面积才会最大。我们可以把面积根据喷泉的位置划分成一段一段来求解。

容易发现只有后面的喷泉的横坐标大于前面的横坐标才会拐弯。那么我们可以维护每一列的最大横坐标。

按照纵坐标顺序枚举所有喷泉的纵坐标计算即可。因为范围很大,那么用map维护即可。

接着看第二个问题,我们发现只有满足当前喷泉的横坐标是当前列的横坐标最大值并且大于前一个喷泉对应的

最大横坐标即可。这里开了一个st数组来维护前一个喷泉对应的最大横坐标。

代码

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;

void Showball(){
   int n,m,k;
   cin>>n>>m>>k;
   vector<PII> a(k+1);
   map<int,int> rmax;
   vector<int> col;
   for(int i=1;i<=k;i++){
      int x,y;
      cin>>x>>y;
      a[i]={x,y};
      col.pb(y);
      rmax[y]=max(rmax[y],x);
   }
   sort(all(col));
   int len=unique(all(col))-col.begin();
   LL ans=0;
   int cur=0;
   map<int,int> st;
   int pre=1;
   for(int i=0;i<len;i++){
      int y=col[i];
      ans+=1LL*(y-pre)*(n-cur);
      st[y]=cur;
      cur=max(cur,rmax[y]);
      pre=y;
   }
   ans+=1LL*(m-pre+1)*(n-cur);
   cout<<ans<<endl;
   for(int i=1;i<=k;i++){
      auto [x,y]=a[i];
      if(x==rmax[y]&&x>st[y]) cout<<"1 ";
      else cout<<"0 ";
   }
   cout<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

标签:Division,const,1980,F1,int,横坐标,喷泉,col,define
From: https://www.cnblogs.com/showball/p/18253014

相关文章

  • CF1392H ZS Shuffles Cards
    ZSShufflesCards若我们取到了鬼牌则会游戏重开,这是离谱的有\(E(ans)=E(重开多少次)E(重开一次摸的牌数)\)\(E(重开一次摸的牌数)=\frac{n}{m+1}+1\)考虑每张数字牌在某一次被摸的概率\(P(x)=\frac{1}{m+1}\),因为我们只需考虑所有鬼牌与那一张数字牌的相对位置\(E(...)=......
  • 针对F1和F3群体的基因定位新方法
    最近国人有几个新的基因定位方法发表,记录下备忘。MolPlant|中国农科院蔬菜所开发异交物种基因高效定位的新算法工具OcBSA经典的基因位点快速定位方法BulkedSegregantAnalysis(BSA,集群分离分析法)具有适用范围广、实验成本低的优势,但现有BSA算法(例如SNPindex,ED,Gvalue)均是基......
  • 从CF1879D学习一类区间贡献题思路
    https://codeforces.com/contest/1879/problem/D关键在于互换两个\(\sum\)​的顺序一般像这样计算所有子区间的式子,如果要优化成接近线性,有一种可行思路是把注意力放在右端点,通过不断移动右端点,在移动的时候利用前面的统计结果算出移动右端点后的结果,从而得出所有子区间的答......
  • CF1515G
    CF1515GPhoenixandOdometers首先进行缩点,对于一个点,与它不在同一连通分量的点无法形成回路,所以对每个连通分量分别计算。假设一个点\(u\),有两个长度为\(a\)和\(b\)的环,那么就相当于找两个非负整数\(x\)和\(y\),使得\(ax+by=w\),其中\(w\)为题中的路径长,根据裴蜀定理......
  • 「杂题乱刷」CF1985F
    代码恢复训练2024.6.13.题目链接CF1985F(CF)CF1985F(luogu)解题思路由于一个回合可以用所有无冷却的技能,因此我们对于技能肯定是能用就用的。进而推出答案具有单调性。直接二分答案即可,注意二分边界问题,这里我开了__int128来避免这个问题。参考代码点击查看代码#i......
  • CF1204E = 998244853.
    CF1204E=998244853.Natasha,SashaandthePrefixSumsNaCly_Fish最喜欢的数字是\(n\)和\(1\);\(\mathsfE\color{red}\mathsf{ntropyIncreaser}\)最喜欢\(m\)和\(-1\)。有一天,她们在一起写出了一个长度为\(n+m\),有\(n\)个\(1\)和\(m\)个\(-1\)的序列\(......
  • YOLO 模型的评估指标——IOU、Precision、Recall、F1-score、AP、mAP、
    一、置信度是什么?置信度用于评估模型对检测结果的信心程度下图中,绿色框A表示GroundTruth,也称GT,GT就是正确的标注(人工)二、IOU与TP、FP、FNiou:表示预测的边界框(或分割区域)与真实边界框(或分割区域)之间的交集与并集之间的比值。阈值:根据实际情况可调节IOU=0.5如果预......
  • 【STM32F1例程2】GPIO外部中断输入
    1.实验说明无需连外部杜邦线,下载程序,全速运行,按右边按键看到LEDD1(PB4引脚驱动)亮暗能变化一次2.主要代码先上main.c#include"delay.h"#include"sys.h"//外部中断0配置,PA0脚产生外部中断是外部中断0voidEXTI0_Config(void){ EXTI_InitTypeDefEXTI_InitStructur......
  • 【STM32F1例程3】ADC实验
    1.实验说明 PA4口作为ADC采集口,PA4口接地或者接3.3V。下载运行程序,PA4口接地,会发现VolDta值为0,然后把PA4口接3.3V,会发现VolDta值为33002.主要程序直接上main.c#include"delay.h"#include"sys.h"//ADC配置,ADC1通道4voidADC_Config_Init(void){ ADC_InitTypeDef......
  • CF1984 记录
    吐槽真跟上次说的一样打一场掉一场了,最近CF+AT加起来打了四场全部掉一车,我都不知道到底是我晚上状态很差还是纯菜,就比如这场D写了一车分讨最后还是挂细节,B编了个离谱做法但是漏了一堆case,本来以为也是细节问题今天一看还是假。不过就算这次比赛状态好可能还是只能到E,我应......