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时 ...
随机推荐
- python pyqt6 QMainWindow 使用QComboBox 窗口移位
QMainWindow 可拖拽移动,但是点击QComboBox 时,窗口有时会误识别为拖拽移动,导致窗口自动移动位置 在QMainWindow中,新增事件筛选器 # 避免点击QComboBox时,窗 ...
- 【笔记】利用七牛云CDN加速提高前端图片静态资源访问速率
第一步,注册七牛云账号 打开 七牛开发者平台,选择 注册,注册后登录系统然后实名认证. 第二步,创建七牛云空间 七牛对象存储将数据文件以资源的形式上传到空间中.您可以创建一个或者多个空间,然后向每个空 ...
- react-pdf预览在线PDF的使用
1.在react项目中安装react-pdf依赖包 建议安装8.0.2版本的react-pdf,如果安装更高版本的可能出现一些浏览器的兼容性问题: npm install react-pdf@8.0. ...
- SuperMap流数据应用技术方案
流数据应用技术方案针对流数据应用场景,针对流数据的海量.多源.持续等特征,进行持续地获取相关的动态位置,以及持续地分析.处理和挖掘. 本章沿用基于单机SuperMap iServer环境,介绍流数据处 ...
- USB-DFP UFP DRP模式
USB Type-C 接口支持三种模式:DFP(Downstream Facing Port).UFP(Upstream Facing Port)和 DRP(Dual Role Port).虽然这些术 ...
- Android Systrace 基础知识 -- Why 60 fps ?
1.正文 今天来讲一下为何我们讲到流畅度,要首先说 60 帧. 我们先来理一下基本的概念: 60 fps 的意思是说,画面每秒更新 60 次 这 60 次更新,是要均匀更新的,不是说一会快,一会慢,那 ...
- iOS生成ipa包的时候总是弹窗提示macOS想要使用系统钥匙串
最近新换了一台苹果电脑,性能不错,不过证书和描述文件需要重新配置,遇到了一系列奇怪的问题.在这里整理记录下来,希望能给其他人提供一些帮助.iOS生成ipa包的时候总是弹窗提示[macOS想要使用系统钥 ...
- vue 的常用指令以及作用 ·
1. v-model 多用于表单元素实现双向数据绑定(同 angular 中的 ng-model) 2. v-for 格式: v-for="字段名 in(of) 数组 json" ...
- vue3中没有 this 环境变量了
因为 api setup 在 beforecreate 之前执行,所以 this 是 undefined : setup 不能是一个 async 函数 ,因为返回值不是 对象了 ,而是 promise ...
- 你所理解的 mvvm 模型
mvvm 是Model-View-ViewModel 数据驱动视图模型,是mvc 的改进版 ,mvvm把界面ui和业务逻辑分离 ,model 是data属性的数据 , view 是模板结构 ,view ...