CF1980F1 F2 Field Division

news/2024/9/19 19:16:33/文章来源:https://www.cnblogs.com/Oistream/p/18387608

前言

纪念一下独立做出来的 \(2400\) 的题

Easy version

思路

先说 \(Easy\) 版本的

我们走路的方式只有可能是这种样子:

(出处:luogu user FiraCode)
不想手绘图了

即对列排序后,所形成的一个行编号上升的序列

所以 \(Easy\) 就很简单了,对于每一列的最大值,如果大于当前前缀最大值,则它就有贡献

但是如何求 如果鲍勃没有给爱丽丝任何喷泉,那么爱丽丝可以拥有的地块的最大面积 呢?

观察每两个有贡献的点之间的差别,发现其实就是这两个点围成的矩阵及其下方的整个区域

形象化地说,设 \(lx\) 为左边点的行编号,\(ly\) 为左边点的列坐标,\(ry\) 为右边点的列坐标

则贡献为 \([n-(lx+1)+1] \times (ry-ly)\) (可以结合样例给的图理解)

注意最后一个有贡献的点后面的列的贡献需要在最后加一下

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
struct node
{int x,y;int id;bool operator <(const node &o)const{if(y==o.y) return x<o.x;return y<o.y;}
}a[N];
int mx[N];
int ans[N];
signed main()
{int _;cin>>_;while(_--){int n,m,k;cin>>n>>m>>k;for(int i=1;i<=k;i++){scanf("%lld%lld",&a[i].x,&a[i].y);a[i].id=i;ans[i]=0;}sort(a+1,a+1+k);for(int i=1;i<=k;i++) mx[i]=max(mx[i-1],a[i].x);int w=1;a[0].y=1;long long pu=0;int l=1;int r=1; for(int i=1;i<=k;i++){int j=i;while(j<=k&&a[j].y==a[i].y) j++;if(a[j-1].x>mx[i-1]){ans[a[j-1].id]=1;pu+=(n-l+1)*(a[i].y-r);r=a[i].y;l=a[j-1].x+1;} i=j-1;}pu+=(m-r+1)*(n-l+1);printf("%lld\n",pu);for(int i=1;i<=k;i++) printf("%lld ",ans[i]);puts("");}
}

hard version

思路

首先,请确保你已经阅读了 \(Easy\) 版本

然后困难版本让你求如果可以包含当前温泉,问会增加多少贡献

一个重要性质,对于当前贡献点的下一个贡献点,如果去掉了当前贡献点,则下一个贡献点及其后面产生的贡献是不变的

所以对于中间的区域,直接暴力更新即可,因为每个温泉只会被遍历 \(1\) 次,所以复杂度 \(O(n)\)

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
struct node
{int x,y;int id;bool operator <(const node &o)const{if(y==o.y) return x<o.x;return y<o.y;}
}a[N];
int mx[N];
int ans[N];
int id[N];
int sum[N];
signed main()
{int _;cin>>_;while(_--){int n,m,k;cin>>n>>m>>k;for(int i=0;i<=k+5;i++){a[i]={0,0,0};ans[i]=0;id[i]=0;mx[i]=0;sum[i]=0;}for(int i=1;i<=k;i++){scanf("%lld%lld",&a[i].x,&a[i].y);a[i].id=i;}a[k+1]={0,0,0};sort(a+1,a+1+k);for(int i=1;i<=k;i++){if(a[i].x>mx[i-1]){mx[i]=a[i].x;id[i]=i;}else{mx[i]=mx[i-1];id[i]=id[i-1];}}int w=1;a[0].y=1;long long pu=0;int l=1;int r=1; for(int i=1;i<=k;i++){int j=i;while(j<=k&&a[j].y==a[i].y) j++;if(a[j-1].x>mx[i-1]){ans[a[j-1].id]=1;pu+=(n-l+1)*(a[i].y-r);sum[j-1]=pu;r=a[i].y;l+=a[j-1].x-mx[i-1];} i=j-1;}pu+=(m-r+1)*(n-l+1);r=1;l=1;int pre=0;for(int i=1;i<=k;i++){if(!ans[a[i].id]) continue;ans[a[i].id]=sum[pre];int mxx=l-1;if(a[i-1].y==a[i].y&&a[i-1].x>mxx){ans[a[i].id]+=(n-l+1)*(a[i-1].y-r);mxx=a[i-1].x; l=a[i-1].x+1;r=a[i-1].y;pre=i-1;}int f=0;for(int j=i+1;j<=k;j++){if(a[j+1].y==a[j].y) continue;if(a[j].x>mxx){ans[a[i].id]+=(n-l+1)*(a[j].y-r);r=a[j].y;l=a[j].x+1;mxx=a[j].x;}if(ans[a[j].id]==1){ans[a[i].id]=ans[a[i].id]-sum[j];f=1;break;}}if(f==0){ans[a[i].id]+=(m-r+1)*(n-l+1);ans[a[i].id]-=pu;if(ans[a[i].id]<0) ans[a[i].id]=n;}r=a[i].y;l=a[i].x+1;pre=i;}printf("%lld\n",pu);for(int i=1;i<=k;i++) printf("%lld ",ans[i]);puts("");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/789339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章讲清楚Java中的反射

介绍 每个类都有一个 Class 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。 类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName("com.mysql.jdbc.Driver"…

django timezone.now 小了8小时

django.util.timezone.now()原因:setting.py中设置了时区:LANGUAGE_CODE = en-usTIME_ZONE = UTCUSE_I18N = TrueUSE_TZ = True # 若数据库中存储的是UTC时间,但在模板显示的时候,会转成TIME_ZONE所示的本地时间进行显示****将TIME_ZONE时区改为:TIME_ZONE = Asia/Shangha…

枚举实现原理

枚举的定义 在JDK1.5之前,我们要是想定义一些有关常量的内容,例如定义几个常量,表示从周一到周末,一般都是在一个类,或者一个接口中,写类似于如下代码: public class WeekDayConstant {public static final int MONDAY = 0;public static final int TUESDAY = 1;public …

航图中的扇区数据生成

今天简单聊一下机场扇区,最后再介绍一下《风标设计2025》航图模块中的扇区绘制功能。机场扇区是以机场基准点(ARP)或归航台为圆心,半径46km(25nm),外加9km(5nm)缓冲区构成。PBN程序扇区通常以ARP为圆心,传统程序扇区以导航台为圆心。对于中小机场,为了统一和简化扇区划设…

【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问

问题描述 对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上, 有如下几点考虑: 1) 使用Azure Policy服务,扫描订阅中全部的网络安全组(NSG: Network Security Group) 资源 2) 判断入站规则,判断是否是3389, 22端口 3) 判断源地…

动态规划——数字三角形模型

数字三角形模型 母题 : 数字三角形思路 ​ 集合 f [i] [j] 表示所有从起点走到(i,j)的路径 ​ 属性 f [i] [j] 存的数是集合中所有路径和的最大值 ​ 状态计算:对于每一条从起点到 ( i , j ) 的路径,其要么是从左上方来的,要么是从右上方来的。 #include<bits/stdc++…

盘点一个Pycharm汉化过程中的一个坑

大家好,我是Python进阶者。 一、前言 前几天在Python最强白银交流群【生产队的驴都是不歇的】问了一个Python汉化的问题,问题如下:要把我弄疯了,汉化不成功,想重新安装,又不给出卸载选项,通过硬盘安装插件又提示异常。去插件文件夹删除所有插件文件,再重新安装pycharm,…

深度解析:OCR技术在企业HR管理中的应用

HR管理的挑战 企业的HR部门在处理员工入职、资料审核、信息录入存储管理等环节面临着大量重复性劳动力的问题。而HR部门通常人手有限,传统的人工录入方式不仅效率低下,而且容易出错。OCR技术的引入,极大地起到了降本增效地目的。应用的办公场景人脸比对技术 应用背景:在员工…

.NET 摄像头采集

本文主要介绍摄像头(相机)如何采集数据,用于类似摄像头本地显示软件,以及流媒体数据传输场景如传屏、视讯会议等。 摄像头采集有多种方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),网上一些文章以及github已经有很多介绍,这…

Python深度学习股价预测、量化交易策略:LSTM、GRU深度门控循环神经网络|附代码数据

全文链接:https://tecdat.cn/?p=37539 原文出处:拓端数据部落公众号 分析师:Shuo Zhang 本文以上证综指近 22 年的日交易数据为样本,构建深度门控循环神经网络模型,从股价预测和制定交易策略两方面入手,量化循环神经网络在股票预测以及交易策略中的效果,结合一个Pytho…

Windos NTP 服务设定

1、修改注册表2, 双击 打开 设为自动 应用 保存