NOIP 模拟 9 分组
题解
这道题我们发现可以根据 \(k=1\) 和 \(k=2\) 的情况分别讨论
\(k=1\) 时,我们发现要保证字典序,那么我们从后往前扫,扫的时候判断一下当前数是否会和上一段的冲突。
复杂度瓶颈就在于如何判断。我们发现 \(a_i\leq 2^{17}\) 所以 \(j*j=a_i+a_k\) 中 \(j\) 最大为 \(2^9\),所以我们可以枚举 \(j\),记录一个数组,判断一下 \(j*j-a_i\) 是否出现过
最后若分出新的一段,记得要把前一段的清空。
\(k=2\) 时,我们可以把每个数拆成两个点,分别为 \(x_1\),\(x_2\),\(y_1\),\(y_2\),让后将冲突的数连起来,发现如果其符合二分图,那么就可以分为一组。
对于判断二分图,我们可以用并查集替代。(思想)
对于每个数,我们给他开一个敌人域,每次若发现冲突,但可以分成两个团体解决,那么我们将两个树的敌人域向与其发生冲突的数合并
判断时就是判断 \(x_1\) 是否和 \(y_1\) 在一个集合里。
Code:
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int N=(1<<17)+7;
int a[N],vis[N],st[N],fa[N<<1],fg[N<<1],n,k,tot=1,mx;
int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
n=read(),k=read();
for (ri i(1);i<=n;p(i)) a[i]=read(),mx=cmax(mx,a[i]);
vis[a[n]]=1;st[1]=n;
if (k==1) {
for (ri i(n-1);i;--i) {
for (ri j(ceil(sqrt(a[i])));j*j-a[i]<=mx;p(j)) {
if (j*j>=a[i]&&vis[j*j-a[i]]) {
st[p(tot)]=i;
for (ri k(i+1);k<=st[tot-1];p(k)) vis[a[k]]=0;
break;
}
}
vis[a[i]]=1;
}
} else {
for (ri i(1);i<=mx;p(i)) fa[i]=i,fa[i+mx]=i+mx;
for (ri i(1);i*i<=(mx<<1);p(i)) fg[i*i]=1;
for (ri i(n-1);i;--i) {
ri fl=0;
if (vis[a[i]]) {
if (fg[a[i]<<1]) {
if (vis[a[i]]==2||fa[a[i]+mx]!=a[i]+mx) fl=1;
}
} else {
for (ri j(ceil(sqrt(a[i])));j*j-a[i]<=mx;p(j)) {
if (vis[j*j-a[i]]) {
if (fg[(j*j-a[i])<<1]&&vis[j*j-a[i]]==2) {fl=1;break;}
int x1=find(a[i]),x2=find(a[i]+mx),y1=find(j*j-a[i]),y2=find(j*j-a[i]+mx);
if (x1==y1) {fl=1;break;}
fa[y2]=x1;fa[x2]=y1;
}
}
}
if (fl) {
for (ri j(i);j<=st[tot];p(j)) fa[a[j]]=a[j],fa[a[j]+mx]=a[j]+mx,vis[a[j]]=0;
st[p(tot)]=i;
}
p(vis[a[i]]);
}
}
printf("%d\n",tot);
for (ri i(tot);i>1;--i) printf("%d ",st[i]);
puts("");
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 9 分组的更多相关文章
- 2018.10.02 NOIP模拟 矩阵分组(二分答案)
传送门 考场上并不会写二分的check函数,下来看了看题解发现真是妙极. 不难想到每次直接从四个角各按阶梯状拓展出合法区域A,再检验B是否合法就行了.(然而考场上写的弃疗了) 于是题解用了一些小技巧优 ...
- noip模拟赛 分组
分析:暴力分挺多,也挺好想的,个人感觉两个特殊性质没什么卵用. 对于K=1,n ≤ 1024的情况,从后往前贪心地分,如果能和上一组分在一起就分在一起,否则就再开一组,这样可以保证字典序最小.ai ≤ ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- fastposter发布1.4.2 跨语言的海报生成器
fastposter发布1.4.2 跨语言的海报生成器 fastposter发布1.4.2 跨语言的海报生成器,一分钟完成海报开发 future: 完善docker镜像 引入异步asyncio 升级p ...
- mysql学习--MySQL存储引擎对比总结
一.存储引擎是什么 存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的.MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用.你可以选择适用于服务器. ...
- Red Hat系统下安装gcc
这篇是在客户服务器上安装redis碰到的问题.服务器是RedHat,无法直接安装gcc,导致Redis无法安装的解决办法: 1.make redis时候报下面这样的错,原因就是gcc没有安装. ...
- [刘阳Java]_MyBatis_注解基本用法_第10讲
MyBatis注解提出,可以说是非常好简化了MyBatis配置文件的使用.下面我们简单地来告诉大家如何使用MyBatis的注解 定义接口 package com.gxa.dao; import jav ...
- 一文读懂k8s rbac 权限验证
自我认为的k8s三大难点:权限验证,覆盖网络,各种证书. 今天就说一下我所理解的权限验证rbac. 咱不说rbac0,rbac1,rbac2,rbac3.咱就说怎么控制权限就行. 一.前言 1,反正R ...
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- 网络损伤仪WANsim--不同的部署方式
网络损伤仪WANsim的业务口在逻辑上是不存在IP地址与MAC地址的,所以,WANsim可以串接在测试拓扑中的任意位置,只需要确保有流量通过WANsim即可. 不同的拓扑结构会对测试的结果造成影响.在 ...
- odoo14里面的log模块
日志记录是分析 Odoo 服务器运行服务时发生的操作的最重要工具之一.此外,在大多数情况下,通过分析服务器日志,我们可以清楚地了解错误或存在的任何错误. 最初,如果我们想使用日志记录选项,我们需要从 ...
- python批量修改图片名称
import os class BatchRename(): def rename(self): # windows环境 """ os.rename() 方法用于命名文件 ...
- U盘启动盘安装win10出现cdboot:couldn't find ntldr
格式化硬盘后出现:cdboot:couldn't find ntldr 解决方法: 分区时格式选择:硬盘格式导致的,一般出现在win10装win7时,需要用pe系统里的分区工具重新给为硬盘分区,并将 ...