CF1479B1 Painting the Array I
CF1479B1 Painting the Array II

题意:

本题与 CF1480D2 的唯一区别是本题询问最大可能解.

给定一个数组a,你将ai染为bi色,其中b是由你指定的一个01数组.将a数组中被染成0色的数字取出来并依在a中出现的顺序排列,组成数组a(0).同理,将a数组中被染成1色的数字取出来并依在a中出现的顺序排列,组成数组a(1).给定一个数组 a, 你将 a_i染为 b_i色, 其中 b 是由你指定的一个 01 数组. 将 a 数组中被染成 0 色的数字取出来并依在 a 中出现的顺序排列, 组成数组 a^{(0)}. 同理, 将 a 数组中被染成 1 色的数字取出来并依在 a 中出现的顺序排列, 组成数组 a^{(1)}.给定一个数组a,你将ai​染为bi​色,其中b是由你指定的一个01数组.将a数组中被染成0色的数字取出来并依在a中出现的顺序排列,组成数组a(0).同理,将a数组中被染成1色的数字取出来并依在a中出现的顺序排列,组成数组a(1).

我们定义seg(c)是一个正整数,其中c是一个数组,seg(c)的值为在我们将c中相邻的所有相同元素合并后,c数组的大小.例如,seg([1,1,4,5,1,4])=∣[1,4,5,1,4]∣=5.最大化seg(a(0))+seg(a(1))我们定义 seg(c) 是一个正整数, 其中 c 是一个数组, seg(c) 的值为在我们将 c 中相邻的所有相同元素合并后, c 数组的大小. 例如, seg([1, 1, 4, 5, 1, 4]) = |[1, 4, 5, 1, 4]|=5. 最大化 seg(a^{(0)})+seg(a^{(1)})我们定义seg(c)是一个正整数,其中c是一个数组,seg(c)的值为在我们将c中相邻的所有相同元素合并后,c数组的大小.例如,seg([1,1,4,5,1,4])=∣[1,4,5,1,4]∣=5.最大化seg(a(0))+seg(a(1))

题解:

贪心策略,问题D1,如果我们想让值更大,就要尽可能避免相同数字相邻的情况,现在有两数组a0a^0a0和a1a^1a1,那么我们可以这样把其当作栈,分配数组a时,尽可能让相同元素岔开

  1. 如果第一个栈顶==第二个栈顶,那ai随便放一边都行,
  2. 如果第一个栈顶!=第二个,且第一个栈顶=aia_{i}ai​,那么就把ai放在另一个栈中
  3. 如果第一个栈顶!=第二个,且第二个栈顶=aia_{i}ai​,那么就把ai放在另一个栈中
  4. 如果两个栈都不等于ai,且两个栈顶也不一样,貌似此时怎么放都行?但并不是因为我们所放的位置会影响后面的决定,因为放完就成为新的栈顶了。此时我们引入nxt数组,nxt[x]表示下一个axa_{x}ax​的位置。我们比较两个栈顶的nxt,越小说明相同元素再出现越接近,就更需要我们用不同的元素去隔开

D2问题就是反过来统计答案

代码:

D1

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef ONLINE_JUDGE
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=2e5+9;
int a[maxn];
int nxt[maxn];
int id[maxn];
vector<PII>x,y;
int main()
{//rd_test();int n;read(n);for(int i=1;i<=n;i++){read(a[i]);id[i]=n+1;}for(int i=n;i>=1;i--){nxt[i]=id[a[i]];id[a[i]]=i;}x.push_back({0,n+1});y.push_back({0,n+1});int ans=0;for(int i=1;i<=n;i++){if(a[i]==x.back().first&&a[i]==y.back().first){x.push_back({a[i],nxt[i]});}else if(a[i]==x.back().first){y.push_back({a[i],nxt[i]});ans++;}else if(a[i]==y.back().first){x.push_back({a[i],nxt[i]});ans++;}else {ans++;if(x.back().second>y.back().second){y.push_back({a[i],nxt[i]});}else x.push_back({a[i],nxt[i]});}}cout<<ans<<endl;//Time_test();
}

D2

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef ONLINE_JUDGE
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=2e5+9;
int a[maxn];
int nxt[maxn];
int id[maxn];
vector<PII>x,y;
int main()
{//rd_test();int n;read(n);for(int i=1;i<=n;i++){read(a[i]);id[i]=n+1;}for(int i=n;i>=1;i--){nxt[i]=id[a[i]];id[a[i]]=i;}x.push_back({0,n+1});y.push_back({0,n+1});int ans=0;for(int i=1;i<=n;i++){if(a[i]==x.back().first&&a[i]==y.back().first){x.push_back({a[i],nxt[i]});}else if(a[i]==x.back().first){x.push_back({a[i],nxt[i]});}else if(a[i]==y.back().first){y.push_back({a[i],nxt[i]});}else {ans++;if(x.back().second>y.back().second){x.push_back({a[i],nxt[i]});}else y.push_back({a[i],nxt[i]});}}cout<<ans<<endl;//Time_test();
}

CF1479B Painting the Array相关推荐

  1. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  2. CodeForces - 1480D2 Painting the Array II(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 小.对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]! ...

  3. CodeForces - 1480D1 Painting the Array I(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 大.对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]! ...

  4. Codeforces Round #700 (Div. 2) D1 D2. Painting the Array 思维

    link 题意: 给一个数组,让你从头开始选出一些数放在AAA数组中,剩下的放在BBB数组中,且是有序选择,让后把两个数组中相邻且相等的元素合并. D1: 使合并后Len(A)+Len(B)Len(A ...

  5. 1480 D2. Painting the Array II(贪心)

    传送门 题目大意 把数组 a a a分成两个不相交的子数组 a 0 a^0 a0和 a 1 a^1 a1 要求 s e g ( a 0 ) seg(a^0) seg(a0)和 s e g ( a 1 ...

  6. Codeforces Round #700 (Div. 2) A ~ E ,6题全,超高质量良心题解【每日亿题】2021/2/8

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Yet Another String Game B - The Great Hero C ...

  7. Codeforces Round #700 (Div. 1Div. 2)

    Codeforces Round #700 (Div. 1&&Div. 2) 题号 题目 知识点 A Yet Another String Game 签到 B The Great He ...

  8. Codeforces Round #700 (Div. 2)A~D2解题报告

    Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/ ...

  9. Java刷新Jpanel_java – 刷新JPanel

    我需要在JPanel上显示不同的图纸. 我已将绘图文件放入数组中,但是当我使用按钮更改它时,JPanel仅显示第一个绘图并且不会更改为下一个绘图- 我调用了panel.revalidate(),但它不 ...

最新文章

  1. opencv倾斜矫正
  2. 【Groovy】集合遍历 ( 使用集合的 reverseEach 方法进行遍历 | 倒序集合迭代器 ReverseListIterator 类简介 | 代码示例 )
  3. Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
  4. AM8不能下任何载附件及所有聊天记录无法登记
  5. 【转】15个最受欢迎的Python开源框架
  6. CentOS下ZooKeeper单机模式、集群模式安装
  7. 程序员过关斩将--应对高并发系统有没有通用的解决方案呢?
  8. 图数据库_ONgDB图数据库与Spark的集成
  9. 【我的物联网成长记1】如何进行端到端开发?
  10. Kubernetes 1.4安装后查看记录
  11. 利用keras训练自己的图片数据集
  12. VM14 启动Ubutun16.04 黑屏,实用解决办法
  13. codesys file读写配置参数程序
  14. 通用电气公司要破产?美国慌不慌?
  15. 智能对话机器人开发实战案例剖析(2)
  16. 神经网络衣服分类器详解(Fashion-MNIST数据集)
  17. 传统的人事管理与人力资源管理有什么区别,后者有了什么新突破?
  18. [刷机教程] [Root] S-OFF的同学来Root你的HTC Desire S
  19. Credit Card Fraud Detection(信用卡欺诈检测相关数据集)
  20. 简单开发的android阅读器源码,包含了读取数据库和文件流处理功能

热门文章

  1. 没有什么是日本牛郎店做不到的......
  2. 猪肉上的红章和蓝章有啥不同?| 今日趣图
  3. 国庆中秋活动——读完这两套书,宝宝就变小小物理学家了!
  4. 读书笔记-互联网思维必读10本书之一《免费》
  5. 安富莱v6开发板网口通讯_安富莱嵌入式周报第170期:2020.07.202020.07.26
  6. python sqllite远程_Python实现Sqlite将字段当做索引进行查询的方法
  7. python多线程 不在main_从python线程(不是main)启动pyQt线程有什么不...
  8. php mysql 执行sql文件_PHP执行SQL文件并将SQL文件导入到数据库_PHP
  9. qbuttongroup如何都不选中_全程马拉松,半程马拉松该如何跑?很多人都不知道这些细节...
  10. 50万数据生成6位数不重复字符串_R语言系列3:高级数据管理