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个立方 ...
随机推荐
- DOS命令和快捷键
- UE4蓝图AI角色制作(六)之行为树
13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...
- 【二食堂】Beta - 设计和计划
Beta设计和计划 需求再分析 根据助教.老师.用户以及各个团队PM的反馈意见,我们的项目目前有以下问题: 功能不完整 实用价值不高 两方面的缺陷,所以在Beta阶段,我们工作的中心还是完成项目规划中 ...
- 第四次Scrum Metting
日期:2021年4月29日 会议主要内容概述:交代近两日工作,进一步细化上次讨论细节,代码合并. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...
- advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)
<高级Bash脚本编程指南>Revision 10中文版 github上链接地址: https://github.com/LinuxStory/Advanced-Bash-Scriptin ...
- PCIE基本知识
转载:https://zhuanlan.zhihu.com/p/139656925 前言 之前主要都在做FPGA算法层面的东西,最近觉得对于接口方面的知识比较欠缺,打算以PCI-E为例来系统的学习一下 ...
- 最短路计数(SPFA× Dijkstra√)
题目描述 给出一个n个顶点m条边的无向无权图,顶点编号为1−n.问从顶点1开始,到其他每个点的最短路有几条. 输入格式 第一行包含2个正整数n,m,为图的顶点数与边数. 接下来M行,每行2个正整数x, ...
- 0x02
#include<bits/stdc++.h> using namespace std; int n,a[10][10],vis[10],ans,b[10][10]; inline int ...
- hdu 1158 Employment Planning(DP)
题意: 有一个工程需要N个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ...
- Java RMI学习与解读(三)
Java RMI学习与解读(三) 写在前面 接下来这篇就是最感兴趣的Attack RMI部分了. 前面也说过,RMI的通信过程会用到反序列化,那么针对于RMI的三个角色: Server/Regisrt ...