zoukankan      html  css  js  c++  java
  • (Good Bye 2019) Codeforces 1270E Divide Points

    题目链接:

    Codeforces 1270E Divide Points

    思路:

    对于所有点我们将他们分为四类:(1)(偶,偶) (2)(偶,奇) (3)(奇,偶) (4)(奇,奇);
    以第一个点为原点重新划分坐标轴;
    所有点如果都属于第一类,我们就将比例缩小两倍即所有点坐标除以2,直到有点不属于第一类,我们注意到第一个点是(0,0)永远属于第一类,所以现在我们至少有两类点;
    1.如果(2)(3)类没有点,我们可以将(1)(4)当成两个集合,因为同集合线段长的平方可以表示成(2m)2+(2n)2(2m)^2+(2n)^2,可以被4整除;而不同集合线段长可以表示为(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()<<'
    ';
    		for(int& x:a) cout<<x<<' ';
    	}else{
    		cout<<a.size()+b.size()<<'
    ';
    		for(int& x:a) cout<<x<<' ';
    		for(int& x:b) cout<<x<<' ';
    	}
    	return 0;
    }
    
  • 相关阅读:
    socket的几大异常以及其出现的原因
    将文件打包成apk
    putty失活不挂起运行
    天气免费接口
    内存泄漏
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build
    009 预处理 #pragma once; typedef; #ifdef
    008 区别 : NULL nullptr
    007 头文件 : 作用/组织/包含
    006 整数/浮点数/cpu频率
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308706.html
Copyright © 2011-2022 走看看