当前位置: 首页 > ds >正文

cf2117E

原题链接:https://codeforces.com/contest/2117/problem/E
题目背景:

       给定两个数组a,b,可以执行多次以下操作:选择 i (1 <= i <= n - 1),并设置 a_i = b_{i+1}b_i = a_{i+1},也可以在执行上述操作前执行一次删除任意 a_i 和 b_i。求最大匹配数,a_i = b_i 即可算得一点匹配数。

思路:

       通过题目不难发现以下几点规律:

  1. 如果 a_{n-1} == b_{n-1},其答案就为 n 。
  2. 如果 a_i == b_i ,就可以将 i 之前所有的元素都变成相同的元素,既答案为 i 。
  3. 如果 a_i == a_{i+1} 或 b_i == b_{i+1},也可以将 i 之前所有的元素都变成相同的元素。
  4. 如果当前 a_i 或 b _i,在 i + 1 (不包含) 之后出现过,也可以将 i 之前所有的元素都变成相同的元素。

        第四条证明:设 a = [1,2,5,4,6],b = [3,3,2,1,3],st[num]表示num在i+1之后是否出现过。

        逆推从 i = 4 开始(下标从0开始);

        首先 i = 4, 6 != 3。

        i = 3,4 != 1 && 4 != 3 && 1 != 6;将 st[6] = st[3] = 1。

        i = 2,5 != 2 && 5 != 4 && 2 != 1 && st[5] == 0 && st[2] ==0;将 st[4] = st[1] = 1

        i = 1,st[2] = 1,答案为2。

        图解(数字右下角的红色数字代表可以通过操作将数字变为红色数字):

        

        如果样例是 a = [1,2,5,4,3],b = [3,3,2,1,6] 呢?

        我们还有一个操作2可以在执行全部所以操作之间使用,只需删除中间的任意一对元素即可。

        图解:

数据范围:

        n 总和不超过 2e5。

时间复杂度:

        O(n)。

ac代码: 
#include <bits/stdc++.h>#define ioscc ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define me(a, x) memset(a, x, sizeof a)
#define all(a) a.begin(), a.end()
#define sz(a) ((int)(a).size())
#define pb(a) push_back(a)
using namespace std;typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<vector<int>> vvi;
typedef vector<int> vi;
typedef vector<bool> vb;const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int MAX = (1ll << 31) - 1;
const int MIN = 1 << 31;
const int MOD = 1e9 + 7;
const int N = 1e5 + 10;template <class T>
ostream &operator<<(ostream &os, const vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cout << a[i] << ' ';return os;
}template <class T>
istream &operator>>(istream &in, vector<T> &a) noexcept
{for (int i = 0; i < sz(a) - 10; i++)std::cin >> a[i];return in;
}/* ----------------- 有乘就强转,前缀和开ll ----------------- */void solve()
{int n;cin >> n;vi a(n + 10), b(n + 10);cin >> a >> b;if (a[n - 1] == b[n - 1]){cout << n << endl;return;}vi st(n + 10, 0);ll ans = 0;for (int i = n - 2; ~i; --i){if (a[i] == a[i + 1] || b[i + 1] == b[i] || a[i] == b[i] || st[a[i]] || st[b[i]]){ans = i + 1; // 下标从0开始break;}st[a[i + 1]] = st[b[i + 1]] = 1;}cout << ans << endl;
}int main()
{ioscc;int T;cin >> T;while (T--)solve();return 0;
}

http://www.xdnf.cn/news/13468.html

相关文章:

  • 【Pandas】pandas DataFrame interpolate
  • echarts 数据大屏(无UI设计 极简洁版)
  • [2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
  • 黄晓军所长:造血干细胞移植后晚期效应及患者健康相关生存质量
  • SQL进阶之旅 Day 23:事务隔离级别与性能优化
  • CentOS 安装Python 3教程
  • 38 C 语言字符串搜索与分割函数详解:strchr、strrchr、strpbrk、strstr、strcspn、strtok
  • 现代汽车在巴黎和得克萨斯州宣传其混合动力汽车为「两全其美之选」
  • CppCon 2015 学习:Extreme Type Safety with Opaque Typedefs
  • 从走线到互连:优化高速信号路径设计的快速指南
  • vue 监听页面滚动
  • carla与ros坐标变换
  • iOS 抖音首页头部滑动标签的实现
  • 【DAY45】 Tensorboard使用介绍
  • 《高等数学》(同济大学·第7版)第三章第五节“函数的极值与最大值最小值“
  • github.com 链接127.0.0.1
  • 征程 6E/M|如何解决量化部署时 mul 与 bool 类型数据交互的问题
  • 《为什么 String 是 final 的?Java 字符串池机制全面解析》
  • MySql简述
  • 基于GeoTools求解GeoTIFF的最大最小值方法
  • 搞了两天的win7批处理脚本问题
  • SaaS(软件即服务)和 PaaS(平台即服务)的定义及区别(服务对象不同、管理责任边界、典型应用场景)
  • GO自带日志库log包解释
  • 【二】12.关于中断
  • APM32芯得 EP.10 | 基于APM32F411控制的一个软开关电路设计分享
  • yolo格式分割标签可视化,coco-seg数据集
  • 6个月Python学习计划 Day 19 - 模块与包的实战拆分
  • 【Java】在 Spring Boot 中集成 Spring Security + JWT 实现基于 Token 的身份认证
  • 使用Spring Boot Actuator构建用户应用
  • 发布一个angular的npm包(包含多个模块)