Codeforces 1270E - Divide Points(构造+奇偶性)
显然,直接暴力枚举是不可能的。
考虑将点按横纵坐标奇偶性分组,记 \(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(构造+奇偶性)的更多相关文章
- codeforces 792C. Divide by Three
题目链接:codeforces 792C. Divide by Three 今天队友翻了个大神的代码来问,我又想了遍这题,感觉很好,这代码除了有点长,思路还是清晰易懂,我就加点注释存一下...分类吧. ...
- codeforces 577E E. Points on Plane(构造+分块)
题目链接: E. Points on Plane time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- codeforces 19D D. Points 树套树
D. Points Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/19/problem/D De ...
- codeforces #550D Regular Bridge 构造
题目大意:给定k(1≤k≤100),要求构造一张简单无向连通图,使得存在一个桥,且每一个点的度数都为k k为偶数时无解 证明: 将这个图缩边双,能够得到一棵树 那么一定存在一个叶节点,仅仅连接一条桥边 ...
- Codeforces 1383D - Rearrange(构造)
Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...
- codeforces B.Fixed Points
link:http://codeforces.com/contest/347/problem/B 很简单,最多只能交换一次,也就是说,最多会增加两个.可能会增加一个.也可能一个也不增加(此时都是fix ...
- Codeforces 549B. Looksery Party[构造]
B. Looksery Party time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- codeforces B. Fixed Points 解题报告
题目链接:http://codeforces.com/problemset/problem/347/B 题目意思:给出一个包含n个数的排列a,在排列a中最多只能作一次交换,使得ai = i 这样的匹配 ...
- codeforces 323A. Black-and-White Cube 构造
输入n 1 <= n <= 100 有一个n * n * n 的立方体,由n ^ 3 个1 * 1 * 1 的单位立方体构成 要用white 和 black 2种颜色来染这n ^ 3个立方 ...
随机推荐
- Windows内核开发-10-监听对象
Windows内核开发-10-监听对象 Windows内核除了可以监听进程,线程.dll还可以监听特定的对象和注册表.这里先讲一下监听对象. 监听对象 内核提供了一种可以监听对特定的对象类型的句柄进行 ...
- 初学Python-day7 案例(乘法口诀 已更新!!)
案例::(乘法口诀) 用for循环做乘法口诀: 1 # 第一种 2 for i in range(1, 10): 3 for j in range(1, i + 1): 4 print('{} * ...
- Map中getOrDefault()与数值进行比较
一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...
- linux centos7 修改默认网卡命名规则为eth0脚本
CentOS6之前基于传统的命名方式如:eth1,eth0.... Centos7提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名是全自动的.可预知的,缺点是比eth0. ...
- [BZOJ3307] 雨天的尾巴-----------------线段树进阶
虽然是个板子,但用到了差分思想. Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最 ...
- Python课程笔记(六)
今天上课补上了上次未学完比较重点的鼠标和键盘事件,同时开始学习运用turtle进行绘图. 本次课程的代码: https://gitee.com/wang_ming_er/python_course_l ...
- PyPi到底是什么?pypi有啥作用?PyPi和pip有何渊源?
转载:https://blog.csdn.net/weixin_42139375/article/details/82711201 可能有很多刚入行不久的朋友们,每天都在用pip 命令install ...
- linux shell脚本中的开头#!/bin/bash的含义
对于linux上需要执行 的shell脚本,通常第一行的内容是 #!/bin/bash 当然有很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 .. 这只是因为在我们常用 ...
- python3 调用 centos 常用系统命令
一.创建目录 1 import os 2 3 base_path = '/data/sw_backup' 4 addr= 'FT' 5 ip='192.168.1.1' 6 path = base_p ...
- sqlldr 导入有中文乱码问题
1.导入成功后,查看导入数据有乱码 2.查看字符集为uft8 select * from v$nls_parameters where PARAMETER like '%NLS_CHARACTERSE ...