2018.07.10NOIP模拟 Draw(容斥原理)
Draw
题目背景
SOURCE:NOIP2016-RZZ-4 T3
题目描述
给定笛卡尔坐标系上 n 个不重复的点。
定义一个 L 形为:
一个形如 (x,y),(x+1,y)…(x+a,y),(x,y+1)…(x,y+b) 的点集。
并且满足 a,b≥1 且 gcd(a,b)=1。
求有多少个集合的二元组 (A,B) 满足 A 和 B 都是 L 形,且 A 和 B 没有交,即A∩B=φ。其中 A 和 B 是两个集合,A 和 B可以相等。,
当 A≠B 时,我们将 (A,B) 和 (B,A) 视为不同的二元组。
输入格式
第一行一个整数 n 。
接下来 n 行每行两个正整数 xi,yi 描述点的坐标。
输出格式
输出一个整数,表示答案。
样例数据 1
输入
1 1
1 2
2 1
3 3
3 4
4 3
输出
2
备注
【数据规模与约定】
设坐标 xi,yi 的范围为 [1,S]。
对于 30% 的数据,S≤10。
对于 50% 的数据,S≤50。
对于 100% 的数据,S≤200,0≤n≤4*104,n≤S^2。
这题要用玄学的容斥原理,考场上50" role="presentation" style="position: relative;">5050分写挂了。听完评讲发现自己的方法改一下就成正解了。
我们先统计出所有的二元组个数,然后去掉有交集的就行了。那我们来讨论一下有交集的情况。
- 两个l" role="presentation" style="position: relative;">ll拐点重合:直接算。
- 两个拐点不在一条水平线或铅直线上,枚举其中一个拐点和其中一条边统计经过边上某点的l" role="presentation" style="position: relative;">ll的数量。
- 两个拐点在一条水平线或在铅直线上上,类似的方法枚举。
代码(丑)如下:
#include<bits/stdc++.h>
#define D 205
#define N 40005
#define ll long long
using namespace std;
ll num[D][D];
ll cnt[D][D],sum;
ll f[D][D],u[D][D],r[D][D],n,s;
bool mp[D][D];
struct pot{ll x,y;}p[N];
inline ll gcd(ll a,ll b){while(b){ll t=a;a=b,b=t%a;}return a;}
inline ll solve(ll m,ll n){
ll ret=0;
for(ll i=1;i<=n;++i)ret+=(gcd(i,m)==1);
return ret;
}
inline void init(){
memset(num,0,sizeof(num));
for(ll i=1;i<=200;++i)
for(ll j=1;j<=200;++j)
f[i][j]=solve(i,j),num[i][j]=num[i-1][j]+f[i][j];
}
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans;
}
int main(){
init();
n=read();
memset(mp,false,sizeof(mp));
memset(u,0,sizeof(u));
memset(r,0,sizeof(r));
memset(cnt,0,sizeof(cnt));
for(ll i=1;i<=n;++i){
p[i].x=read(),p[i].y=read();
mp[p[i].x][p[i].y]=true;
}
for(ll i=200;i>=1;--i)
for(ll j=200;j>=1;--j)
if(mp[i][j]){
if(mp[i][j+1])r[i][j]=r[i][j+1]+1;
if(mp[i+1][j])u[i][j]=u[i+1][j]+1;
}
for(ll i=1;i<=200;++i)
for(ll j=1;j<=200;++j)
if(mp[i][j]){
ll q[D];
memset(q,0,sizeof(q));
for(ll k=1;k<=u[i][j];++k)q[k]=f[k][r[i][j]];
for(ll k=u[i][j];k>=1;--k)q[k-1]+=q[k];
s+=q[0];
for(ll k=0;k<=u[i][j];++k)cnt[i+k][j]+=q[k];
}
ll ans=0;
for(ll i=1;i<200;++i)
for(ll j=1;j<200;++j)
if(u[i][j]&&r[i][j]){
ll tmp=cnt[i][j],redu;
tmp-=(redu=num[u[i][j]][r[i][j]]);
for(ll k=1;k<=r[i][j];++k){
tmp+=cnt[i][j+k];
ans+=f[k][u[i][j]]*tmp*2;
}
ans+=redu*redu;
}
printf("%lld",s*s-ans);
return 0;
}
2018.07.10NOIP模拟 Draw(容斥原理)的更多相关文章
- 2018.07.10NOIP模拟 Knapsack(单调队列优化dp)
Knapsack 题目背景 SOURCE:NOIP2016-RZZ-4 T2 题目描述 有 n 个物品,第 i 个物品的重量为 ai . 设 f(i,j,k,l,m) 为满足以下约束的物品集合数量: ...
- 2018.07.26NOIP模拟 魔法数字(数位dp)
魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...
- China Cloud Computing Conference(2018.07.24)
时间:2018.07.24地点:北京国家会议中心
- AI Summit(2018.07.19)
AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店
- China Internet Conference(2018.07.12)
中国互联网大会 时间:2018.07.12地点:北京国家会议中心
- 【2018.06.26NOIP模拟】T3节目parade 【支配树】*
[2018.06.26NOIP模拟]T3节目parade 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的表演时间 ...
- 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*
[2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...
- 【2018.06.26NOIP模拟】T1纪念碑square 【线段树】*
[2018.06.26NOIP模拟]T1纪念碑square 题目描述 2034年,纪念中学决定修建校庆100周年纪念碑,作为杰出校友的你被找了过来,帮校方确定纪念碑的选址. 纪念中学的土地可以看作是一 ...
- 2018.07.13 [HNOI2015]落忆枫音(容斥原理+dp)
洛谷的传送门 bzoj的传送门 题意简述:在DAG中增加一条有向边,然后询问新图中一共 有多少个不同的子图为"树形图". 解法:容斥原理+dp,先考虑没有环的情况,经过尝试不难发现 ...
随机推荐
- 机器学习入门-使用GridSearch进行网格参数搜索GridSeach(RandomRegressor(), param_grid, cv=3)
1.GridSeach(RandomRegressor(), param_grid, cv=3) GridSearch第一个参数是算法本身, 第二个参数是传入的参数组合, cv表示的是交叉验证的次数 ...
- 14 MySQL--事务&函数与流程控制
一.事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性 场景: ...
- 8 python time$datetime
1.表示时间的方式 (1)时间戳 时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 我们运行“type(time.time())” ...
- windows下的java项目打jar分别编写在windows与linux下运行的脚本( 本人亲测可用!)
前言: 最近公司做了一个工具,要将这个工具打包成一个可运行的程序,编写start.bat和start.sh在windows和linux下都可以运行. 在网上找了很多资料,最后终于找到一个可靠的资料,记 ...
- DB分布式 跨库分页
DB分布式-两种方式 1. JDBC扩展 sharding-jdbc: 直接封装JDBC,代码迁移成本低,适用于任何连接池及ORM框架,JAR包提供服务,未使用中间层,不用额外部署,DBA无需 ...
- Ubuntu技巧之清理系统中无用的软件包
如果你频繁的在你的系统中安装/卸载,那么不时的清理一下你的系统是十分必要的. 在Ubuntu终端中执行如下命令: sudo apt-get autoremove 屏幕输出是这个样子的: Reading ...
- Eclipse 安装JavaEE插件
Oxygen版Eclipse 导入项目会自动安装你项目需要的一些插件,但是有时候会安装失败,需要手动安装: 这里以Dynamic Web Project项目为例 打开Eclipse,依次选择Help ...
- RESTORE 无法处理数据库 'Students',因为它正由此会话使用。建议在执行此操作时使用 master 数据库。
恢复数据库是总弹出报错对话框如下:RESTORE 无法处理数据库 'Students',因为它正由此会话使用.建议在执行此操作时使用 master 数据库.RESTORE DATABASE 正在异常终 ...
- hive sql split 分隔符
Hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...
- Mysql count(1) group_concat 高级用法(count 过滤条件,group_concat过滤条件)
1.官方文档: count:COUNT(expr) [over_clause] https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.h ...