Codeforces 题目传送门 & 洛谷题目传送门

显然,直接暴力枚举是不可能的。

考虑将点按横纵坐标奇偶性分组,记 \(S_{i,j}=\{t|x_t\equiv i\pmod{2},y_t\equiv j\pmod{2}\}(i,j\in[0,1])\),说白了就是横坐标为偶数、纵坐标为偶数;横坐标为偶数、纵坐标为奇数;横坐标为奇数、纵坐标为偶数;横坐标为奇数、纵坐标为奇数的点集。

然后考虑以下算法:

  • 若 \(S_{0,0},S_{1,1}\) 以及 \(S_{0,1},S_{1,0}\) 中至少各有一个集合非空,那么我们令 \(A=S_{0,0}\cup S_{1,1},B=S_{1,0}\cup S_{0,1}\) 即可,因为对于 \(S_{0,0},S_{1,1}\) 中任意两点,它们距离的平方要么模 \(4\) 余 \(0\),要么模 \(4\) 余 \(2\),\(S_{0,1},S_{1,0}\) 也同理;而对于 \(S_{0,0},S_{1,1}\) 与 \(S_{0,1},S_{1,0}\) 之间的点,距离的平方模 \(4\) 余 \(1\),符合题目要求。

  • 若 \(S_{0,0}\) 以及 \(S_{1,1}\) 均非空,那么我们令 \(A=S_{0,0},B=S_{1,1}\) 即可。因为对于 \(S_{0,0}\) 中的任意点它们距离的平方模 \(4\) 余 \(0\),\(S_{1,1}\) 也同理;对于 \(S_{0,0}\) 与 \(S_{1,1}\) 之间的点它们距离的平方模 \(4\) 余 \(2\)。满足两两不同的条件。

  • 若 \(S_{1,0}\) 以及 \(S_{1,0}\) 均非空,类比 \(S_{0,0}\) 以及 \(S_{1,1}\) 非空的情况即可。

  • 若以上条件均不满足,即 \(S_{0,0},S_{0,1},S_{1,0},S_{1,1}\) 中恰有一个非空,那么我们令所有点横纵坐标除以 \(2\),再重复以上操作即可,因为我们总能找到一个时刻使得 \(S_{0,0},S_{0,1},S_{1,0},S_{1,1}\) 不止一个非空。

这样即可通过此题。


你可能会疑惑我为什么要为这道 *2300 的题专门写篇题解,题目本身虽然简单,但也能从中学到一个解决构造题的技巧:观察题目中奇偶性。有不少构造题都是以奇偶性为突破口解决的,当然有时候解构造题的关键不仅仅局限于奇偶性,包括题目中给定的一些特殊的条件等,总而言之解决构造题的技巧说白了只有一点,那就是观察题目中的性质。u1s1 我构造题做不出来大概也就是因为我不具备猜结论的能力罢

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MAXN=1e3;
int n,x[MAXN+5],y[MAXN+5];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
while(1){
static int cnt[2][2];memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++) cnt[x[i]&1][y[i]&1]++;
if(cnt[0][0]+cnt[1][1]>0&&cnt[0][1]+cnt[1][0]>0){
vector<int> ans;
for(int i=1;i<=n;i++) if((x[i]&1)^(y[i]&1)) ans.pb(i);
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
printf("\n");return 0;
} else if(cnt[0][0]>0&&cnt[1][1]>0||cnt[0][1]>0&&cnt[1][0]>0){
vector<int> ans;
for(int i=1;i<=n;i++) if(x[i]&1) ans.pb(i);
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
printf("\n");return 0;
}
for(int i=1;i<=n;i++) x[i]>>=1,y[i]>>=1;
}
return 0;
}

Codeforces 1270E - Divide Points(构造+奇偶性)的更多相关文章

  1. codeforces 792C. Divide by Three

    题目链接:codeforces 792C. Divide by Three 今天队友翻了个大神的代码来问,我又想了遍这题,感觉很好,这代码除了有点长,思路还是清晰易懂,我就加点注释存一下...分类吧. ...

  2. codeforces 577E E. Points on Plane(构造+分块)

    题目链接: E. Points on Plane time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. codeforces 19D D. Points 树套树

    D. Points Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/19/problem/D De ...

  4. codeforces #550D Regular Bridge 构造

    题目大意:给定k(1≤k≤100),要求构造一张简单无向连通图,使得存在一个桥,且每一个点的度数都为k k为偶数时无解 证明: 将这个图缩边双,能够得到一棵树 那么一定存在一个叶节点,仅仅连接一条桥边 ...

  5. Codeforces 1383D - Rearrange(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...

  6. codeforces B.Fixed Points

    link:http://codeforces.com/contest/347/problem/B 很简单,最多只能交换一次,也就是说,最多会增加两个.可能会增加一个.也可能一个也不增加(此时都是fix ...

  7. Codeforces 549B. Looksery Party[构造]

    B. Looksery Party time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. codeforces B. Fixed Points 解题报告

    题目链接:http://codeforces.com/problemset/problem/347/B 题目意思:给出一个包含n个数的排列a,在排列a中最多只能作一次交换,使得ai = i 这样的匹配 ...

  9. codeforces 323A. Black-and-White Cube 构造

    输入n 1 <= n <= 100 有一个n * n * n 的立方体,由n ^ 3 个1 * 1 * 1 的单位立方体构成 要用white 和 black 2种颜色来染这n ^ 3个立方 ...

随机推荐

  1. 【UE4 C++】Print、Delay、ConsoleCommand

    基于UKismetSystemLibrary PrintString /** * Prints a string to the log, and optionally, to the screen * ...

  2. 关于java socket中的read方法阻塞问题

    客户端: public class TCPClient { public static void main(String[] args) throws IOException { FileInputS ...

  3. DevOps 时代的高效测试之路

    10 月 22 日,2021 届 DevOps 国际峰会在北京顺利召开,来自国内外的顶级技术专家共同畅谈 DevOps 体系与方法.过程与实践.工具与技术.CODING 测试及研发流程管理产品总监程胜 ...

  4. httpclient 登录成功后返回的cookie值访问下一页面

    HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的"执行get请 ...

  5. [敏捷软工团队博客]Beta阶段测试报告

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段测试报告 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...

  6. BUAA2020软工作业(一)——谈谈我和计算机的缘分

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...

  7. SpringCloud微服务实战——搭建企业级开发框架(八):使用注解校验微服务消息参数

      平时开发过程中,经常要用到参数校验,如果直接在代码逻辑里面写参数校验,代码有点冗余且用起来不是非常方便,显得代码逻辑复杂且重复代码太多,这里我们使用注解的方式进行参数校验,SpringBoot中常 ...

  8. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  9. 万维网www与HTTP协议

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105901440 学习课程:<2019王道考研计算机网络> 学习目的 ...

  10. C++链表常见面试考点

    链表常见问题: 单链表找到倒数第n个节点 用两个指针指向链表头,第一个指针先向前走n步,然后两个指针同步往前走,当第一个指针指向最后一个节点时,第二个指针就指向了倒数第n个节点. 判断链表有没有环 快 ...