(Good Bye 2019) Codeforces 1270E Divide Points

题目链接:

Codeforces 1270E Divide Points

思路:

对于所有点我们将他们分为四类:(1)(偶,偶) (2)(偶,奇) (3)(奇,偶) (4)(奇,奇);
以第一个点为原点重新划分坐标轴;
所有点如果都属于第一类,我们就将比例缩小两倍即所有点坐标除以2,直到有点不属于第一类,我们注意到第一个点是(0,0)永远属于第一类,所以现在我们至少有两类点;
1.如果(2)(3)类没有点,我们可以将(1)(4)当成两个集合,因为同集合线段长的平方可以表示成 ( 2 m ) 2 + ( 2 n ) 2 (2m)^2+(2n)^2 (2m)2+(2n)2,可以被4整除;而不同集合线段长可以表示为 ( 2 m + 1 ) 2 + ( 2 n + 1 ) 2 (2m+1)^2+(2n+1)^2 (2m+1)2+(2n+1)2,不可以被4整除;那就不会有相同集合点的连线长等于不同集合点的连线长了;
2.如果(2)(3)有点,我们就将(1)(4)分为一个集合,(2)(3)一个集合,因为同集合线段长平方一定为偶,不同集合线段长一定为奇,也是互不相交的;

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int n,x[maxn],y[maxn];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
	for(int i=n;i>=1;i--) x[i]-=x[1],y[i]-=y[1];
	while(true){
		for(int i=1;i<=n;i++) if((x[i]&1)||(y[i]&1)) goto out;
		for(int i=1;i<=n;i++) x[i]>>=1,y[i]>>=1;
	}out:;
	vector<int> a,b;
	for(int i=1;i<=n;i++){
		if(!(x[i]&1)&&!(y[i]&1)) a.push_back(i);
		else if((x[i]&1)&&(y[i]&1)) b.push_back(i);
	}
	if(a.size()+b.size()==n){
		cout<<a.size()<<'\n';
		for(int& x:a) cout<<x<<' ';
	}else{
		cout<<a.size()+b.size()<<'\n';
		for(int& x:a) cout<<x<<' ';
		for(int& x:b) cout<<x<<' ';
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值