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 ...
随机推荐
- ES6之常用开发知识点:let 和 const 命令详解(二)
let命令 基本用法 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 根据上面结果显示,let声明的变 ...
- MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系
前言 它们关系挺乱的, 而且不只是我一个人感觉乱 还有 所以这篇做一个整理吧. Material Design Google 的设计指南. 早年用于 Android Apps, 现在也用于 Web A ...
- 林史·CLOI纪事本末
CLOI正源在JD,JD在初次短期集训结束后带出了一句经典名言: 那如果是在丛林里呢 这句话在短期内在全班范围内流传甚广,因此,\(GreatJungleLord\) 也因其幽默诙谐的形象赢得了大家的 ...
- 2款.NET开源且免费的Git可视化管理工具
Git是什么? Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发.Git最初是由Linux开发者Linus Torvalds创建的,它具有高效.灵活.稳定等优 ...
- 【赵渝强老师】使用kubeadmin部署K8s集群
首先,我们来看一下整体的架构. K8s的部署方式: yum方式部署 二进制包:手动使用tar包来部署 minikube:单机版,用于开发测试. kubeadm:可以把kubeadmin看成一个部署工具 ...
- `->` 操作符重载的注意事项
在 C++ 中,-> 操作符可以被重载,用于对象的指针成员访问. 重载后的 -> 操作符主要用于模拟指针访问行为,常见于智能指针的实现等复杂场景. -> 操作符重载后的调用触发流程: ...
- CAS存在的问题及在Java中的解决方式
CAS 介绍 CAS 可以保证对共享变量操作的原子性 CAS全称Compare And Swap,比较与交换,是乐观锁的主要实现方式.CAS在不使用锁的情况下实现多线程之间的变量同步.Reentran ...
- 深度解析Spring AI:请求与响应机制的核心逻辑
我们在前面的两个章节中基本上对Spring Boot 3版本的新变化进行了全面的回顾,以确保在接下来研究Spring AI时能够避免任何潜在的问题.今天,我们终于可以直接进入主题:Spring AI是 ...
- logback.xml文件
<?xml version = "1.0" encoding="UTF-8"?> <configuration debug = "f ...
- package.json文件干什么的 ?
package.json 是项目描述文件,记录了当前项目的信息,比如项目的名字,版本,作者,还有所依赖的第三方模块 : dependencies 是项目依赖,是项目上线时要依赖的第三方包 : devd ...
