2019-08-25 纪中NOIP模拟A组
时间:2019-08-25
本文章向大家介绍2019-08-25 纪中NOIP模拟A组,主要包括2019-08-25 纪中NOIP模拟A组使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
T1 [JZOJ6314] Balancing Inversions
题目描述
Bessie 和 Elsie 在一个长为 2N 的布尔数组 A 上玩游戏。
Bessie 的分数为 A 的前一半的逆序对数量,Elsie 的分数为 A 的后一半的逆序对数量。
逆序对指的是满足 A[i]=1 以及 A[j]=0 的一对元素,其中i<j。例如,一段 0 之后接着一段 1 的数组没有逆序对,一段 X 个 1 之后接着一段 Y 个 0 的数组有 XY 个逆序对。
Farmer John 偶然看见了这一棋盘,他好奇于可以使得游戏看起来成为平局所需要交换相邻元素的最小次数。请帮助 Farmer John 求出这个问题的答案。
数据范围
前 $4$ 组数据 $N$ 分别为 $5,20,100,1000$
对于 $100\%$ 的数据,$1 \leq N \leq 10^5$
分析
考场上一直在想这题,绕了好多弯子,最后十分钟差不多想清楚,但是没码完
显然,当不交换中间两元素时,最小交换次数为前后两半的逆序对数差的绝对值
然后可以先枚举将左边 $k$ 个 $1$ 移到右边时的所有情况,同理再枚举移 $0$ 的情况
以移 $1$ 为例,我们可以用两个指针分别指向前半段的尾部和后半段的首部,然后依次向前查找 $1$ 和向后查找 $0$,这样总时间复杂度就是 $O(n)$ 的了
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <queue> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 100005 int n, cnt1, cnt2, pos1, pos2; ll an, bn, ans, len1, len2; int a[N], b[N]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", a + i); if (a[i]) cnt1++; else an += cnt1; } for (int i = 1; i <= n; i++) { scanf("%d", b + i); if (b[i]) cnt2++; else bn += cnt2; } ans = abs(an - bn); pos1 = n; pos2 = 1; len1 = len2 = 0; for (int i = 1; i <= cnt1 && i <= n - cnt2; i++) { while (!a[pos1]) pos1--; len1 += n - pos1; pos1--; while (b[pos2]) pos2++; len2 += pos2 - 1; pos2++; ll sum1 = an - len1 + i * (cnt1 - i); ll sum2 = bn - len2 + i * (n - cnt2 - i); ll now = len1 + len2 + i + abs(sum1 - sum2); ans = min(ans, now); } pos1 = n; pos2 = 1; len1 = len2 = 0; for (int i = 1; i <= n - cnt1 && i <= cnt2; i++) { while (a[pos1]) pos1--; len1 += n - pos1; pos1--; while (!b[pos2]) pos2++; len2 += pos2 - 1; pos2++; ll sum1 = an + len1 - i * cnt1; ll sum2 = bn + len2 - i * (n - cnt2); ll now = len1 + len2 + i + abs(sum1 - sum2); ans = min(ans, now); } printf("%lld", ans); return 0; }
T2 [JZOJ6317] 树
题目描述
数据范围
分析
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <queue> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 100005 int n, from, tot, p = 1e9 + 7; int to[N << 1], nxt[N << 1], head[N]; int book[N << 1]; void add(int u, int v) { to[++tot] = v; nxt[tot] = head[u]; head[u] = tot; } int dp(int x, int fa) { int now = 1; for (int i = head[x]; i; i = nxt[i]) { if (to[i] == fa) continue; if (!book[i]) book[i] = dp(to[i], x); now = (ll)now * (book[i] + 1) % p; } return now % p; } int main() { scanf("%d", &n); for (int i = 2; i <= n; i++) { scanf("%d", &from); add(from, i); add(i, from); } for (int i = 1; i <= n; i++) printf("%d ", dp(i, 0) % p); return 0; }
原文地址:https://www.cnblogs.com/Pedesis/p/11408354.html
- 软件测试金字塔
- Selenium2+python自动化59-数据驱动(ddt)
- 浅谈我对动态规划的一点理解---大家准备好小板凳,我要开始吹牛皮了~~~
- Selenium2+python自动化60-异常后截图(screenshot)
- Cisco Packet Tracer 6.0 实验笔记
- kali 2018.1安装教程
- python接口自动化2-发送post请求
- TypeScript 动态创建类
- Java学习笔记【持续更新】
- 互联网协议入门(二)
- 设计模式六大原则(4):接口隔离原则
- 设计模式六大原则(3):依赖倒置原则
- 闲的无聊时候就手动写第一个漏洞扫描工具吧!
- 模拟退火算法从原理到实战【基础篇】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手把手教你在腾讯云上搭建hadoop3.x伪集群的方法
- Android从网络中获得一张图片并显示在屏幕上的实例详解
- Android ListView中headerview的动态显示和隐藏的实现方法
- Android编程使用Service实现Notification定时发送功能示例
- Android基于ViewFilpper实现文字LED显示效果示例
- Android ViewPager导航小圆点实现无限循环效果
- ViewPager打造轮播图Banner/引导页Guide
- Android 实现带字母索引的侧边栏功能
- Android实现简单底部导航栏 Android仿微信滑动切换效果
- Android中Handler与Message的简单实例
- Android 实现通知消息水平播放、无限循环效果
- 详解xamarin Android 实现ListView万能适配器
- android 设置wallpaper的操作方法
- R语言作图不显示中文解决办法,如何使用中文字体
- Android OKHTTP的单例和再封装的实例