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. MySQL:提高笔记-1

    MySQL:提高笔记-1 学完基础的语法后,进一步对 MySQL 进行学习 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门到精通 后做的笔记 1. 索引 1.1 索引概述 M ...

  2. 2021.8.8考试总结[NOIP模拟33]

    T1 Hunter 考场上一看期望直接状压拿了$45pts$跑了.结果正解只用$4$行? 把问题转化为一号猎人之前死的猎人数的期望加一. 期望的线性性. 对每个猎人$i$,$w_i+w_1$种情况中有 ...

  3. hdu 1861 游船出租(模拟题,,水)

    题意: 现有公园游船租赁处请你编写一个租船管理系统. 当游客租船时,管理员输入船号并按下S键,系统开始计时:当游客还船时,管理员输入船号并按下E键,系统结束计时. 船号为不超过100的正整数.当管理员 ...

  4. 开发笔记-----Ajax 基础使用

    一.GET 方式的用法: 1 <!--html --> 2 <div class="layui-form"> 3 <div class="l ...

  5. DeWeb --- Hello,World!

    1.新建一个DLL,命名为hello.dpr 2.新增一个Form.(File->New->VCL Form - Delphi),建议不要更改单元名称和Form名称,即分别为unit1.p ...

  6. C++ IO基础

    一:c++I/O处理,按照数据输入输出的过程,形象的将其看做流.数据在流中进行传播. 所有的流有两个基类:ios和streambuf类 streambuf:提供对缓冲区的基本操作,设置缓冲区等 ios ...

  7. Pytorch中stack()方法的理解

    Torch.stack() 1. 概念 在一个新的维度上连接一个张量序列 2. 参数 tensors (sequence)需要连接的张量序列 dim (int)在第dim个维度上连接 注意输入的张量s ...

  8. requestAnimationFrame 执行机制探索

    1.什么是 requestAnimationFrame window.requestAnimationFrame() 告诉浏览器--你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更 ...

  9. Netty数据如何在 pipeline 中流动

    前言 在之前文章中,我们已经了解了pipeline在netty中所处的角色,像是一条流水线,控制着字节流的读写,本文,我们在这个基础上继续深挖pipeline在事件传播 Unsafe对象 顾名思义,u ...

  10. 基于hadoop_yarn的资源隔离配置

    目录 yarn的基本概念 scheduler 集群整体的资源定义 fair scheduler简介 配置demo 队列的资源限制 基于具体资源限制 基于权重资源限制 队列运行状态限制 基于用户和分组限 ...