首页 > 其他分享 >CF笔记

CF笔记

时间:2023-04-21 11:24:47浏览次数:48  
标签:cur widest CF 笔记 second ans include first

https://codeforces.com/problemset/problem/1819/B

分析:总面积总是不变的 考虑第一刀横着劈开 这样一块宽度是最大的 同理竖着劈开 高度是最大的

这样两种情况 通过算面积能够求出剩下的长宽度

考虑贪心 对于剩下的块 如果有长宽相匹配的就直接匹配 顺序不重要

特别的 如果两次答案相同要舍去一个

还有如果用面积除长或者宽除不尽 也需要舍去

代码细节很多 很考码力

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <string>
#include <cmath>
#include <map>
#include <iostream>
#include <list>
#include <stack>
#include <cassert>
using namespace std;

typedef long long ll;
typedef long double ld;

#define fastInp cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);

const ll INF = 1e9 * 1e9 + 100, SZ = 1100;

ll n;
vector<pair<ll, ll>> vec;
map<ll, pair<ll, ll>> blocks;

pair<ll, ll> solve() {
	set<pair<ll, ll>> widest, longest;

	for (size_t i = 0; i < vec.size(); i++) {
		widest.insert({ vec[i].first, i });
		longest.insert({ vec[i].second, i });

		blocks[i] = vec[i];
	}

	pair<ll, ll> ans = { -1, -1 };
	bool mode = 0;
	ll prevw = INF, prevh = INF, prv = -1;
	bool cringe = 0;
	while (widest.size() != 0) {
		if (mode == 0) {
			ll cur = (*widest.rbegin()).first, sum = 0;
			if (ans.second == -1) ans.second = cur;
			prv = blocks[(*widest.rbegin()).second].second;

			while (widest.size() > 0 && (*widest.rbegin()).first == cur) {
				auto it = (--widest.end());
				longest.erase({blocks[it->second].second, it->second });
				sum += blocks[it->second].second;
				widest.erase(it);
			}

			if (!cringe) ans.first = sum;
			prv = sum;
			if (prevw == INF) {
				prevh = cur;
			} else {
				prevw -= sum;
				if (prevh != cur) return { -1, -1 };
			}
		} else {
			ll cur = (*longest.rbegin()).first, sum = 0;
			if (!cringe) {
				ans.first = cur + prv;
				cringe = 1;
			}

			while (longest.size() > 0 && (*longest.rbegin()).first == cur) {
				auto it = (--longest.end());
				widest.erase({ blocks[it->second].first, it->second });
				sum += blocks[it->second].first;
				longest.erase(it);
			}

			if (prevw == INF) {
				prevw = cur;
				prevh -= sum;
				if (prevw != cur) return { -1, -1 };
			} else {
				prevh -= sum;
				if (prevw != cur) return { -1, -1 };
			}
		}

		mode ^= 1;
	}

	if (prevh == 0 || prevw == 0 || prevh == INF || prevw == INF) {
		return ans;
	} else {
		return { -1, -1 };
	}
}

signed main() {
	fastInp;

    ll t;
    cin >> t;
    
    while (t--) {
        vec.clear();
        blocks.clear();
    	cin >> n;
    
    	vec.resize(n);
    	for (auto& c : vec) cin >> c.first >> c.second;
    
    	vector<pair<ll, ll>> ans;
    
    	ans.push_back(solve());
    	swap(ans.back().first, ans.back().second);
    	if (ans.back().first == -1) ans.pop_back();
    
    	for (auto& c : vec) swap(c.first, c.second);
    
    	ans.push_back(solve());
    	if (ans.back().first == -1) ans.pop_back();
    
    	if (ans.size() == 2 && ans[0] == ans[1]) {
    		ans.pop_back();
    	}
    	cout << ans.size() << "\n";
    
    	for (auto c : ans) cout << c.first << " " << c.second << "\n";
    }
    
	return 0;
}

标签:cur,widest,CF,笔记,second,ans,include,first
From: https://www.cnblogs.com/wzxbeliever/p/17339714.html

相关文章

  • JS课堂笔记(4.11-4.16)
    一、简单了解JS1.JavaScript(简称JS)是作为开发Web页面的脚本语言。2.JS是从1995年由网景公司的布兰德开发。3.JavaScript的标准是ECMAScript。4.JS代码是从上往下执行的。 二、变量1.变量名的值可以重复赋值(值可以修改),变量可以重复声明。2.JS中“+”号很特殊,只要是和......
  • 【韦东山RT-Thread系列教程】P1-P10笔记
    1、线程在切换时,仅仅保存中间结果。例如,b=a+10包含tmp=a+10与b=tmp两个过程,当执行完tmp=a+10后,线程出现切换,那么OS需要保存这个中间结果。2、汇编跳转指令——BL指令(即BranchAndLink)BL指令的作用之一是记录返回地址,然后执行当前指令。如下函数:fun(){add_val(......
  • 重磅 | Shifu物联网开发框架成为CNCF认证项目
    近日,边无际Shifu项目被收录进CNCF云原生全景图,成为了云原生计算基金会认证的项目之一。此次收录证明了Shifu具备了符合CNCF标准的技术能力和良好的社区发展,展现了Shifu在云原生计算领域的实力和可信度,巩固了Shifu在云原生领域的地位。作为CNCF认证项目,Shifu将会有更多机会为AIoT开......
  • Prufer 序列学习笔记
    一、前言感觉它本身没有什么用。主要是用于计数问题。前置知识:树的定义。二、定义对于一棵有\(n\)个节点的无根树\(T\),定义其Prufer序列为执行以下操作\(n-2\)次所形成的长度为\(n-2\)的正整数序列。·选择其编号最小的度数为\(1\)的节点,输出唯一与其相邻的节点的......
  • C语言基础知识(不想写笔记啦,就把它打出来)
    scanf()函数的使用:操作系统接收数据时其实都是当作字符来接收的。scanf()函数的两种用法:用法一:scanf("输入控制符",输入参数);功能:将从键盘输入的字符转化成输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。用法二:scanf("非输入控制符输入控制符"......
  • 【进阶15】【自学笔记】Python运行cmd命令的几种方式
    一、pathlib的简单介绍pathlib是Python3.4及更高版本中内置的标准库,提供了一种面向对象的方式来处理文件系统路径。它为不同操作系统提供了合适的路径语义,并支持常见的文件和目录操作,比如判断路径是否存在、获取路径的各个部分、创建/删除目录等操作。二、基本操作1、获取......
  • 微信小程序开发笔记 基础篇③——自定义数据dataset,事件触发携带额外信息
    文章目录一、前言二、视频演示三、原理和流程四、注意事项五、全部源码六、参考一、前言微信小程序开发笔记——导读想要实现一个电费充值界面。多个不同金额的充值按钮,每个按钮都携带自定义数据(金额)点击不同金额的充值按钮,就会上传对应的数据(金额)。所以,本文主要使用到了微信小程......
  • JavaScript学习笔记
    SassSASS官网世界上最成熟、最稳定、最强大的专业级CSS扩展语言!sass是一个css的预编译工具也就是能够更优雅的书写csssass写出来的东西浏览器不认识依旧是要转换成css在浏览器中运行变量定义一个变量,在后面的代码中使用使用$来定义变量//定义一个$c作为变量,值是红......
  • 【进阶14】【自学笔记】Python运行cmd命令的几种方式
    1、使用os.system()函数importos#运行cmd命令os.system('dir')2、使用subprocess模块importsubprocess#运行cmd命令subprocess.run(['dir'],shell=True)3、使用os.popen()函数importos#运行cmd命令result=os.popen('dir')print(result.read......
  • Django笔记二十六之数据库函数之数学公式函数
    本文首发于公众号:Hunter后端原文链接:Django笔记二十六之数据库函数之数学公式函数这一篇来介绍一下公式函数,主要是数学公式。其中sin,cos这种大多数情况下用不上的就不介绍了,主要介绍下面几种:Abs()绝对值Ceil()向上取整Floor()向下取整Mod()取余Power()乘方Roun......