【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数)

2024-09-07 23:38

本文主要是介绍【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这题简直蛋疼死。。。。。

A了一下午

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 200005;
int h,w,n;
int C1[maxn],C2[maxn];
int vis1[maxn] = {0},vis2[maxn] = {0};
priority_queue<int,vector<int>,less<int> >q1;
priority_queue<int,vector<int>,less<int> >q2;
int lowbit(int x){return x & -x;
}
int sum(int C[],int x){int ret = 0;while(x > 0){ret += C[x];x -= lowbit(x);}return ret;
}
void add(int x,int d,int n,int C[]){while(x <= n){C[x] += d;x += lowbit(x);}
}
int main(){memset(C1,0,sizeof(C1));memset(C2,0,sizeof(C2));scanf("%d%d%d",&w,&h,&n);int max_width  = w;int max_height = h;int oh = 0, ow = 0;vis1[h] ++; q1.push(h);vis2[w] ++; q2.push(w);h ++;w ++;add(1,1,h,C1);  add(h,1,h,C1);add(1,1,w,C2);  add(w,1,w,C2);for(int i = 0; i < n; i++){char str[7];int d;scanf("%s%d",str,&d);d ++;if(str[0] == 'H'){int l = 1,r = d - 1;int e1,e2;int v = sum(C1,d);while(l < r){int mid = (l + r) >> 1;int ans = sum(C1,mid);if(ans >= v)r = mid;elsel = mid + 1;}e1 = l;add(d,1,h,C1);v = sum(C1,d) + 1;l = d + 1;r = h;while(l < r){int mid = (l + r) >> 1;int ans = sum(C1,mid);if(ans < v)l = mid + 1;elser = mid;}e2 = l;int d1 = d - e1,d2 = e2 - d;vis1[d1 + d2]--;if(!vis1[d1]) q1.push(d1);if(!vis1[d2]) q1.push(d2);vis1[d1] ++;vis1[d2] ++;while(!q1.empty()){int t = q1.top(); q1.pop();if(vis1[t]){max_height = t;q1.push(t);break;}}}else if(str[0] == 'V'){int l = 1,r = d - 1;int e1,e2;int v = sum(C2,d);while(l < r){int mid = (l + r) >> 1;int ans = sum(C2,mid);if(ans < v)l = mid + 1;elser = mid;}e1 = l;add(d,1,w,C2);v = sum(C2,d) + 1;l = d + 1;r = w;while(l < r){int mid = (l + r) >> 1;int ans = sum(C2,mid);if(ans < v)l = mid + 1;elser = mid;}e2 = l;int d1 = d - e1,d2 = e2 - d;vis2[d1 + d2]--;if(!vis2[d1]) q2.push(d1);if(!vis2[d2]) q2.push(d2);vis2[d1] ++;vis2[d2] ++;while(!q2.empty()){int t = q2.top(); q2.pop();if(vis2[t]){max_width = t;q2.push(t);break;}}}printf("%I64d\n",(LL)max_width * max_height);}return 0;
}

这篇关于【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146496

相关文章

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA