2024.3.4训练记录(8)

文章目录

  • CF 459D Pashmak and Parmida's problem
  • CF 1388C Uncle Bogdan and Country Happiness
  • CF 1525D Armchairs
  • CF 220B Little Elephant and Array

CF 459D Pashmak and Parmida’s problem

题目链接

最近感觉对数据结构题的反应度提升了,这一题是上午看的但是当时旁边没电脑,傍晚这会儿可能思路就出现了点偏差,想到了树状数组+前缀,应该是能独立写出来的一道题

正着反着各跑一遍前缀和,记录下每个数是第几次出现,把反着跑的结果存到树状数组里,之后遍历原数组,答案每次加上当前数后方的出现次数比当前数小的个数

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 1e6 + 10;
const int mod = 998244353;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;int tr[N];int lowbit(int x)
{return x & -x;
}void add(int pos, int x)
{for (int i = pos; i < N; i += lowbit(i)) tr[i] += x;
}int query(int pos)
{int res = 0;for (int i = pos; i > 0; i -= lowbit(i)) res += tr[i];return res;
}void solve()
{int n, ans = 0;cin >> n;vector<int> a(n);for (int i = 0; i < n; i ++ ) cin >> a[i];map<int, int> mp;vector<int> pre(n), back(n);for (int i = 0; i < n; i ++ ){mp[a[i]] ++ ;pre[i] = mp[a[i]];}mp.clear();for (int i = n - 1; i >= 0; i -- ){mp[a[i]] ++ ;back[i] = mp[a[i]];}for (int i = 0; i < n; i ++ ) add(back[i], 1);for (int i = 0; i < n; i ++ ){add(back[i], -1);ans += query(pre[i] - 1);}cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t -- ){solve();}
}

CF 1388C Uncle Bogdan and Country Happiness

题目链接

也是上午看的一道题,思路非常正确,但还是经不住晕递归,调了很久,赛时看不到错误数据估计要调更久,唉

先dfs算一下每个点有多少人经过,然后再dfs给每个点分配开心的人数,如果有一个点不能分配就no,否则yes

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 1e6 + 10;
const int mod = 998244353;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n, m;cin >> n >> m;vector<int> p(n + 1), h(n + 1);for (int i = 1; i <= n; i ++ ) cin >> p[i];for (int i = 1; i <= n; i ++ ) cin >> h[i];vector<vector<int>> g(n + 1);for (int i = 0; i < n - 1; i ++ ) {int x, y;cin >> x >> y;g[x].push_back(y);g[y].push_back(x);}vector<int> pass(n + 1); // 每个点经过多少人function<void(int, int)> dfs1 = [&](int u, int fa){for (int i = 0; i < g[u].size(); i ++ ){int j = g[u][i];if (j == fa) continue;dfs1(j, u);pass[u] += pass[j];}pass[u] += p[u];};dfs1(1, -1);function<bool(int, int, int)> dfs2 = [&](int u, int fa, int ha){for (int i = 0; i < g[u].size(); i ++ ){int j = g[u][i];if (j == fa) continue;if ((h[j] < 0 && h[j] >= -pass[j]) || (h[j] >= 0 && h[j] <= pass[j])){if ((h[j] + pass[j]) % 2 != 0) return false;if ((h[j] + pass[j]) / 2 > min(ha, pass[j]) || (h[j] + pass[j]) / 2 < 0) return false;if (!dfs2(j, u, (h[j] + pass[j]) / 2)) return false;ha -= (h[j] + pass[j]) / 2;}else return false;}return true;};if (h[1] < -m || h[1] > m || (h[1] + m) % 2 != 0) cout << "NO\n";else if (dfs2(1, -1, (h[1] + m) / 2)) cout << "YES\n";else cout << "NO\n";
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t -- ){solve();}
}

CF 1525D Armchairs

题目链接

dp

看到数据范围就想到dp,甚至连状态表示都构造出来了还搞不出来转移方程,真是没脑子啊

dp[i][j] 表示前 i 个需要变动的位置挪到前 j 个空位需要的最小代价

转移方程: dp[i][j] = min(dp[i][j - 1], dp[i - 1][j - 1] + abs(a[i] - b[j]))

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 1e6 + 10;
const int mod = 998244353;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n;cin >> n;vector<int> a, b;a.push_back(0), b.push_back(0);for (int i = 1; i <= n; i ++ ){int x;cin >> x;if (x) a.push_back(i);else b.push_back(i);}vector<vector<int>> dp(n + 1, vector<int>(n + 1, INF));for (int i = 0; i < b.size(); i ++ ) dp[0][i] = 0;for (int i = 1; i < a.size(); i ++ ){for (int j = 1; j < b.size(); j ++ ){dp[i][j] = min(dp[i][j - 1], dp[i - 1][j - 1] + abs(a[i] - b[j]));}}cout << dp[a.size() - 1][b.size() - 1] << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t -- ){solve();}
}

CF 220B Little Elephant and Array

题目链接

莫队的板子修改一下,太久没碰到过莫队居然已经完全忘记这个东西了

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;
typedef pair<PII, int> PPI;const int N = 1e6 + 10;
const int mod = 998244353;
const int maxn = 1e6 + 10;
const int mod1 = 954169327;
const int mod2 = 906097321;
const int INF = 0x3f3f3f3f3f3f3f3f;void solve()
{int n, m;cin >> n >> m;int size = sqrt(n);int bnum = ceil((double)n / size); // 把序列分成了多少块vector<int> belong(1e6 + 10);for (int i = 1; i <= bnum; i ++ )for (int j = (i - 1) * size + 1; j <= i * size; j ++ ){belong[j] = i; // 标记每个元素属于哪个块}vector<int> a(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i];vector<PPI> q(m);for (int i = 0; i < m; i ++ ){cin >> q[i].first.first >> q[i].first.second;q[i].second = i;}function<bool(PPI a, PPI b)> cmp = [&](PPI a, PPI b){if (belong[a.first.first] != belong[b.first.first]) return belong[a.first.first] < belong[b.first.first];else{if (belong[a.first.first] % 2 == 1) return belong[a.first.second] < belong[b.first.second];else return belong[a.first.second] > belong[b.first.second];}};sort(q.begin(), q.end(), cmp);int l = 1, r = 0, cnt = 0;unordered_map<int, int> mp;vector<int> ans(m);// 添加数function<void(int)> add = [&](int pos){mp[a[pos]] ++ ;if (mp[a[pos]] == a[pos]) cnt ++ ;if (mp[a[pos]] == a[pos] + 1) cnt -- ;};// 删除数function<void(int)> del = [&](int pos){if (mp[a[pos]] == a[pos]) cnt -- ;if (mp[a[pos]] == a[pos] + 1) cnt ++ ;mp[a[pos]] -- ;};for (int i = 0; i < m; i ++ ){int ql = q[i].first.first, qr = q[i].first.second;while (l < ql) del(l++); // 如左指针在查询区间左方,左指针向右移直到与查询区间左端点重合while (l > ql) add(--l); // 如左指针在查询区间左端点右方,左指针左移while (r < qr) add(++r); // 右指针在查询区间右端点左方,右指针右移while (r > qr) del(r--); // 否则左移ans[q[i].second] = cnt;}for (int i = 0; i < m; i ++ ) cout << ans[i] << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t -- ){solve();}
}

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

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

相关文章

动态规划(算法竞赛、蓝桥杯)--树形DP树形背包

1、B站视频链接&#xff1a;E18 树形DP 树形背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int n,V,p,root; int v[N],w[N]; int h[N],to[N],ne[N],tot; //邻接表 int f[N][N];void add(int a,int b){to[tot]b;ne[tot]h[a];h[a…

数仓项目6.0(一)

尚硅谷大数据项目【电商数仓6.0】企业数据仓库项目_bilibili 数据流转过程 用户➡️业务服务器➡️数据库存储➡️数仓统计分析➡️数据可视化 数据仓库处理流程&#xff1a;数据源➡️加工数据➡️统计筛选数据➡️分析数据 数据库不是为了数据仓库服务的&#xff0c;需要…

B084-SpringCloud-Zuul Config

目录 zuul系统架构和zuul的作用zuul网关实现配置映射路径过滤器 Config概述云端管理本地配置 zuul zuul是分布式和集群后前端统一访问入口 系统架构和zuul的作用 zuul把自己注册进eureka&#xff0c;然后可通过前端传来的服务名发现和访问对应的服务集群 为了预防zuul单点故…

Java 枚举类的深入理解与应用

Java 的枚举类是一种特殊的类&#xff0c;通常表示一组常量。在编译或设计时&#xff0c;当我们知道所有变量的可能性时&#xff0c;尽量使用枚举类型。本文将通过一个具体的例子&#xff0c;深入探讨 Java 枚举类的定义、使用和高级特性。 目录 枚举类的定义与使用枚举类的构造…

【OJ】求和与计算日期

文章目录 1. 前言2. JZ64 求123...n2.1 题目分析2.2 代码 3. HJ73 计算日期到天数转换3.1 题目分析3.2 代码 4. KY222 打印日期4.1 题目分析4.2 代码 1. 前言 下面两个题目均来自牛客&#xff0c;使用的编程语言是c&#xff0c;分享个人的一些思路和代码。 2. JZ64 求123…n …

Vue 赋值后原数据随赋值后的数据的变化而变化

很常见的&#xff0c;当我们直接用“”号等方式直接赋值后 原数据会随赋值后的数据的变化而变化 但是有时候我们的需求是不需要原数据跟随变化 所以怎么解决呢&#xff1f; 解决办法有&#xff1a; 1.使用Object.assign() 方法 2.使用深拷贝函数 JSON.parse() 3.使用第三方库lo…

毕业生信息招聘平台|基于springboot+ Mysql+Java的毕业生信息招聘平台设计与实现(源码+数据库+文档+PPT)

目录 论文参考 摘 要 数据库设计 系统详细设计 文末获取源码联系 论文参考 摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 毕业生信息招聘平台&#xff0c;主要的模块包括查看管理员&a…

#ifndef 和 #pragma once的区别

#ifndef 和 #pragma once 都是用来防止头文件被重复包含的&#xff0c;但它们的工作方式和兼容性有所不同&#xff1a; #ifndef 是 C 的标准语法&#xff0c;它依赖于不重复的宏名称&#xff0c;保证了包含在 #endif 的内容不会被重复包含。这个内容可以是一个文件的所有内容&…

Webpack配置与运行基础教程

在前端开发中&#xff0c;Webpack是一款非常流行的模块打包工具&#xff0c;它可以帮助我们将多个文件打包成一个或多个静态资源文件&#xff0c;从而提高前端项目的性能和可维护性。本文将为你介绍Webpack的基础配置和运行方法&#xff0c;帮助你快速上手Webpack。 什么是Web…

基于Springboot的无人智慧超市管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的无人智慧超市管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

1.3 有哪些文本表示模型?它们各有什么优缺点?

1.3 有哪些文本表示模型?它们各有什么优缺点? 场景描述 文本是一类非常重要的非结构化数据&#xff0c;如何表示文本数据一直是机器学习领域的一个重要研究方向。 知识点 词袋模型(Bag of Words)TF-IDF(Term Frequency-Inverse DocumentFrequency)主题模型(Topic Model)词…

【每日刷题】数组-LC56、LC238、随想录1、LC560

1. LC56 合并区间 题目链接 Arrays.sort先让intervals里的子数组按照子数组的第一个数字值从小到大排列。开一个新数组&#xff0c;newInterval&#xff0c;存放合并好的子数组让intervals的当前子数组i的第一个数字与newInterval的当前子数组index的最后一个数字比较大小&am…

ARM 架构下国密算法库

目录 前言GmSSL编译环境准备下载 GmSSL 源码编译 GmSSL 源码SM4 对称加密算法SM2 非对称加密算法小结前言 在当前的国际形式下,国替势不可挡。操作系统上,银河麒麟、统信 UOS、鸿蒙 OS 等国产系统开始发力,而 CPU 市场,也是百花齐放,有 龙芯(LoongArch架构)、兆芯(X86…

Intel/国产化无人叉车机器视觉专用控制器

无人叉车和机器视觉是两个独立的技术领域&#xff0c;但它们可以结合使用以实现更高效的物流自动化。无人叉车是一种自动化运输工具&#xff0c;可以在没有人为干预的情况下完成货物的搬运和运输。机器视觉是一种人工智能技术&#xff0c;可以让计算机识别和理解图像或视频中的…

YOLO:实时目标检测的革命

目标检测作为计算机视觉领域的一个核心任务&#xff0c;一直以来都是研究的热点。而YOLO&#xff08;You Only Look Once&#xff09;技术作为其中的杰出代表&#xff0c;以其独特的处理方式和卓越的性能&#xff0c;成为了实时目标检测的标杆。本文将探讨YOLO技术的核心原理、…

FPGA时序约束与分析--建立时间与保持时间

文章目录 前言一、定义二、举例说明2.1 建立时间违规2.2 保持时间违规前言 时序约束的定义–设计者根据实际的系统功能,通过时序约束的方式提出时序要求; FPGA 编译工具根据设计者的时序要求,进行布局布线;编译完成后, FPGA 编译工具还需要针对布局布线的结果,套用特定的…

【C++】每日一题,189 轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,…

搜索回溯算法(DFS)1------递归

目录 简介&#xff1a; 递归问题解题的思路模板 例题1&#xff1a;汉诺塔 例题2&#xff1a;合并两个有序链表 例题3&#xff1a;反转链表 例题4&#xff1a;两两交换链表中的节点 例题5&#xff1a;Pow&#xff08;x,n&#xff09;-快速幂 结语&#xff1a; 简介&…

嵌入式驱动学习第二周——断言机制

前言 这篇博客来聊一聊C/C的断言机制。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 目录 前言1. 断言介绍…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油…