首页 > 其他分享 >map维护段的分裂

map维护段的分裂

时间:2023-06-22 21:25:15浏览次数:41  
标签:tmp map cnt used int -- 分裂 ord 维护

E. Fill the Matrix

Problem - E - Codeforces

题意:给定一个n*n的阵列,每一列从上到下连续ai个为黑,其余为白,白格子中才能放数,现在有k个数,beauty值定义为满足i后接i+1的数的数量。

n<=2e5

题解:转换下题意就是说找到最少的段数使得总和>=k。由于n很大,无法遍历阵列,我们考虑从最下面的行向上转移,观察如何log维护转移。

我们发现,在转移过程中,当在第i行j列出现黑色而i+1行j列未出现黑色,则会使得此段断裂产生两个段。而这种新出现的黑色至多有n个,如此我们可以维护段,维护一个段的出现开始行并在其消失时将其长度出现次数加入答案中即可。用map维护做到O(nlogn)。

#include<bits./stdc++.h>
#define int long long 
using namespace std;
const int N=2e5;
struct seg
{
    int l,r;
};
bool operator <(const seg &a, const seg &b){
	return a.l < b.l;
}
void solve(){
    int n;cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int m;cin>>m;
    map<seg,int> used;
    used[{0,n}]=n;
    vector<int> ord(n);
    iota(ord.begin(),ord.end(),0);
    sort(ord.begin(),ord.end(),[&a](int x,int y){
        return a[x]>a[y];
    });
    int ans=0;
    int j=0;
    vector<int> cnt(n+1);
    for(int i=n;i>=0;i--){
        while(j<n&&a[ord[j]]>=i){
            auto it=used.upper_bound({ord[j],-1});
            --it;
            auto tmp=it->first;
            cnt[tmp.r-tmp.l]+=it->second-i;
            used.erase(it);
            if(tmp.l!=ord[j])
                used[{tmp.l,ord[j]}]=i;
            if(tmp.r!=ord[j])
                used[{ord[j]+1,tmp.r}]=i;
            ++j;    
        }        
    }
    for(int i=n;i>0;i--){
        int t=min(cnt[i],m/i);
        ans+=t*(i-1);
        m-=t*i;
        if(t!=cnt[i]&&m>0){
            ans+=m-1;
            m=0;
        }
    }
    cout<<ans<<endl;
}
signed main(){
    int T;cin>>T;
    while(T--){
        solve();
    }
}

标签:tmp,map,cnt,used,int,--,分裂,ord,维护
From: https://www.cnblogs.com/wjhqwq/p/17498349.html

相关文章

  • ConcurrentHashMap的使用场景
    一、并发容器ConcurrentHashMapHashMap是我们用得非常频繁的一个集合,但是它是线程不安全的。并且在多线程环境下,put操作是有可能产生死循环,不过在JDK1.8的版本中更换了数据插入的顺序,已经解决了这个问题。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)......
  • ConcurrentHashMap使用案例(单词数量统计)
    前言目标:实现单词数量统计过程:首先使用26个英文字母,每个字母200个,将26200个字母打乱顺序存入26个txt文件中。使用26个线程,每个线程统计一个txt文件的200个字母。26个线程同时操作这一个Map集合。最终想要得到的结果为:a:200(a被统计了200次),b:200(b被统计了200次)……z:200(z被统计200......
  • UE5 C++ TMap
    概述映射的元素类型为键值对,元素类型实际上是TPair<KeyType,ElementType>,只将键用于存储和获取TMap和TMultiMap两者之间的不同点是TMap中的键是唯一的,而TMultiMap可存储多个相同的键TMap是散列容器,这意味着键类型必须支持GetTypeHash函数,并提供运算符==来比较各个键是否......
  • Android-Kotlin-区间与FOR&LIST&MAP简单使用
    区间与for:packagecn.kotlin.kotlin_base04/***区间与for*/funmain(args:Array<String>){/***Kotlin中提供了区间,例如:存入1到100,在Java中可能要写多行代码,而在Kotlin中很简单,代码如下*1..100*/varnumbers=1..100/***......
  • R语言ggmap空间可视化机动车交通事故地图|附代码数据
    原文链接:http://tecdat.cn/?p=12350最近我们被客户要求撰写关于空间可视化的研究报告,包括一些图形和统计输出。在本文中,我使用ggmap可视化纽约市的交通事故数据来自纽约市开放数据。我的数据范围是2012年至2015年。该数据跟踪车辆的类型,发生事故的街道的名称以及事故的经度和纬......
  • gRPC 的 RoadMap 20160325 更新
    gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(ProtocolBuffers)序列化协议开发,且支持众多开发语言。下面我们就从HTTP2、ProtoBuf3、Nginx、gRPC的角度看他们的RoadMAP。HTTP22015年5月HTTP2协议正式版发布:RF......
  • 优秀的代码规范设计:让代码更加易于阅读和维护的代码
    目录1.引言2.技术原理及概念2.1基本概念解释2.2技术原理介绍2.3相关技术比较3.实现步骤与流程3.1准备工作:环境配置与依赖安装3.2核心模块实现3.3集成与测试4.应用示例与代码实现讲解4.1应用场景介绍4.2应用实例分析《优秀的代码规范设计:让代码更加易于阅读和维护的代......
  • API接口技术的使用可以增加软件开发和运行的灵活性,降低软件运行和维护的成本
    随着科技的发展和互联网的普及,越来越多的公司和企业把业务拓展到互联网上,这就需要用到API接口技术。API(ApplicationProgrammingInterface,应用程序接口)是指不同软件系统之间进行数据交流和信息共享的一种方式和规范,它通过标准化的接口实现不同系统之间的数据传递和协作,是构建应用......
  • windows维护日常整理
    在命令提示符窗口中使用以下命令可以查询80端口是否被打开: netstat-ano|findstr:80这个命令会列出所有正在使用80端口的网络连接。如果80端口被打开,你将会看到一些相关的信息,包括本地地址、外部地址和进程ID。如果80端口没有被打开,你将不会看到任何输出。注意:这个命令......
  • js 数组 map方法
    一、map的第一种使用场景需求:我们想得到对象数组中指定的两组或多组key和value值。如下图:下面是一段JSON数据结构{"code":0,"msg":null,"data":[{"processDetailId":1381753495314433,"processId":138175349......