JZOJ4018. 【雅礼联考DAY02】Magic

2023-10-18 08:59

本文主要是介绍JZOJ4018. 【雅礼联考DAY02】Magic,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

圆上有 2 ∗ n 个点和连接这些点的 n 条弦,这些弦不会在圆上相交。这2 ∗ n 个点按照在圆上的位置顺序依次标号为 1,2,…,2 ∗ n。
请求出有多少个无序的三元组,使得对应的三条弦可以通过距离的缩放中心对称。

Input

第一行一个数 n (n ≤ 100000)。
接下来 n 行,每行两个数,表示该弦的端点。保证一个数不会出现两次。

Output

输出一个数,表示方案数。

Sample Input

样例输入1:
4
5 4
1 2
6 7
8 3
样例输入2:
8
1 7
2 4
3 9
5 11
6 8
10 16
13 15
14 12

Sample Output

样例输出1:2
样例输出2:6

Data Constraint

对于30%数据,n ≤ 100.
对于60%数据,n ≤ 10000.
对于100%数据,n ≤ 100000.

题解

因为可以通过缩放来满足中心对称,
也就是说只用考虑他们的相对顺序。
先来看看任取3条边的情况,
这里写图片描述
可以知道2和5两种情况是满足题意的,
然而并不是很容易计算,
反而1这种情况是最简单的,
枚举一条边,用左边与它不相交的边和右边与它不相交的边乘在一起。
而只看3这种情况并不好算,而3、4又有个共同点,
有两条边相交,然后剩下一条边随便。
于是,对于每一条边考研计算出来:
xi x i :左边与它不相交的边数
yi y i :右边与它不相交的边数
zi z i :与它相交的边数。
其中 xi x i yi y i 可以用树状数组轻松算出来,
zi z i =n- xi x i - yi y i -1

最后就用总的情况减去1、3、4的情况。

code

#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <time.h>
#define ll long long
#define N 100003
#define M 103
#define db double
#define P putchar
#define G getchar
#define inf 998244353
#define pi 3.1415926535897932384626433832795
using namespace std;
char ch;
void read(int &n)
{n=0;ch=G();while((ch<'0' || ch>'9') && ch!='-')ch=G();ll w=1;if(ch=='-')w=-1,ch=G();while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();n*=w;
}int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
ll abs(ll x){return x<0?-x:x;}
ll sqr(ll x){return x*x;}
void write(ll x){if(x>9) write(x/10);P(x%10+'0');}struct node
{int x,y,id;
}a[N];bool cmp(node a,node b)
{return a.y<b.y;
}ll ans,s[N*2],x[N],y[N],z[N];
int n,id[N*2],p[N*2],sum;int x_(int x){return(-x)&x;}ll find(int x)
{ll p=0;for(int i=x;i;i=i-x_(i))p+=s[i];return p;
}void ins(int x)
{for(int i=x;i<=n*2;i=i+x_(i))s[i]++;
}int main()
{read(n);ans=(ll)n*(n-1)/2*(n-2)/3;for(int i=1;i<=n;i++){read(a[i].x),read(a[i].y);if(a[i].y<a[i].x)swap(a[i].y,a[i].x);a[i].id=id[a[i].x]=id[a[i].y]=i;p[a[i].x]=1,p[a[i].y]=2;}sum=0;for(int i=1;i<=n*2;i++)if(p[i]==1)x[id[i]]+=sum;else sum++;sum=0;for(int i=n*2;i;i--)if(p[i]==2)x[id[i]]+=sum;else sum++;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++)y[a[i].id]=find(a[i].y)-find(a[i].x),ins(a[i].x);memset(s,0,sizeof(s));for(int i=n;i;i--)x[a[i].id]+=find(a[i].x),ins(a[i].x);for(int i=1;i<=n;i++)z[i]=n-x[i]-y[i]-1,ans=ans-x[i]*y[i]-(x[i]+y[i])*z[i]/2;printf("%lld\n",ans);return 0;
}

这篇关于JZOJ4018. 【雅礼联考DAY02】Magic的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/231552

相关文章

javaweb-day02-2(00:40:06 XML 解析 - Dom4j解析开发包)

导入dom4j开发包:dom4j-1.6.1.jar   在工程下建一个文件夹lib,将dom4j-1.6.1.jar拷到里边。右键add to build path。  dom4j-1.6.1\lib文件夹下还有一些jar包,是开发过程中dom4j所需要依赖的jar包,如开发过程中报错,则需导入。   用dom4j怎么做呢? 只要是开源jar包提供给你的时候,它会在开源包里面提供

javaweb-day02-2(XML 解析 - Jaxp的sax方式解析)

Jaxp解析开发包 Sax解析方式只能做查询: Sax解析方式和DOM解析方式的区别:     在使用 DOM 解析 XML 文档时,需要读取整个 XML文档,在内存中构架代表整个DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。  SAX解析允许在读取文档的时候,即对文档进行处

Qlik数据集成 | Qlik 连续 14 年稳居 2024 Gartner® ABI Magic Quadrant™ 领导者

Qlik 再次当选 2024 年 Gartner® 分析和商业智能平台 Magic Quadrant™ 领导者! 近日,作为引领当今数据集成、数据质量和分析解决方案市场的行业领导者, Qlik 再次当选 2024 年 Gartner® 分析和商业智能平台 Magic Quadrant™ 领导者! 得益于 Qlik 在愿景完备性和执行能力方面的出色表现,这已经是 Qlik 第 14 年位居领导者象

网络编程day02(字节序、TCP编程)

目录 【1】字节序 1》大小端转换 2》端口转换   3》IP地址转换 主机字节序转换为网络字节序 (小端序->大端序) 网络字节序转换为主机字节序(大端序->小端序)  【2】TCP编程 1》流程 2》函数接口 1> socket 2> bind 3> listen 4> accept  5> recv  6> connect 7> send  3》代码展示

最值求解 | 管理类联考数学专项

日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考: b站跟着曦曦老师玩转【最值】

笔试强训day02

牛牛的快递 import matha,b = input().split()a = float(a)price = 20if a>1:price += math.ceil(a)-1if b=='y':price += 5print(price) 最小花费爬楼梯 #include <bits/stdc++.h>const int N = 1e5+10;int co

Magic推出100M个token的上下文

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/ 目前,AI模型有两种学习方式:一种是通过训练,另一种是在推理过程中通

蓝桥杯备赛day02:递推

斐波那契数列 #include <bits/stdc++.h>using namespace std;int main(){int n;cin>>n;int dp[n+1];dp[1]=1;dp[2]=1;for(int i = 3;i <= n;i++) dp[i] = dp[i-1]+dp[i-2];cout<<dp[n];return 0;} n = int(input())

javaWeb【day02】--(JavaScriptVue)

1 JavaScript html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习JavaScript,这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演示,通过浏览器打开,我们点击主题5按钮,页面的主题发生了变化,所以js可以让我们的页面更加的智能,让页面和用户进行交互。 1.2 引入方

代码随想录算法训练营Day02 | 209.长度最小的子数组、59.螺旋矩阵II、区间和、开发商购买土地

文章目录 209.长度最小的子数组思路与重点相关题目(TODO) 59.螺旋矩阵II思路与重点 区间和思路与重点 开发商购买土地思路与重点 209.长度最小的子数组 题目链接:209. 长度最小的子数组 - 力扣(LeetCode)讲解链接:代码随想录 (programmercarl.com)状态:回忆不起来,直接看题解了。 思路与重点 最直观的方法还是我们的暴力