CF102411 ICPC 2019-2020 North-Western Russia Regional Contest题解

news/2024/5/19 15:44:21/文章来源:https://www.cnblogs.com/vivaldi370/p/solution_cf102411.html

A Accurate Movement

签到

M Managing Difficulties

签到

B Bad Treap

已知\(y=\sin(x)\),要求给出数组\(a[n]\),满足\(\forall i,j\in[1,n],a[i]\neq a[j]\),都有\(\sin(a[i])\neq \sin(a[j])\)

这里又一种不怎么玄的写法,就是我们找到一个整数\(x\)\(sin(x)\)非常非常小并且\(\sin(x)>0\),这样算,嗯……例如\(sin(2x)\)的时候,\(\sin(2x)=2\sin x \cos x\),它的值只会有很小的增加\((2\cos x<2)\)。然后就算它扩大了\(2.5\times10^4\)倍之后,仍然都增加不到接近1的位置,那么我们就成功了。然后因为\(\sin x\)关于原点对称,在负半轴把它对称过去,仍然是一个递增序列。

int n;
const int N = 5e4 + 5;
int a[N];int main(void){scanf("%d", &n);double mn = 100;int id = 1;for (int i=1;i<=4e4;++i){if (sin(i) < mn && sin(i) > 0){mn = sin(i), id = i;}}for (int i=-25000;i<=25000;++i){a[i + 25000] = i * id;}for (int i=0;i<n;++i){printf(i==n-1?"%d\n":"%d ", a[i]);}return 0;
}

不对称过去会wa7,(露西亚,你太baby辣)

I Ideal Pyramid

给定\(n\)个方尖碑,要用一个仰角为45°的金字塔把它们全部覆盖起来,也就是建成金字塔之后,所有的方尖碑都会被它掩盖,高度也不会穿过金字塔,问金字塔应该建在哪里,高度最小为多少。

实际上,所有的四棱锥都可以转化为一个正方形的覆盖,那么题意就转化为了,找到一个最小的正方形,可以包括所有的正方形的集合。这样的话,直接维护正方形集合的上下左右边界(最后得到一个矩形),再按照矩形的中心扩展即可。

int n;
const int N = 1000 + 5;void solve(){n = read();ll x, y, h;ll L = 1e18, R = -1e18, U = -1e18, D = 1e18;for (int i=1;i<=n;++i){x = read(), y = read(), h = read();L = min(L, x - h), R = max(R, x + h), U = max(U, y + h), D = min(D, y - h);}ll a = (L + R) / 2, b = (U + D) / 2, H = max((R - L + 1) / 2, (U - D + 1) / 2);printf("%lld %lld %lld\n", a, b, H);
}int main(void){int T;
//	T = read();T = 1;while (T--){solve();}return 0;
}

King's Children

有一个\(n\times m\)的网格,里面有最多\(A~to ~Z\)个孩子,king要把这个网格分成若干矩形,要满足:

  • 每个矩形必须精确的包括一个孩子
  • 每个格子都必须精确的属于1个矩形(也就是矩形不相交的分完整个大网格)
  • 包括了\(A\)的矩形的面积尽可能大

数据范围\(1\leq n,m\leq 1000\)

这题可以用悬线法,也可以用单调栈(不如说悬线法就是单调栈的一个子集问题)

算是比较经典的求最大子矩形的问题,然而我不会,下面先介绍一下悬线法。


悬线法

oi-wiki的定义:https://oi-wiki.org/misc/hoverline/

一个简单的题目,简单理解悬线法的过程:

SP1805 Largest Rectangle in a Histogram

https://www.luogu.com.cn/problem/SP1805

首先,\(n\)个矩形就相当于\(n\)条悬线,我们知道最大的面积肯定是由某一个悬线向左右扫过而形成的。那么悬线的扩展,显然的满足某一递推关系,可以帮助我们将复杂度由原来的\(O(N^2)\)变成\(O(N)\)

定义\(l_i\)为当前的\(i\)位置能扩展到的悬线的最左端,初始时\(l_i=i\)。假设已经处理好了前\(i-1\)个位置的答案,那么当\(h_i\leq h_{i-1}\)时,\(i\)也能扩展到\(i-1\)能扩展到的位置。如果\(h_i\leq h_{l_{i-1}-1}\)时,又可以接着往前扩展……直到扩展到边界,我们就停止。因此对于\(\forall i\),我们有

while (L[i] > 1 && a[i] <= a[L[i] - 1]) L[i] = L[L[i] - 1];

同样的,假如我们已经处理好\(i+1\)\(n\)的答案,\(r_i\)也能不断的向右扩展。

while (R[i] < n && a[i] <= a[R[i] + 1]) R[i] = R[R[i] + 1];

那么完整代码:

int n;
const int N = 1e5 + 5;
int a[N], L[N], R[N];void solve(){for (int i=1;i<=n;++i){scanf("%d", &a[i]);L[i] = R[i] = i;}for (int i=1;i<=n;++i){while (L[i] > 1 && a[i] <= a[L[i] - 1]) L[i] = L[L[i] - 1];}for (int i=n;i>=1;--i){while (R[i] < n && a[i] <= a[R[i] + 1]) R[i] = R[R[i] + 1];}ll res = 0;for (int i=1;i<=n;++i){res = max(res, 1LL * a[i] * (R[i] - L[i] + 1)); }printf("%lld\n", res);
}

UVA1619/POJ2796 Feel Good

给出长度为\(n\)的数组\(a[n]\),找到一个子区间,使得子区间内的最小值与区间内所有元素和的乘积最大,如果有多个答案,输出长度最小的答案,如果仍有多个答案,输出最左端序号最小的答案。

枚举这个最小值,它一旦向左右扩展,就肯定会增加这个乘积的值,这样的话,又变成了一个悬线法求最大子矩形的问题。

数据范围:\(1\leq n \leq 10^5\) 我恨UVA的多组数据和格式

int n;
const int N = 1e5 + 5;
int a[N], L[N], R[N];
ll pre[N];
bool fst = 1;void solve(){
//	n = read();if (!fst){puts("");}fst = 0;for (int i=1;i<=n;++i){a[i] = read();pre[i] = pre[i - 1] + a[i];L[i] = R[i] = i;}for (int i=1;i<=n;++i){while (L[i] > 1 && a[i] <= a[L[i] - 1]) L[i] = L[L[i] - 1];}for (int i=n;i>=1;--i){while (R[i] < n && a[i] <= a[R[i] + 1]) R[i] = R[R[i] + 1];}ll res = 0;int aL = 1, aR = 1;for (int i=1;i<=n;++i){ll cur = (pre[R[i]] - pre[L[i] - 1]) * a[i];if (cur > res){res = cur, aL = L[i], aR = R[i];}else if (cur == res){if (R[i] - L[i] < aR - aL){aL = L[i], aR = R[i];}else if (R[i] - L[i] == aR - aL){if (L[i] < aL){aL = L[i], aR = R[i];}}}}printf("%lld\n%d %d\n", res, aL, aR);
}int main(void){while (~scanf("%d", &n)){if (n == 0){puts("");}else solve();}return 0;
}

最大子矩形:p4147 玉蟾宫

嗯……差不多捏,问题。oiwiki留的课后习题也写了,就不放出来了。


那么正式说K,K题我的思路就是,每个矩形都用悬线法进行选取和填充。但是,由于填充顺序的不同,有极低的概率出现最后有矩形没有被完全填上的情况,因此做一个简单的check,如果填充错误,则随机化顺序,重新填充答案。大概2~3次随机后就不可能出现还没填充的情况了,所以这个复杂度是完全可行的。

代码:

int n, m, sx, sy;
const int N = 1000 + 5;
char s[N][N], ss[N][N];
int U[N], L[N], R[N];
struct node{char ch;pii cor;
};
vector<node> alp;bool check(pii s, pii a, pii b){return (s.xx >= a.xx && s.xx <= b.xx) && (s.yy >= a.yy && s.yy <= b.yy);
}void putin(char ch, pii cor){int res = 0; pii r1 = cor, r2 = cor;for (int j=1;j<=m;++j) U[j] = 0;for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){if (s[i][j] == '.' || s[i][j] == ch){U[j]++;}else{U[j] = 0;}L[j] = R[j] = j;}for (int j=1;j<=m;++j){while (L[j] > 1 && U[j] <= U[L[j] - 1]) L[j] = L[L[j] - 1];}for (int j=m;j>=1;--j){while (R[j] < m && U[j] <= U[R[j] + 1]) R[j] = R[R[j] + 1];}for (int j=1;j<=m;++j){int cur = U[j] * (R[j] - L[j] + 1);pii c1 = pii(i - U[j] + 1, L[j]), c2 = pii(i, R[j]);if (cur > res && check(cor, c1, c2)){res = cur, r1 = c1, r2 = c2;}}}for (int i=r1.xx;i<=r2.xx;++i){for (int j=r1.yy;j<=r2.yy;++j){if (s[i][j] == '.'){s[i][j] = 'a' + (ch - 'A');}}}
}void solve(){for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){s[i][j] = ss[i][j];}}int alen = alp.size(), t = alen - 1;if (alen > 1){for (int i=0;i<alen-1;++i){int x = 1 + rand() % t;swap(alp[x], alp[t]);t--;}}for (int i=0;i<alp.size();++i){putin(alp[i].ch, alp[i].cor);}}bool isOK(){for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){if (s[i][j] == '.'){return false;}}}return true;
}int main(void){srand(time(NULL));int T;T = 1;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m;for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){cin >> ss[i][j];if (ss[i][j] == 'A'){alp.push_back(node{'A', pii(i, j)});}}}for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){if (ss[i][j] != '.' && ss[i][j] != 'A'){alp.push_back(node{ss[i][j], pii(i, j)});}}}do{solve();}while(!isOK());for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){cout << s[i][j];}cout << endl;}return 0;
}

E Equidistant

给出一个树,判断是否有一个结点,满足到所有特殊点的距离相等。

数据范围:\(1\leq m,n\leq 2\times 10^5\)

这题感觉用多源bfs更简单……嗯……用树形DP试着写写吧。

树形DP 不推荐。。。。

int n, m;
const int N = 2e5 + 5, INF = 1e9 + 10;
bool st[N], ok;
vector<int> ve[N];
int f[N], g[N];void dfs(int u, int pre){for (auto to : ve[u]){if (to == pre) continue;dfs(to, u);f[u] = min(f[u], f[to] + 1);g[u] = max(g[u], g[to] + 1);}
}void dfs2(int u, int pre){if (ok) return;if (f[u] == g[u]){if (!ok){puts("YES");printf("%d\n", u);}ok = true;return ;}int mx1 = -INF, mx2 = -INF, mn1 = INF, mn2 = INF;if (st[u]){mx1 = mn1 = 0;}for (auto to : ve[u]){if (f[to] + 1 < mn1){mn2 = mn1, mn1 = f[to] + 1;}else if (f[to] + 1 < mn2){mn2 = f[to] + 1;}if (g[to] + 1 > mx1){mx2 = mx1, mx1 = g[to] + 1;}else if (g[to] + 1 > mx2){mx2 = g[to] + 1;}}for (auto to : ve[u]){if (to == pre) continue;int fto = f[to], gto = g[to];if (f[u] == f[to] + 1){f[u] = mn2;f[to] = min(f[to], mn2 + 1);}else{f[to] = min(f[to], f[u] + 1);}if (g[u] == g[to] + 1){g[u] = mx2;g[to] = max(g[to], mx2 + 1);}else g[to] = max(g[to], g[u] + 1);dfs2(to, u);f[u] = mn1, g[u] = mx1;f[to] = fto, g[to] = gto;}
}int main(void){n = read(), m = read();for (int i=1;i<=n;++i){f[i] = INF, g[i] = -INF;}int u, v, x;for (int i=1;i<n;++i){u = read(), v = read();ve[u].push_back(v), ve[v].push_back(u);}for (int i=1;i<=m;++i){x = read(), st[x] = true;f[x] = g[x] = 0;}dfs(1, 0);dfs2(1, 0);if (!ok){puts("NO");}return 0;
}

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

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

相关文章

计算机的概述

计算机是由硬件系统(hardware system)和软件系统(software system)两部分组成的。硬件系统电源电源是电脑中不可缺少的供电设备,它的作用是将220V交流电转换为电脑中使用的5V、12V、3.3V直流电,其性能的好坏,直接影响到电脑其他设备工作的稳定性,进而会影响整机的稳定性…

AXI MCDMA 仿真与工作流程分析

说明 关于背景知识,可以先看 https://www.cnblogs.com/xingce/p/16386108.html 引用一段官方的说明,AXI MCDMA存在的主要目的是为了节约资源,我们想要使用这个模块的主要目的也是为了降低资源消耗,从而可以将系统部署在更小面积的FPGA芯片上,当然,具体的效果还需要进一步…

软件定义网络第一次作业,问题与解决方法

软件定义网络第一次作业,问题与解决方法 实验结果截图:实验总结: 1.若使用VMware Workstation Pro。 版本最好使用20.04版本,网络较稳定且兼容性好。且22.04版本可能无法安装Vmware tools。 2.遇到网络无法访问,可尝试换源。 3.若需要压缩包,可在虚拟机中下载,或从电脑拖…

【kali】一款黑客们都在使用的操作系统

&#x1f495;&#x1f495;&#x1f495; 博主昵称&#xff1a;摆烂阳&#x1f495;&#x1f495;&#x1f495; &#x1f970;博主主页跳转链接 &#x1f469;‍&#x1f4bb;博主研究方向&#xff1a;web渗透测试 、python编程 &#x1f4c3; 博主寄语&#xff1a;希望本篇文…

共享单车需求量登记分类及影响因素分析——基于机器学习模型的比较分析

全文链接&#xff1a;http://tecdat.cn/?p28519 作者&#xff1a;Yiyi Hu 近年来&#xff0c;共享经济成为社会服务业内的一股重要力量。作为共享经济的一个代表性行业&#xff0c;共享单车快速发展&#xff0c;成为继地铁、公交之后的第三大公共出行方式。但与此同时&…

【笔记】Python网络爬虫与信息提取

实战&#xff1a;总结知识点疫情爬虫Re正则表达式Re库的使用scrapy爬虫框架介绍Scrapy常用命令网络爬虫技术亮点&#xff1a;1、采用requests发送请求&#xff0c;获取响应2、采用BeautifulSoup4解析页面数据3、采用正则表达式 提取不规则字符串4、采用json模块处理json格式数据…

Java架构师常见基础面试题(附答案)

随着每日确诊病例人数的减少以及治愈患者人数增多&#xff0c;随着这场抗“疫”战争即将以胜利告终&#xff0c;接踵而来的是企业复工、金三银四求职高峰季的来临。有很多Java工程师想要把握住这个机会&#xff0c;实现升职加薪、成为Java架构师。但你知道企业在招聘面试时会提…

证件照换底色

阅读原文 如有侵权,请联系立即删除。 5种方法轻松给证件照换底色不同底色的证件照有着不同的用途。如白底的证件照一般用于身份证、港澳通行证等用途;而蓝底的证件照则用于工作证、简历等。例如我们需要提供蓝色背景的证件照,而手头只有白色背景的证件照,该怎么办呢?其实我…

开学季征文丨来大学已两年,我还有几个两年?

&#x1f44b;写在前面 大家好&#xff0c;我是陈橘又青&#xff0c;一名双非本科大学生&#xff0c;计算机科学与技术专业&#xff0c;最近因为疫情的原因&#xff0c;开学以来一直在家里上网课&#xff0c;也不是很忙&#xff0c;所以我想借着这次开学季征文活动&#xff0c;…

羧基化聚苯乙烯-二氧化硅复合材料/季铵化壳聚糖掺杂荷正电聚苯乙烯微球的制备步骤

今日小编为大家分享了羧基化聚苯乙烯-二氧化硅复合材料/季铵化壳聚糖掺杂荷正电聚苯乙烯微球的制备步骤&#xff0c;一起来看&#xff01; 羧基化聚苯乙烯-二氧化硅复合超疏水涂层的制备方法,其特征在于包括如下步骤&#xff1a; (聚苯乙烯种子微球的制备;羧基修饰的聚苯乙烯微…

【控制】滑模控制,小例子,有程序有结果图

目录滑模控制的一点笔记和看法1【控制】滑动模型控制&#xff08;Sliding Mode Control&#xff09;2【控制】滑模控制&#xff0c;小例子&#xff0c;有程序有结果图3【控制】滑模控制&#xff0c;滑模面的选择文章目录1 问题描述2 滑模控制器设计2.1 滑模面选择2.2 控制器设计…

麻了,别再为难软件测试员了

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

hive中使用iceberg表格式时锁表总结

1. 原因 写入iceberg表时,会在hive_locks表中插入一条记录,表示该表正在被写入(hive中的独占锁)当数据插入完成后,会自动删除该条记录。 2. 出现场景 (1)在同时往同一个iceberg表中写入数据时,会出现Retrying task after failure: Waiting for lock之类的警告信息 如果有…

Docker 环境 Nacos2 MySQL8

本文介绍 docker 环境下安装并单机运行 Nacos2,使用 docker 环境下的 MySQL 8 存储数据。本文介绍 docker 环境下安装并单机运行 Nacos2,使用 docker 环境下的 MySQL 8 存储数据。 1 拉取镜像 1.1 创建目录 在硬盘上创建 nacos 的有关目录: mkdir -p /Users/yygnb/dockerMe/…

FPGA之旅设计99例之第十三例-----FPGA在OLED上显示DHT11数据

一. 简介 这是FPGA之旅设计的第十三例啦&#xff0c;本例是一个综合性的例程&#xff0c;基于OLED屏幕显示&#xff0c;和DHT11温湿度采集&#xff0c;将DHT11采集到的温湿度显示到OLED屏幕上。 在开始本例之前&#xff0c;先补充一下&#xff0c;在上例中&#xff0c;代码中…

Webpack 打包 - 14. html压缩

这里使用 html-webpack-plugin 插件压缩 html 文件。 1.文件结构 2.代码 index.html<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>webpack</title> </head> <body> <!--这里…

《Hyperspectral Image Classification With Deep Feature Fusion Network》论文笔记

论文题目《Hyperspectral Image Classification With Deep Feature Fusion Network》 论文作者:Weiwei Song, Shutao Li, Leyuan Fang,Ting Lu 论文发表年份:2018 网络简称:DFFN 一、本文提出的挑战 1.由于光谱混合和光谱特征空间变异性的存在,HSIs通常具有非常复…

KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例

KingbaseES 、repmgr案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作。若主节点已经失效,希望将异地备机提升为主节点。 $bin/repmgr standby promote 适用版本:KingbaseES V8R6 集群节点信息…

Postman和Jmeter的区别

Postman是一款功能强大的用于发送HTTP请求的Chrome插件&#xff0c;主要用于接口测试&#xff1b; Jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;也可以用来进行接口测试。 很多同学经常将两款工具混淆&#xff0c;这里就为大家介绍一下二者的区别。 1…