AtCoder ARC082 E Convex Score 贡献思想 双射

AtCoder Regular Contest 082 (ARC082) E - ConvexScore 逆向思维+简单计算几何 E - ConvexScore 逆向思维+简单计算几何 题目传送门 Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement You are given N points (xi,yi) located on a two-dimensional plane. Consider a subse... 阅读详情

题目链接

题意

给定 N 个点,对于一个凸 n 边形,称其的 n 个顶点构成一个集合 S,并且这个多边形内及其边上有 k 个顶点,定义这个 S 的 score 为 2k−n .

对所有的 score 求和,输出 mod 998244353 的值。

思路

考虑一个凸 n 边形,其内与其上共 k 个顶点,那么它对最后答案的贡献是 2k−n 。这意味着什么呢?就是除去顶点以外的 k−n 个顶点取不取的所有情况数。

取 0 个,取 1 个,取若干个,取所有,事实上这些所有情况的点的效果都是那一个凸 n 边形(因为已经固定取了那 n 个点作为顶点)。

所以可以说,对于任意 m 个点,只要其中有一个子集能构成一个凸多边形,那么其对最后答案就有贡献为。

贡献为多少呢?我们猜想是 1。所以究竟可不可能重复呢?是不可能的。因为对于给定的 m 个点,其最外面的一圈轮廓(…)是确定下来的,而顶点的 n 个点也随之确定。

于是就得到了一个双射,问题就转化成了,有多少个点集满足其子集能构成凸多边形,也即有多少个点集不是所有点共线。

这里有两种做法。

法一:暴力

复杂度: O(n3)

枚举两个顶点,看有多少个点在这两个顶点连成的线上。枚举的两个点固定,其他所有点中至少取一个,情况数就是这条线上共线的点集个数。显然,不会有重复。累和,即为最终答案。

Code

#include <bits/stdc++.h>
#define maxn 100010
typedef long long LL;
const LL mod = 998244353;
LL x[maxn], y[maxn], P[maxn];
int main() {
    LL n;
    scanf("%lld", &n);
    for (int i = 0; i < n; ++i) scanf("%lld%lld", &x[i], &y[i]);
    P[0] = 1;
    for (int i = 1; i <= n; ++i) (P[i] = P[i-1] << 1) %= mod;
    LL ans = P[n] - 1 - n - n*(n-1)/2;
    for (int i = 0; i < n; ++i) {
        for (int j = i+1; j < n; ++j) {
            int cnt = 0;
            for (int k = j+1; k < n; ++k) {
                if ((x[j]-x[i]) * (y[k]-y[j]) == (x[k]-x[j]) * (y[j]-y[i])) ++cnt;
            }
            ((ans -= P[cnt]-1) += mod) %= mod;
        }
    }
    printf("%lld\n", ans);
    return 0;
}

法二:并查集

复杂度: O(n2logn)

参考:[AtCoder]AtCoder Regular Contest 082 CDEF ——jstztzy

十分巧妙的方法,先预处理出两两点对之间的线段,再将线段排个序,那么所有共线的线段肯定都排在了一起并且具有相同的属性(原博是用的 hash ,我就直接比较了比例)。

那么对于这一些线段,对其中的任一条线段,将其两个端点 union 一下,如果是共线的线段,最后所有的顶点肯定都会在同一个 set 里面。

Code

#include <bits/stdc++.h>
#define maxn 100010
typedef long long LL;
using namespace std;
const LL mod = 998244353;
LL x[maxn], y[maxn], P[maxn];
int fa[maxn], sz[maxn];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
void unionn(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return;
    if (sz[x] > sz[y]) swap(x, y);
    fa[x] = y; sz[y] += sz[x];
}
struct node { int p, q; LL dx, dy; };
bool cmp(node u, node v) { return u.dx < v.dx || (u.dx == v.dx && u.dy < v.dy); }
vector<node> seg;
LL GCD(LL x, LL y) { return y ? GCD(y, x % y) : x; }
int main() {
    LL n;
    scanf("%lld", &n);
    for (int i = 0; i < n; ++i) scanf("%lld%lld", &x[i], &y[i]);
    P[0] = 1;
    for (int i = 1; i <= n; ++i) (P[i] = P[i-1] << 1) %= mod;

    for (int i = 0; i < n; ++i) {
        for (int j = i+1; j < n; ++j) {
            LL dx = x[i]-x[j], dy = y[i]-y[j];
            LL gcd = GCD(dx, dy);
            dx /= gcd, dy /= gcd;
            if (dx < 0) dx = -dx, dy = -dy;
            seg.push_back(node{i, j, dx, dy});
        }
    }
    sort(seg.begin(), seg.end(), cmp);

    LL ans = P[n] - 1 - n;
    int i = 0, j = 0;
    for (; i < seg.size(); i = j+1) {
        for (int k = 0; k < n; ++k) fa[k] = k, sz[k] = 1;
        for (j = i; ; ++j) {
            unionn(seg[j].p, seg[j].q);
            if (j+1 >= seg.size() || seg[i].dx != seg[j+1].dx || seg[i].dy != seg[j+1].dy) break;
        }
        for (int k = 0; k < n; ++k) {
            if (fa[k] == k) ((ans -= (P[sz[k]] - sz[k] - 1)) += mod) %= mod;
        }
    }
    printf("%lld\n", ans);
    return 0;
}

// 可能是我写ci了,暴力的跑了 3ms ,并查集跑了 26ms …

新手也能玩转!用Panosim+MATLAB/Simulink搭建你的第一个智能驾驶仿真场景(保姆级图文) 本文为新手提供了使用Panosim和MATLAB/Simulink搭建智能驾驶仿真场景的详细教程。从环境准备、基础场景创建到仿真模型构建,一步步指导用户完成第一个智能驾驶仿真项目,帮助零基础用户快速上手并体验智能驾驶仿真的乐趣。 阅读详情

相关推荐

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 764

Atcoder [arc082F] Sandglass

Description 有一个沙漏由两个上下相通玻璃球A和B构成,这两个玻璃球都含有一定量的沙子,我们暂且假定AB中位于上方的玻璃球的为U,下方的玻璃球为L,则除非U中没有沙子,否则每秒钟都会有1克沙子从U掉入L。 在第0个时刻,A中有a克沙子,B中有X−a克沙子(总共有X克沙子),且U为A,L为B(即A上B下)。 在r1,r2,…,rK这些时刻,我们将倒转整个沙漏,使得原来的U变成L,原来的L变成U。对于翻转操作,t时刻是指从第0个时刻起经过t秒后的时刻,我们可以将翻转沙漏的操作看做瞬间完成的。 现在有Q

tylon2006的博客 245

深入探究贝叶斯网络(Bayesian Network):从基础原理到实际应用

贝叶斯网络,也称为信念网络或有向无环图模型,是一种概率图模型。它使用有向无环图(DAG)来表示随机变量之间的条件依赖关系。每个节点代表一个随机变量,边表示变量之间的条件依赖关系。贝叶斯网络作为一种强大的工具,通过结合概率论和图论,为复杂系统建模和推理提供了有效手段。无论是在医学诊断、故障检测还是自然语言处理等领域,它都展示了巨大的潜力。然而,其计算复杂度高、结构学习困难等挑战也需要我们在实际应用中不断优化算法和技术。希望通过本文,你能对贝叶斯网络有更深入的理解,并能够在实际项目中灵活应用这一强大工具。

qq_28791753的博客 5968

[ARC082] E-ConvexScore

题意:对于每一个凸多边形的顶点集S,定义其权值为2^(该凸多边形中的点(包括顶点)-|S|),求所有S的权值和。 该凸多边形中的点-|S|即为|T|(T为该凸多边形内部的点集(不包括顶点)),|T|的2的次幂即为T的子集个数。令T’为T的一个子集,即对于每一对(S,T’)计算1的贡献。 不难证明对于任何一个凸包有正面积的点集A=S并T’,A划分为(S,T’)的方案是唯一的,所以转化为对每一个凸包

DOFYPXY的博客 678

超详细!思岚S2激光雷达hector_mapping建图

使用思岚S2激光雷达,在ros平台上利用hector_mapping功能包实现建图功能

m0_50965539的博客 5591

TI官方PSpice for TI安装避坑指南:从申请Key到解决器件搜索栏空白(附详细步骤)

本文详细介绍了PSpice for TI的安装与配置全流程,包括申请Key、解决器件搜索栏空白等常见问题。通过分步指南和实战避坑技巧,帮助工程师高效完成安装并优化性能,确保电路仿真工具的正常使用。

weixin_29299807的博客 1081

[AtCoder][ARC082]Sandglass 题解

Sandglass 时间限制: 1 Sec 内存限制: 128 MB 原题链接 https://arc082.contest.atcoder.jp/tasks/arc082_d 题目描述 We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount of sa...

gooding300的博客 459

深入解析LVDS电平标准在LCD屏接口设计中的关键作用

本文深入解析了LVDS电平标准在LCD屏接口设计中的核心作用。文章不仅阐释了LVDS低电压差分信号的工作原理、关键电气参数及抗噪优势,还详细对比了VESA与JEIDA两种主流数据格式,并提供了从PCB布局布线到信号调试的实战避坑指南,是确保高速、稳定显示的关键技术参考。

weixin_28419039的博客 334

[arc082e]ConvexScore

做法可以发现题意转换后就是选出点集能围成凸包的方案数。 不如考虑不能围成的情况一定是选的点全部共线。 瞎做就好了。#include<cstdio> #include<algorithm> #define fo(i,a,b) for(i=a;i<=b;i++) using namespace std; typedef long long ll; typedef double db; const i

不来也不去的一只失忆蝴蝶 650

Innovus每日精要 | 用setScanReorderMode优化扫描链,效率翻倍!

在数字后端物理设计的世界里,扫描链优化就像修路一样,既要保证数据流的顺畅,又要尽量减少绕路和资源浪费。它的主要任务是优化扫描链的连接方式,确保数据能快速、安全地流动。无论是多电压域设计、分区设计,还是复杂的逻辑门,它都能帮你搞定。后,你会发现它不仅能帮你节省时间,还能让你的设计更优雅、更高效。下次遇到扫描链问题时,不妨试试这些技巧,说不定你的设计效率会翻倍!,它能帮你搞定扫描链优化的那些事儿,让你的设计更高效、更优雅。接下来,我们看看这个命令的几个关键选项,以及它们的实际用途。扫描链优化看似枯燥,但掌握。

weixin_50820814的博客 1442

Visual Studio Code + MCP Server + Claude Code 三件套进行 ABAP 开发

本文介绍了如何在Visual Studio Code中利用Claude Code和SAP官方提供的MCP Server进行ABAP开发。作者分享了19年ABAP开发经验,从手动编码到如今通过自然语言生成高质量代码的技术演进。详细说明了配置步骤:启用ADT MCP Server、安装Claude Code扩展、配置.claude.json文件,并验证MCP Server的14个功能。通过实例演示了如何用自然语言指令让Claude Code创建包含冒泡排序实现和单元测试的ABAP类,展示了MCP Server在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1296

arc082E ConvexScore

题目链接 https://arc082.contest.atcoder.jp/tasks/arc082_c 题意简述 平面上有nnn个点,对于每一个顶点都是这nnn个点的凸多边形,都会对答案产生2x2^x2x的贡献,其中xxx为凸多边形内部点的个数,包括在边上的点,但是不包括顶点。求答案模99824435399824435399824435...

dilei7762的博客 242

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1390

AtCoder Regular Contest 082-E-ConvexScore

E - ConvexScoreTime limit : 2sec / Memory limit : 256MBScore : 700 pointsProblem Statement You are given N points (xi,yi) located on a two-dimensional plane. Consider a subset S of the N points that f

algzjh的博客 1108

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AtCoder Regular Contest 079 F - Namori Grundy 乱搞

题意 给出一棵外向环套树,问能否给每一个点定一个权值,使得每个点的权值都满足其恰好是该点所有后继节点的mex。 n&lt;=200000 分析 对于不在环上的节点,它的权值是唯一确定的。对于环上的任意一个点,它的权值有两种可能,一种是它的所有非环上后继的mex,另一种是第二大的未出现过的数。那么只要枚举两种情况,看是否合法即可。 代码 #include&lt;iostrea...

beginend 452

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

AtCoder Regular Contest 082-F-Sandglass

F - SandglassTime limit : 2sec / Memory limit : 256MBScore : 700 pointsProblem Statement We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount of sand. When w

algzjh的博客 1292

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

arc 082 E ConvexScore

题意:给定平面上的n个点,我们对于每一个能围成凸多边形的子集可以计算它的贡献,贡献为 2 的 (这个凸多边形边上及内部点的个数 - 围成凸多边形点的个数),求所有子集的贡献之和。n&lt;=200。         我们可以先转化一下问题,考虑每一个凸多边形,2 的 (这个凸多边形边上及内部点的个数 - 围成凸多边形点的个数)就是在选了这个凸多边形的情况下,里面其他点任选,那么就是以这个凸多边形为...

Rising_shit的博客 404

ARC082 E - ConvexScore

对于图中的每个凸包,计算2n−|S|2^{n-|S|} 令集合T=N-S 发现要计算的东西就是T的子集数 设U是T的子集 就是计算(S,U)这个东西的数量 这时我们发现,S∪U这个东西…好像是互不相同的 所以转化为计算不同的S∪U的数量 这个就是全集的有面积的子集 2n2^n去掉共线和空集就行了code:#include<set> #include<map> #include<deq

L_0_Forever_LF的专栏 525

ARC082 F - Sandglass

线段树维护每个开始的a,在当前时刻A沙漏内沙子数量 沙漏倒过来的时候就区间+/-,减操作的话,对0取max,加操作就对X取min 动态开点,打一个区间覆盖标记一个区间加标记code:#include<set> #include<map> #include<deque> #include<queue> #include<stack> #include<cmath> #include<ctime>

L_0_Forever_LF的专栏 761

AtCoder Regular Contest 082E ConvexScore 乱搞

Description 给n个平面上的点。定义一个点的集合S的权值为2|S|-|T|,其中T是集合S在凸包上的点 求所有点的集合的权值之和 Solution 看不懂题是最大的阻碍。。 那个|S|-|T|实际上就是凸包内部的点,那么S权值的含义就是那些点集的凸包和S的凸包相同 于是问题就变成了可以任意选点,问组成凸包的数量。这个我们减去单点和直线的情况算答案就可以了 Code #include...

olahiuj的博客 195

ConvexScore

                                        ConvexScore                                                                      时间限制: 1 Sec  内存限制: 128 MB                                                    ...

月殇 292

AtCoder Regular Contest 063题解

链接:AtCoder Regular Contest 063C. 一次元リバーシ  一道大水题,统计有多少颜色不同的段减1就好了。复杂度O(n)O(n)。#include<bits/stdc++.h> const int N = 100010;char s[N];int main() { scanf("%s", s); int cnt = 0, len = strlen(s);

qkhhsuhrtfk的博客 904

LeetCode算法题205:同构字符串解析

给定两个字符串 s 和 t,判断它们是否是同构的。 如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。 示例1: 输入: s = "egg", t = "add" 输出: true 示例2: 输入: s = "foo", t = "bar" 输出: false 示...

Alex的博客 670

AtCoder Regular Contest 082 (Upc 6603) ConvexScore

题目链接:https://arc082.contest.atcoder.jp/tasks/arc082_c Problem Statement You are given N points (xi,yi) located on a two-dimensional plane. Consider a subset S of the N points that forms a convex pol...

passer__的博客 294

LeetCode 205. 同构字符串(双射的构建)

同构字符串 用mp存储映射fff,用rmp存储逆映射f−1f^{-1}f−1 class Solution { public: bool isIsomorphic(string s, string t) { map<char,char> mp; map<char,char> rmp; for(int i=0;i<s.size();i++){ if(!mp.count(s[i])){

SongyangJi 236
上一篇: LeetCode Best Time To Buy and Sell Stocks I II III IV
下一篇: 2017多校九 01题 HDU6161 Big binary tree 树形dp+hash
kkkkahlua
博客等级 码龄12年 4粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值