DAY1 共四题:

视频教程:https://www.bilibili.com/video/BV1JX4y1d7LC

作者:Eriktse

简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)

个人博客:www.eriktse.com

月月查华华的手机

  • tag:动态规划

注意:子序列是可以分隔开的,请区别子串和子序列。

我们定义dp[i][j]表示在母串中第i右边最近的字符j的位置,如果不存在则为-1,初始值为-1

倒序处理出dp数组后,对每一个子串进行判断。

判断的思路是:当前在母串的位置j,当前子串字符为k,那么我找dp[j][k]看看是否存在,如果有就让j跳过去,如果没有就说明母串中不存在这个子序列。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 9; char s[maxn]; int dp[maxn][30], now[30];//dp[i][j]表示母串中第i位右边最近的字符j的位置 signed main()
{
memset(dp, -1, sizeof dp);
memset(now, -1, sizeof now); scanf("%s", s + 1);
int n = strlen(s + 1); for(int i = n;i >= 0; -- i)
{
for(int j = 0;j < 26; ++ j)dp[i][j] = now[j];
if(i > 0)now[s[i] - 'a'] = i;
} int T;scanf("%lld", &T);
while(T --)
{
scanf("%s", s + 1);
int m = strlen(s + 1);
bool ans = true; for(int i = 1, j = 0;i <= m; ++ i)
{
int k = s[i] - 'a'; if(dp[j][k] == -1)
{
ans = false;
break;
}
else j = dp[j][k];
}
printf("%s\n", ans ? "Yes" : "No");
} return 0;
}

Rinne Loves Edges

  • tag:简单图论,树

首先以s作为根构造一棵树,fa[x]表示x的父亲。

不难发现,假如我要使得点x为根的子树的所有叶子到不了s,那么可以通过删除x - fa[x]这条边或删除x与所有儿子节点的边,那么对于x的儿子亦是如此。

所以我们就有了dp方程, w[x]xfa[x]的边权,dp[x]表示删除点x的最小代价(代码中的dp用dfs表示):

$$dp[x] = min(w[x], \sum_{y \in g[x] y \neq fa[x]}w[y])$$

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5 + 9, inf = 1e18; int w[maxn];//w[i]表示点i的父亲这条边的边权 vector<pair<int, int> > g[maxn]; int n, m, s; int dfs(int x, int pre)//pre是x的父节点,返回删除节点x和父亲这条边的最小代价
{
//有可能是根
if(g[x].size() == 1 and x != s)return w[x]; int res = 0;//res表示子节点的代价之和
for(auto &i : g[x])
{
int y = i.first, dw = i.second;
//x -> y, cost = dw
if(y == pre)continue;//如果下一个点是当前的父节点,就不进入
w[y] = dw;
res += dfs(y, x);
}
return min(w[x], res);
} signed main()
{
scanf("%lld %lld %lld", &n, &m, &s);
for(int i = 1;i <= m; ++ i)
{
int x, y, w;scanf("%lld %lld %lld", &x, &y, &w);
g[x].push_back({y, w});
g[y].push_back({x, w});
}
w[s] = inf;
printf("%lld\n", dfs(s, 0));
return 0;
}

逆序对

  • tag:组合数学

我们知道只有(1, 0)这样的二元组会对答案产生贡献,那么我们枚举第二位,然后找左边有多少个1即可。

对于第i位,左边有$2^{i - 1}$种情况,每种情况平均都是$\frac{i-1}{2}$个1,然后右边有$2^{n - i}$种情况,会使得区间[0, i]的情况重复多次。

所以第i位的贡献$a_i = 2^{n-1} \times \frac{i-1}{2} = 2 ^ {n-2} \times (i - 1) $。

答案是:

$$ ans=\sum_{i=1}{n}a_i=2\sum_{i=1}{n}(i-1)=2\times n\times (n-1) $$

#include "bits/stdc++.h"

#define int long long

const int mod = 1e9 + 7;

int ksm(int a, int b) {
int res = 1;
while (b > 0) {
if (b & 1) res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
} int mo(int x){return (x % mod + mod) % mod;} signed main() {
int n; std::cin >> n;
if (n == 1) {
std::cout << 0 << "\n";
} else if (n == 2) {
std::cout << 1 << "\n";
} else {
int m = n % mod;
std::cout << mo(m * m % mod - m) * ksm(2, n - 3) % mod;
}
return 0;
}

Xorto

  • tag: map, vector, 异或xor

将所有的异或和结果存到一个map里,每一个异或和结果对应一个vector,里面存下了所有的异或和相同的区间,且按照左端点为第一关键字,右端点为第二关键字的顺序排列好。

#include <bits/stdc++.h>
#define int long long
using namespace std; const int maxn = 1e5 + 9;
int a[maxn]; unordered_map<int, vector<pair<int, int>> > mp; signed main()
{
int n;scanf("%lld", &n);
for(int i = 1;i <= n; ++ i)scanf("%lld", a + i); for(int i = 1;i <= n; ++ i)
{
int xorsum = 0;
for(int j = i;j <= n; ++ j)
{
xorsum ^= a[j];
if(!mp.count(a[j]))mp[a[j]] = vector<pair<int, int> >(); mp[xorsum].push_back({i, j});
}
} int ans = 0; for(auto &it : mp)
{
vector<pair<int, int> >& v = it.second;
//v中的所有区间,异或和都相同
for(int i = 0;i < v.size(); ++ i)
{
int j = upper_bound(v.begin(), v.end(), v[i].second,
[](const int &x, const pair<int, int>& p)
{
return x < p.first;
}) - v.begin();
ans += v.size() - j;
}
}
printf("%lld\n", ans);
return 0;
}

本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞、收藏、留言

【ACM算法竞赛日常训练】DAY1题解与分析的更多相关文章

  1. 【经验总结】Java在ACM算法竞赛编程中易错点

    一.Java之ACM易错点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...

  2. ACM算法竞赛:抄课文

    题目如下: 比如现在要写一句话 Hello world 输入: n (n > 0) 比如输入的n为10,就将Hello world打印十 #include <stdio.h> #in ...

  3. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

  4. 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

  5. 算法竞赛入门经典——读书笔记day1

    1-1:整数值用%d输出,实数用%f输出. 1-2:整数/整数=整数,浮点数/浮点数=浮点数. 1-3:scanf中的占位符和变量的数据类型应一一对应,且每个变量前需要加&符号. 1-4:在算 ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. THUSC2017 Day1题解

    THUSC2017 Day1题解 巧克力 题目描述 "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有 ...

  8. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  9. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  10. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

随机推荐

  1. .netcore 跨域问题

    CORS(跨域资源共享)是一种W3C标准,允许服务器放宽同源策略.使用CORS,服务器可以在显式允许某些跨域请求时拒绝其他跨域请求.CORS是相比其他跨域技术(比如JSONP)更安全.更灵活. ASP ...

  2. react导入的插件不支持服务端渲染报错的解决方法

    正常的导入方法如下: import { useEffect, useState, useRef } from 'react'; 如果不支持服务端渲染的插件这样导入则会报错(具体的报的什么错我忘了),一 ...

  3. lvs模式配置

    lvs模式配置 lvs简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linu ...

  4. PLC入门笔记11

    1.开关? 输入 拨杆开关.点动开关.常开.常闭开关 霍尔接近开关(磁场 N极导通 3线+-DC24V ).电容接近开关(非金属).电感接近开关(金属) 2.输入接线? NPN型,不需要外接电源,直接 ...

  5. mysql授权、导入等基本操作

    1.授权: mysqladmin -uroot password rootpwd mysql -uroot -prootpwd mysql -e "INSERT INTO user (Hos ...

  6. WebStorm 2021.3 的永久激活教程

    关注公众号回复 webstorm 即可获取激活脚本和教程 更新时间 2022年9月2日. 不定时更新 激活码可在公众号中回复[激活码]获取.

  7. 面向对象的练习总结(java)

    三次作业总结博客 l  前言 第一次题目集是我刚刚接触java所做的第一套习题,本次题目难度不大,题量较多,涉及的知识点主要是基础的语法知识,出题人的意图是让我们尽快熟悉java的语法,由于事先有c语 ...

  8. Hive 操作与应用 词频统计

    一.hive用本地文件进行词频统计 1.准备本地txt文件 2.启动hadoop,启动hive 3.创建数据库,创建文本表 4.映射本地文件的数据到文本表中 5.hql语句进行词频统计交将结果保存到结 ...

  9. 这几年专注于流程管理与RPA落地

    这些年专注于流程管理与RPA落地,乙方有些辛苦,但,也得到了客户的认可,开心. 做过多个流程管理咨询,发现信息化落地后孤岛很多,RPA 刚好可以作为各个系统的有效补充,把系统有机的结合在一起. 企业信 ...

  10. Manage your references to .Net assemblies Dynamics 365 for Operations VS projects

    (Dynamics 365 for Operations was previously known as the New Dynamics AX) Dynamics 365 for Operation ...