AtCoder Beginner Contest 295
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的更多相关文章
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
随机推荐
- 万字长文全面详解现代C++智能指针:原理、应用和陷阱
现代C++智能指针详解:原理.应用和陷阱 智能指针是C++11引入的新特性.本篇文章详细介绍了C++智能指针的原理.应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr.s ...
- 解决向github上push报 error: failed to push some refs to 'xxxxx' 问题
解决向github上push报 error: failed to push some refs to 'xxxxx' 问题 1.问题 向github上push 代码时,报 error: failed ...
- 深度学习批次(batch)、迭代(iteration)、周期(epoch)、前向传播(forward propagation)、反向传播(backward propagation)、学习率(learning rate)概念解释
虽然现在应该是已经熟练掌握这些基础概念的时候,但是我是鱼的记忆,上一秒的事情,下一秒就忘了,除非是重要的人的重要的事情,呜呜呜呜,我这个破脑子. 还是写一下吧,直接GPT出来的(人类之光,欢呼~). ...
- Git Bash OpenSSL – Generate Self Signed Certificate
前言 以前就写过了, 只是写的太乱, 这篇是一个整理版. 以前的文章: Git Bash 创建证书 PowerShell 创建证书 我已经没有用 PowerSheel 做证书了, 所以就不介绍了. 参 ...
- EditPlus各个版本的注册码,可用
原文链接:https://www.cnblogs.com/shihaiming/p/6422441.html 工具: editplus注册码生成链接: http://www.jb51.net/tool ...
- C++ STL map/multimap容器
map/multimap容器 Map的特性是,所有元素都会根据元素的键值自动排序.Map所有的元素都是pair,同时拥有实值和键值,pair的第一个元素被视为键值,第二个元素被视为实值,map不允许两 ...
- Dockerfile定制镜像(FROM?RUN ?WORKDIR ?ADD & COPY指令)(七)
一.Dockerfile 镜像的定制实际上就是定制镜像的每一层所添加的配置.文件等信息,实际上当我们在一个容器中添加或者修改了一些文件后,我们可以通过docker commit命令来生成一个新的镜像, ...
- Lazy TLB Mode 的工作原理
Lazy TLB (Translation Lookaside Buffer) mode 是操作系统和处理器在管理虚拟内存时的一种优化技术,旨在提高处理器的性能.要理解 Lazy TLB mode,需 ...
- Java日期时间API系列16-----Jdk8中java.time包中的新的日期时间API类,java日期计算3,日期中年月日时分秒的属性值修改等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- 介绍一下 websocket
一般的http请求都是短连接,而webpack的使用可以建立长连接 : 什么是 websocket websocket 是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双 ...