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时 ...
随机推荐
- 为什么要使用Java SPI机制
Java SPI(Service Provider Interface)最早是在Java SE 6中被引入的,作为一种标准的.用于在运行时发现和加载服务提供者插件的标准机制.以前的程序猿实现JDBC连 ...
- exceptionless 在 windows 上 手动部署,非docker 详细步骤
关于exceptionless 是什么我就不多说了,能看到这篇文章的都知道了.网上几乎都是docker部署的,docker部署的确十分方便,但是有的人没有条件用docker,像我就不想花这个钱去多服务 ...
- OData – Get Started 搭建单侧环境
前言 之前写过 EF Core – Get Started 搭建单侧环境, 这篇补上一个 WebApi + EF Core + OData 创建项目 dotnet new webapi -o EfCo ...
- 安全 – 常见 Web 攻击
前言 最近在研究 WAF, 顺便记入一下常见的 Web 攻击. SQL Injection SQL injection 是指程序员直接拿 client input, 拼接到 SQL query 中. ...
- Shiro-认证绕过漏洞(CVE-2020-1957)
漏洞原理 核心点就是shiro和spring对uri进行配合匹配的时候有缺陷导致的,shiro中很轻易就能绕过,其次spring中对;分号好像情有独钟,被大牛们发现后也就一下子绕过了. 主流paylo ...
- 均值回归策略在A股ETF市场获利的可能性
如何在股票市场获利 曾经有人告诉我一个在股票市场赚钱的秘诀,只要掌握这个秘诀,赚钱就像捡钱一样容易.他说:这个秘诀其实很简单,就是在股票价格低的时候买入,在价格高的时候卖出. 啧啧,不愧是秘诀,明明是 ...
- 信创环境经典版SuperMap iManager监控外部SuperMap iServer资源失败,无法监控目标GIS服务器CPU与内存使用情况
一.问题环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iServer 10.2.0 SuperMap iManager 10.2.1 二.现象 部署完经典版Supe ...
- 一篇文章讲清楚synchronized关键字的作用及原理
概述 在应用Sychronized关键字时需要把握如下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待: 每个实例都对应有自己的一把锁(this),不同实例之间互不影响:例外:锁对象是 ...
- Springboot自定义Prometheus采集指标
添加依赖 <!--增加Prometheus依赖--> <dependency> <groupId>org.springframework.boot</grou ...
- 掌握Docker:简化KES单机安装与管理的最佳实践
今天我们将继续深入探讨KES的单机安装,依然围绕Docker的使用展开.这一部分的内容将涵盖一些常见的陷阱以及在遇到问题时如何进行有效的反馈和解决.首先,我们需要找到官方的安装教程,确保以官方指南为主 ...