首页 > 其他分享 >暴力 做题笔记

暴力 做题笔记

时间:2024-08-17 10:26:59浏览次数:12  
标签:暴力 min int 笔记 edge dfs 序列 dp

在这个随笔中,会有笔者的一些做题笔记,包括但不限于暴力的思想、解题技巧、代码实现等。

CF850B Arpa and a list of numbers

TAG: \(\texttt{暴力,数学}\)

题意

Arpa and a list of numbers

题面翻译

我们认为一个序列是坏序列,当且仅当该序列非空且 \(\operatorname{gcd}\) 是 \(1\)。现在有两种操作:

  1. 删除一个数,代价为 \(x\)。
  2. 给一个数 \(+1\),代价为 \(y\)。

现给出该序列和 \(x,y\),求将给定序列变为好序列的最小代价。

\(n\leq 10^5\)。

题解

\(dp_{i,S,P}\) 为 \(i\) 的子树内是否存在 SP 的状态。

转移方程为:

当 \(s_i\) 为 C

dp[x][0][0] += min({ dp[v][1][0] + 1, dp[v][0][1] + 1, dp[v][0][0] });
dp[x][1][0] += min({ dp[v][0][0], dp[v][1][0], dp[v][0][1] + 1 });
dp[x][0][1] += min({ dp[v][0][0], dp[v][1][0] + 1, dp[v][0][1] });

当 \(s_i\) 为 S

dp[x][1][0] += min({ dp[v][1][0], dp[v][0][1] + 1, dp[v][0][0] });

当 \(s_i\) 为 P

dp[x][0][1] += min({ dp[v][1][0] + 1, dp[v][0][1], dp[v][0][0] });

代码
\(\texttt{Link}\): https://codeforces.com/problemset/submission/1926/276856210

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 9;
int n, x;
int dp[N][2][2];
string s;
vector<int> edge[N];

void dfs(int x) {
    dp[x][0][0] = dp[x][1][0] = dp[x][1][1] = dp[x][0][1] = 0;
    if (s[x] == 'S') dp[x][0][1] = dp[x][0][0] = 1e9;
    if (s[x] == 'P') dp[x][1][0] = dp[x][0][0] = 1e9;
    for (int i : edge[x]) {
        dfs(i);
        if (s[x] == 'C') {
            dp[x][0][0] += min({ dp[i][1][0] + 1, dp[i][0][1] + 1, dp[i][0][0] });
            dp[x][1][0] += min({ dp[i][0][0], dp[i][1][0], dp[i][0][1] + 1 });
            dp[x][0][1] += min({ dp[i][0][0], dp[i][1][0] + 1, dp[i][0][1] });
        }
        if (s[x] == 'S') 
            dp[x][1][0] += min({ dp[i][1][0], dp[i][0][1] + 1, dp[i][0][0] });
        if (s[x] == 'P') 
            dp[x][0][1] += min({ dp[i][1][0] + 1, dp[i][0][1], dp[i][0][0] });
    }
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) edge[i].clear();
    for (int i = 2; i <= n; i++) {
        cin >> x;
        edge[x].push_back(i);
    }
    cin >> s; s = " " + s;
    dfs(1);
    cout << min({ dp[1][1][0], dp[1][0][1], dp[1][0][0] }) << "\n";
}

signed main() {
    int t;
    cin >> t;
    while (t--) solve();
    return 0;
}

标签:暴力,min,int,笔记,edge,dfs,序列,dp
From: https://www.cnblogs.com/kimi0705/p/18364100/ForcesProblem

相关文章

  • 打造编程学习的高效笔记系统
    在编程学习的道路上,笔记不仅仅是知识的简单记录,更是我们理解、吸收和应用知识的重要工具。一个高效的笔记系统能够帮助我们更好地组织思路、加深记忆,并在需要时迅速找到所需的信息。那么,如何才能打造这样一个既实用又高效的编程学习笔记系统呢?目录一、笔记工具选择二、笔......
  • IO流体系全套复习笔记
    IO流体系一、字节流(文件,byte)1、FileInputStream作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读到内存中去。实现类:publicFileInputStream(Filefile);pubilcFileInputStream(Stringpathname);(推荐使用)方法:read(buffer,0,len)(常用,读多少取多少)2、......
  • webrtc学习笔记4
    一对一通话(1)信令设计;(2)媒体协商;(3)加入Stream/Track;(4)网络协商四大块继续讲解通话原理信令协议设计join加入房间1varjsonMsg={2'cmd':'join',3'roomId':roomId,4'uid':localUserId,5};resp­join当join房间后发现房间已经存在另一个人时则返回另一个人......
  • 指针学习笔记
    变量指针地址地址是数据(变量)储存的位置,地址也是数据。存放地址的变量叫指针变量,简称指针。指针变量的大小在\(32\)位操作系统上地址用\(32\)位二进制整数表示,所以一个指针的大小为\(4\)字节;在\(64\)位操作系统上地址用\(64\)位二进制整数表示,所以一个指针的大......
  • 【Vue2学习笔记】基础(持续更新)
    一、vue介绍什么是vue?Vue是一套用于构建用户界面的渐进式框架。Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层。vue特点1.采用组件式开发,提高代码复用率,且让代码更高维护2.声明式编码,让编码人员无需dom操作,提高开发效率3.使用虚拟机dom和优秀的di......
  • 算法笔记——可持久化线段树
    维护历史值当要修改一个节点时,把跟他有关的线段树中所有节点舍弃,并建立新节点连接.代码如下:#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;intn,m,a[N],root[N],top;structnode{ intl,r,val;}t[N*40];intclone(intx)//新建节点{ top++; t......
  • 统计学(贾俊平)学习笔记--第二章
    本章主要讲解了数据来源、调查方法、试验方法,以及数据抽样误差、非抽样误差,误差产生的原因等内容。该章内容较简单,不在仔细分析。这些也是数据来源的方法,大家可以了解。抽样误差(samplingerror)是由抽样的随机性引起的样本结果与总体真值之间的差异。影响抽样误差大小的因素......
  • 简单的linux系统学习笔记——01
    一、准备环境1.创建虚拟主机软件:vmware(是一个管理虚拟机的平台)vmware官网流程:1.点击创建新的虚拟机2.选择自定义3.兼容选最大4.选稍后安装操作系统5.选择想创建的系统6.命名,选择位置(保存位置)7.选择cpu和内存配置8.选nat模式9.选推荐10.创建新的虚拟磁盘11设置磁......
  • 简单的linux系统学习笔记——07
    一、虚拟机克隆本体删了,克隆机也会消失1.先关闭虚拟机2.右键虚拟机点管理,点击克隆3.克隆源选择“虚拟机中的当前状态”4.克隆类型选择“创建链接克隆”5.编辑虚拟机名字,设置存放路径6.点击完成7.修改主机名8.更改ip,修改网卡9.重启,保存快照二、文件文件属性:1)权限2......
  • Leetcode刷题笔记8.12-8.16
    Leetcode刷题笔记8.12-8.1619.删除倒数第n个链表结点(8.12)一个巧妙删除倒数第n个结点的trick该方法避免了对链表的一次全面扫描来获得总长度//返回链表的倒数第k个节点ListNodefindFromEnd(ListNodehead,intk){ListNodep1=head;//p1先走k步......