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 ...
随机推荐
- Unocss使用
目录: 安装 简单使用 自定义规则 安装 { "dependencies": { "unocss": "^0.55.6", "vu ...
- Vue SPA项目如何修改网站标题
直接贴 门户项目代码 // 全局router 直接挂载路由导航守卫 router.beforeEach((to, from, next) => { if (to.meta.title) { va ...
- MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系
前言 它们关系挺乱的, 而且不只是我一个人感觉乱 还有 所以这篇做一个整理吧. Material Design Google 的设计指南. 早年用于 Android Apps, 现在也用于 Web A ...
- Tabby,一款老外都在用的 SSH工具,竟然还支持网页操作
会编程的蜗牛 主要分享java编程,也会涉及其他方向的技术分享. 1篇原创内容 公众号 序言各位好啊,我是会编程的蜗牛,作为java开发者,或者说编程人员,程序员的我们,Linux服务器总是我们一个绕 ...
- C#|.net core 基础 - 深拷贝的五大类N种实现方式
在实际应用中经常会有这样的需求:获取一个与原对象数据相同但是独立于原对象的精准副本,简单来说就是克隆一份,拷贝一份,复制一份和原对象一样的对象,但是两者各种修改不能互相影响.这一行为也叫深克隆,深拷贝 ...
- Vue 文件流预览 PDF
Vue js // pdf 预览 export function download(id) { return request({ url: '/bbs/regtech/law/download?id= ...
- 采集数据产品描述有超链接///设置免运费后,达到免送标准,其他运费不显示///给产品详情页面的图片点击放大是个模态窗///在shop页面有重复的产品展示,去重
//产品描述有超链接,去掉 function remove_product_hyperlinks($content) { if (is_product()) { // 确保只在产品页面上应用 $con ...
- Windows下安装Nessus 10.8.3安装破解教程
1.下载: 下载地址:https://www.tenable.com/downloads/nessus 浏览器访问 https://127.0.0.1:8834 重点:Register offline ...
- foobar2000 v2.1.5 汉化版(更新日期:2024.09.08)
foobar2000 v2.1.5 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...
- USB type-c CC管脚如何做到正反接检测功能
USB Type-C 连接器的 CC (Configuration Channel) 管脚用于实现插头方向检测和电源管理.具体来说,USB Type-C 连接器具有两个 CC 管脚:CC1 和 CC2 ...