AtCoder Beginner Contest 296
Transition Game
给定序列\(a\),\(1<=a_i<=n\),一场游戏有\(n\)个回合,第\(i\)回合时,第一个人先指定一个任意数\(k\),第二个人任意选定一个\(x\),\(1<=x<=n\),然后\(x:=a_x\)执行\(k\)次,如果最后\(x=i\),那么第二个人获胜,否则第一个人获胜
对于\(n\)个回合,求出第二个人能够赢得的回数
题解:拓扑排序 + 思维
我们发现对于任意数\(k\)来说,只要当前回合\(i\)能够在序列\(a\)上形成一个闭环,就说明第二个人一定能胜,所以实际上对于所有回合来说是一个有向图,我们不妨利用拓扑排序求出有哪些点形成了闭环,那么在形成闭环的这些点上第二个人都会胜
#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;
int a[N];
queue<int> q;
int du[N];
void solve()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
}
int ans = 0;
for (int i = 1; i <= n; ++i)
{
du[a[i]]++;
}
int cnt = 0;
for (int i = 1; i <= n; ++i)
{
if (du[i] == 0)
q.push(i);
}
while (q.size())
{
int u = q.front();
q.pop();
cnt++;
for (auto v : g[u])
{
du[v]--;
if (du[v] == 0)
q.push(v);
}
}
cout << n - cnt << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
Simultaneous Swap
给定两个序列\(a,b\),每次操作选择\([1,n]\)中三个成对不同的整数\(i,j,k\),然后交换\(a_i,a_j\),再交换\(a_i,a_k\),询问两个序列在经过任意操作后是否会变得相同
题解:思维 + 逆序对 : 好题目
引理:
- 如果一个序列中元素不重复,那么交换任意两个元素,该排列的奇偶性一定会改变
- 对于任意一个排列,总可以经过一定交换使得该排列变成标准排列,且交换的次数的奇偶性和排列的奇偶习惯相同
我们考虑一个这样的操作:
我们发现对于这样的交换不会改变两个排列的奇偶性,并且能够保证使得一个排列不改变原有元素的位置,另一个排列相当于做了一次周期为\(3\)的轮换,所以我们不妨先将排列\(a\)任意交换成标准排列,同时排列\(b\)同步更新,这样并不会改变排列\(a\)和排列\(b\)之间的奇偶性关系;
那么现在排列\(a\)是标准排列,且是偶排列。
- 如果排列\(b\)是偶排列,我们一定能通过上面的操作在不改变排列\(a\)和不改变排列b的奇偶性情况下,使得排列\(b\)也变成标准排列
- 如果排列\(b\)是奇排列,可以推断出我们无法使得\(b\)变成标准排列,但是如果存在两个以上相同的元素,我们可以在上述的操作中交换两个相同的元素,然后再交换不同的元素使得排列\(b\)变为偶排列,那么排列\(b\)也能够变成标准排列
所以我们得到结论:
- 如果两个排列的奇偶性一样,一定能够通过交换使得两个排列相同
- 如果两个排列的奇偶性不一样,但是如果一个排列中存在两个以上相同的元素,一定能够通过交换使得两个排列相同
- 如果两个排列相同的元素其对应的数量不一样,肯定无法完成
#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;
int c[N];
int a[N], b[N];
unordered_map<int, int> mp;
int lowbit(int x)
{
return x & -x;
}
void add(int x, int val)
{
while (x <= n)
{
c[x] += val;
x += lowbit(x);
}
}
int get_sum(int x)
{
int res = 0;
while (x > 0)
{
res += c[x];
x -= lowbit(x);
}
return res;
}
int query(int l, int r)
{
return get_sum(r) - get_sum(l - 1);
}
void solve()
{
cin >> n;
int cnt1 = 0, cnt2 = 0;
bool flag = false;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
cnt1 += query(a[i] + 1, n);
add(a[i], 1);
mp[a[i]]++;
if (mp[a[i]] >= 2)
flag = true;
}
for (int i = 1; i <= n; ++i)
c[i] = 0;
for (int i = 1; i <= n; ++i)
{
cin >> b[i];
cnt2 += query(b[i] + 1, n);
add(b[i], 1);
mp[b[i]]--;
}
for (auto [x, y] : mp)
{
if (y != 0)
{
cout << "No" << endl;
return;
}
}
if (cnt1 % 2 == cnt2 % 2 || flag == true)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
signed main(void)
{
Zeoy;
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
AtCoder Beginner Contest 296的更多相关文章
- 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 ...
随机推荐
- Typora mac激活
typora mac版本激活 我也是第一次使用mac电脑,在安装时基本上都是付费的,在mac下载使用typora是试用一段时间后是需要付费购买的,苦无能力有限只能绕一下,感谢网上的各位大佬的分享 来源 ...
- Python存储与读写二进制文件
技术背景 一般情况下我们会选择使用明文形式来存储数据,如json.txt.csv等等.如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式.还有一种比较紧凑的数据存储格式,就是直接按 ...
- JS插入排序完全理解
插入排序是JS中的一种常见数组排序算法,记录一下如何理解并实现插入排序的功能; 首先看一下最直观的动态图 图片来源:https://www.javascriptc.com/ 从图像可以很直观的看出,插 ...
- libtool版本错配(libtool version mismatch)
当使用configure和makefile编译项目时,出现如下报错: libtool: Version mismatch error. This is libtool 2.4.6, but the`` ...
- 1 月 25 日见|Flutter Forward 活动日程表正式发布!
2023 年 1 月 25 日 (正月初四),我们将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播.本次活动将展示最新的 Flutter 技术更新,包括一个主题演讲以 ...
- jwt实现登录 和 接口实现动态权限
[Authorize] ==== using Microsoft.AspNetCore.Authorization; 登录的 DTO namespace login; public class ...
- 解决 -Code 安装似乎损坏。请重新安装
问题: 1. 安装插件 fix VSCode Checksums 2. ctrl+shift+P打开命令面板 3. 输入 Fix Checksums: Apply 4. 重新启动VSCode
- KubeSphere 社区双周报|2024.06.07-06.20
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 数据运算中关于字符串""的拼接问题
例子中准备了3种类型数据,分别针对是否在运算存在空字符串参与运算进行了演示,结果如下: 1 int x = 10; 2 double y = 20.2; 3 long z = 10L; 4 Syste ...
- 避免大量ifelse(枚举、工厂模式、策略模式)
枚举 public class Test { public static void main(String[] args) { System.out.println(judge("ROLE_ ...
