Three Days Ago

我们定义一个只由数字构成的字符串中的字符能够被重排成相同的两份,我们称这个字符串是个好字符串,比如12341234

现在给定一个字符串\(S\),找出所有的\([l,r]\),使得在这段区间中的子段是个好字符串

题解:思维 + 组合计数

首先我们根据题意得到:一个好字符串中所有相同数字出现的次数一定是偶数

我们考虑维护一个前缀\(0-9\)每个数字出现次数的奇偶性的状态

  20230322
0:00000000
1:00100000
2:10100000
3:10000000
4:10010000
5:00010000
6:00000000
7:00100000
8:00000000

我们发现如果前缀\(i\)时的状态等于前缀\(j\)时的状态,说明在\([i+1,j]\)这段区间中每个数字出现的次数都为偶数次,因为如果前缀\(j\)的状态中数字\(x\)出现的次数为奇数次,前缀\(i\)的状态中数字\(x\)出现的次数也是奇数次,说明\([i+1,j]\)之间\(x\)出现的次数一定为偶数;如果\(x\)出现的次数为偶数次不再赘述

所以我们不妨使用哈希表记录每个状态出现的次数,然后如果某个状态出现超过两次,说明一定有合法的区间,我们利用组合计数求出贡献即可

#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define debug(x) cerr << #x << '=' << x << endl
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 5e5 + 10, M = 4e5 + 10; map<string, int> mp;
int cnt[10]; void solve()
{
string s;
cin >> s;
int n = s.length();
string t = "0000000000";
mp[t]++;
s = " " + s;
for (int i = 1; i <= n; ++i)
{
cnt[s[i] - '0']++;
if (cnt[s[i] - '0'] % 2 == 0)
t[s[i] - '0'] = '0';
else
t[s[i] - '0'] = '1';
mp[t]++;
}
int ans = 0;
for (auto [x, y] : mp)
{
ans += y * (y - 1) / 2;
}
cout << ans << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}

Minimum Reachable City

给定一颗点数为 \(N\) 的树,初始 \(p_i(1\leq p_i \leq i,1 \leq i < N)\) 连向 \(i+1\)。

\(Q\) 次操作,有两种:

  • 1 u v:\(u\) 向 \(v\) 连一条有向边,保证最开始时 \(v\) 能到达 \(u\),\(u \ne v\)。
  • 2 x:询问 \(x\) 能到达的点中编号最小的点。

题解:并查集 \(O(n\alpha(n))\)

我们发现在这颗树上,祖先节点的编号一定小于当前节点的编号;

因为我们又知道操作\(1\)的时候保证\(v\)能到达\(u\),也就是说\(v\)的编号一定比\(u\)小,也就是说\(u\)向\(v\)连的一条有向边一定是返祖边,所以如果\(u\)向\(v\)连的一条有向边,那么\(v\)到\(u\)这条链之间的所有点都能够到达\(v\),所以对于操作\(2\)来说我们不妨利用并查集维护根节点,在合并节点时我们考虑暴力往上合并,我们发现这颗树上的点最多只会被遍历一次,加上合并时的复杂度,最终复杂度为\(O(n\alpha(n))\)

#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define debug(x) cerr << #x << '=' << x << endl
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10; int n, q;
int fa[N];
int par[N]; int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
} void merge(int u, int v)
{
u = find(u);
v = find(v);
if (u != v)
fa[u] = v;
} void solve()
{
cin >> n;
for (int i = 1; i <= n; ++i)
fa[i] = i;
for (int i = 1; i < n; ++i)
{
int x;
cin >> x;
par[i + 1] = x;
}
cin >> q;
while (q--)
{
int op, u, v;
cin >> op;
if (op == 1)
{
cin >> u >> v;
for (int p = u; p > v; p = par[p])
{
p = find(p);
merge(p, v);
}
}
else
{
cin >> u;
cout << find(u) << endl;
}
}
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}

AtCoder Beginner Contest 295的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

  10. AtCoder Beginner Contest 075 C bridge【图论求桥】

    AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...

随机推荐

  1. 使用Hexo主题搭建个人博客(markdown)

    依赖环境 安装node.js:node.js下载可以从其官方界面开始https://nodejs.org/zh-cn/ 安装git:git下载则可以从其官方界面开始https://git-scm.co ...

  2. 深入理解JNDI注入—RMI/LDAP攻击

    目录 前言 JNDI 注入简单理解 透过Weblogic漏洞深入理解 RMI与LDAP的区别 JNDI+RMI 漏洞代码触发链 lookup触发链 JNDI+LDAP 前言 本篇文章初衷是在研究log ...

  3. 月薪20k以上的软件测试工程师的必备知识点?全部拿走吧!

    我们都知道作为一个软件测试工程师,入门相对比较简单,但是要达到技术精通,甚至薪资能达到20k以上的话,那绝对需要对测试开发有一个系统的了解,以及对这些系统的知识能够熟练掌握. 今天的话是我从阿里以为做 ...

  4. .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)

    前言 项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以提高软件的可维护性.可扩展性.可重用性和可测试性. 假如你有其他的项目架构模式推荐,欢迎在文末留言 ...

  5. kaggle入门 随机森林求解Titanic

    # kaggle Titanic # 导入需要的库 import pandas as pd import numpy as np import sys import sklearn import ra ...

  6. Kubernetes Pod生命周期(十七)

    前面我们已经了解了 Pod 的设计原理,接下来我们来了解下 Pod 的生命周期.下图展示了一个 Pod 的完整生命周期过程,其中包含 Init Container.Pod Hook.健康检查 三个主要 ...

  7. .Net 的扩展方法

    // 扩展方法 // ps:js中的扩展方法 比如 给数组定义一个自定义的全局的方法 使用 prototype (原型链) // .Net 给 string 添加一些扩展方法 String 是一个密封 ...

  8. 使用svn保存markdown文档

    使用svn管理md文档时,使用谷歌直接访问出现中文乱码,解析格式错误的问题,可以通过安装谷歌浏览器的插件解决. 一.解决格式解析错误的问题 安装插件 Markdown Preview Plus ,安装 ...

  9. mysql进阶-存储引擎篇

    本篇是将基础篇的知识进行深化了解底层机制的同时讲解企业中涉及到的高层级知识. 存储引擎 1.MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理.授权认证.及相关的安全 ...

  10. 黑客工具:Amass – 寻找子域

    安装 所有信息都可以在 OWASP Amass 项目的 Github 页面上找到:https://github.com/OWASP/Amass.我们将一起完成安装过程,以便更快地部署. 转到发布页面并 ...