The 2024 ICPC Asia East Continent Online Contest (I) C
我的评价是神题,给出两种做法。
方法一
利用线代技巧。
设法构造矩阵 \(A\), 其中 \(A_{ij} = [j \in [l_i, r_i]]\),对所有排列 \(p\),所有的合法答案的数量以下式表示:
\]
上式为行列式的积和式,用 \(\operatorname{perm}(A)\) 表示。
由行列式定义可知:
\]
在模 \(2\) 意义下,正负号同余,因此有:
\]
若行列式不为 \(0\),则矩阵 \(A\) 可逆,因此矩阵 \(A\) 是满秩的,我们只用找其中是否有向量与其他向量线性相关(即行能否被其他行表示),这可以通过异或操作实现。
考虑 \(1\) 的位置是连续的,对两组向量异或可以看做两条线段覆盖,存在一组线段可以使得所有位置被覆盖偶数次即可,考虑能否将若干线段连接起来即可,即只需考虑是否存在 \([l_i, r_i + 1]\) 连接后恰好覆盖其他线段,考虑并查集。
时间复杂度 \(O(n)\)。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, p[N];
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n + 1; i ++ ) p[i] = i;
int ans = 0;
for (int i = 1; i <= n; i ++ ) {
int l, r;
cin >> l >> r;
if (find(l) == find(r + 1)) ans = 1;
else p[find(l)] = find(r + 1);
}
if (ans) cout << "0\n";
else cout << "1\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T -- ) solve();
return 0;
}
方法二
如果我们思维太迟钝(没有学好线代),按照一般思考流程来解决,发现答案非 \(0\) 即 \(1\),如果我们能发现某一种是好求的,那么另一种可以快速得出。
考虑答案为 \(0\) 的充要条件,无解,或者有解且解为偶数倍,容易发现对两组 \(A = [l_i, r_i]\),\(B = [l_j, r_j]\) 的答案为 \(s, t\),若 \(\{s, t\} \in A, B\) 那么交换 \(s, t\),答案成立,故答案一定为偶数倍。
因此我们考虑能否答案是 \(1\),这是好算的,考虑 \(l_i = 1\) 的情况,如果 \(r_1 < r_2 < \ldots < r_k\),第一个 \([1, r_1]\) 任取,第二个 \([1, r_2]\) 只能从 \([r_1 + 1, r_2]\) 中取,否则存在相交,两者可以交换,不符合条件。
因此我们建立 \(n\) 个堆,向第 \(l_i\) 个堆插入 \(r_i\),从小到大枚举,弹出堆中最小元素的同时向第 \(r_i + 1\) 个堆做启发式合并,判断是否有解即可。
时间复杂度 \(O(n\log^2{n})\),跑不满,很神秘,但是能过。
#include<bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
vector<priority_queue<int, vector<int>, greater<int>>> heap(n + 2);
for (int i = 1; i <= n; i ++ ) {
int l, r;
cin >> l >> r;
heap[l].push(r);
}
for (int i = 1; i <= n; i ++ ) {
if (heap[i].empty()) {
return cout << "0\n", void();
}
int t = heap[i].top();
heap[i].pop();
if (!heap[i].empty() && heap[i].top() == t) {
return cout << "0\n", void();
}
if (heap[i].size() > heap[t + 1].size()) {
swap(heap[i], heap[t + 1]);
}
while (heap[i].size()) {
heap[t + 1].push(heap[i].top());
heap[i].pop();
}
}
cout << "1\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T -- ) solve();
return 0;
}
The 2024 ICPC Asia East Continent Online Contest (I) C的更多相关文章
- 训练20191009 2018-2019 ACM-ICPC, Asia East Continent Finals
2018-2019 ACM-ICPC, Asia East Continent Finals 总体情况 本次训练共3小时20分钟,通过题数4. 解题报告 D. Deja vu of - Go Play ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals I. Misunderstood … Missing(dp)
题目链接: http://codeforces.com/gym/102056/problem/I 题意: 人物有l两个属性分别是$A,D$ 每个回合人物$A\pm D$ 每个回合有三个选择分别是: 1 ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals部分题解
C:显然每p2个数会有一个0循环,其中22 32 52 72的循环会在200个数中出现,找到p2循环的位置就可以知道首位在模p2意义下是多少,并且循环位置几乎是唯一的(对72不满足但可能的位置也很少) ...
- 2018-2019 ACM-ICPC, Asia East Continent Finals Solution
D. Deja vu of … Go Players 签. #include <bits/stdc++.h> using namespace std; int t, n, m; int m ...
- 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final 2017) Solution
A:Chat Group 题意:给出一个n, k 计算C(n, k) -> C(n,n) 的和 思路:k只有1e5 反过来想,用总的(2^ n) 减去 C(n, 0) -> C(n, k ...
- The 2017 ACM-ICPC Asia East Continent League Final记录
首先感谢tyz学弟的麻麻-给我们弄到了名额- 然后就开始了ACM ECLFinal的玩耍,A*仙人掌可是立了flag要好好打的- 试机赛好像就全是GCJ kickstart的原题,然后AK了但是由于一 ...
- Codeforces Gym 101775D Mr. Panda and Geometric Sequence(2017-2018 ACM-ICPC Asia East Continent League Final,D题,枚举剪枝)
题目链接 ECL-Final 2017 Problem D 题意 给定$2*10^{5}$组询问,每个询问求$l$到$r$之间有多少个符合条件的数 如果一个数小于等于$10^{15}$, 并且能被 ...
- 2019-2020 ICPC Asia Hong Kong Regional Contest
题解: https://files.cnblogs.com/files/clrs97/19HKEditorial-V1.zip Code:(Part) A. Axis of Symmetry #inc ...
- 2018-2019 ACM-ICPC, Asia East Continent Final L Eventual … Journey
#include<iostream> using namespace std; ; int cnt[MAX]; int ans[MAX]; int a[MAX]; int main() { ...
- 训练20191005 2017-2018 ACM-ICPC Asia East Continent League Final
A 签到 M 签到 K 读懂后签到 L 博弈论 [引理]出现SXXS结构时后手必胜. 很容易发现n为奇数时后手不可能胜利,n为偶数时先手不可能胜利.n≤6时一定平局,n≥7时先手有可能胜利,n≥16时 ...
随机推荐
- 斐讯 N1 刷机记录
Prerequisites USB 公对公线 Windows 操纵系统 AMLogic USB Burning Tool,安装后名字为 Aml_Burn_Tool. 降级 打开终端,输入 hdwwiz ...
- MarginNote 4 内存泄露?
在床上用电脑的时候突然发现电脑风扇呼呼响,一摸很烫,以为是被子把出风口堵住了,于是调整角度继续用.结果一段时间之后风扇还是狂转不停,然后收到了这样的提示.不看不知道一看吓一跳,MarginNote 4 ...
- SpringBoot定时任务实现数据同步
业务的需求是,通过中台调用api接口获得,设备数据,要求现实设备数据的同步. 方案一:通过轮询接口的方式执行 pullData() 方法实现数据同步 该方式的原理是先清空之前的所有数据,然后重新插入通 ...
- Mongodb入门5
最近在用MongoDBKoa2做个小项目,记录一下: 首先,如何连接线上数据库: const url = `mongodb://user:pwd@ipaddr:27017/Blog`; const m ...
- JAVA基础之5-函数式接口的实现
之所以单独把这个列出来,是因为本人被一个源码给震撼了. 所以,本人目的是看看这个震撼实现,并模仿,最后把常规的实现也贴上,让读者可以看到相对完整的实现 注:本文代码基于JDK17 一.让人震撼的代码 ...
- C# 基础 – 装箱 / 拆箱, 堆 / 栈
前言 有些概念可能你用不到, 但是懂也无妨. 装箱 / 拆箱 参考: C#装箱和拆箱(Boxing 和 UnBoxing) 通常讲到这些都跟性能有关. 把值类型变成引用类型就叫装箱. int numb ...
- DOM – IntersectionObserver
介绍 IntersectionObserver 的作用是监听某个元素是否出现在框内 (比如 viewport). 它可以实现 lazy load image, 一开始图片是没有加载的, 当图片出现在 ...
- 利用PaddleHub 进行人脸检测识别、并对图片进行抠图
利用PaddleHub 进行人脸检测识别.并对图片进行抠图 本文是利用百度的飞桨平台的paddle进行人脸的检测和抠图,但是里面也有一些小问题,特记录一下笔记,以便以后观看学习. 环境:pytho ...
- 【赵渝强老师】大数据工作流引擎Oozie
一.什么是工作流? 工作流(WorkFlow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.工作流要解决的主要问题是:为实现某 ...
- 直播预告 | 字节跳动云原生大数据分析引擎 ByConity 与 ClickHouse 有何差异?
ByContiy 是字节跳动开源的一款云原生的大数据分析引擎,擅长交互式查询和即席查询,具有支持多表关联复杂查询.集群扩容无感.离线批数据和实时数据流统一汇总等特点. ByConity 从1月份发布开 ...