分析:暴力分挺多,也挺好想的,个人感觉两个特殊性质没什么卵用.

对于K=1,n ≤ 1024的情况,从后往前贪心地分,如果能和上一组分在一起就分在一起,否则就再开一组,这样可以保证字典序最小.ai ≤ 2就看前面有没有2.有就不能分在一组.n ≤ 131072就不能再这样二重循环枚举了,因为两个数的和顶多只有262114 = 512^2,从1枚举到512,看看它的平方有没有被占用就可以了,就把问题从序列上转化到了值域上.

对于K=2,其实做法和K=1没什么两样,只是每一组可以分成两个对立的小组,非常像noip2010关押罪犯,加一个并查集就好了.用一个vector存每个值的兔子的位置,判断一下有没有冲突就好了.

暴力+正解:

#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; vector <int>E[maxn * + ];
int n, k, a[], ans[], cnt, fa[], vis[], T;
bool flag = true; bool check2(int x)
{
for (int i = ; i <= ; i++)
{
if (i * i - x >= && vis[i * i - x])
return false;
}
return true;
} int find(int x)
{
if (x == fa[x])
return x;
return fa[x] = find(fa[x]);
} bool check(int x, int y)
{
int t = x + y;
int p = sqrt(t);
if (p * p == t)
return false;
return true;
} void solve1()
{
if (n <= )
{
int cur = n;
for (int i = n; i >= ; i--)
{
for (int j = i + ; j <= cur; j++)
{
if (!check(a[i], a[j]))
{
ans[++cnt] = i;
cur = i;
}
}
}
printf("%d\n", cnt + );
for (int i = cnt; i >= ; i--)
printf("%d ", ans[i]);
printf("\n");
}
else
if (flag)
{
int cur = n;
bool flag2 = false;
for (int i = n; i >= ; i--)
{
if (flag2 && a[i] == )
{
ans[++cnt] = i;
cur = i;
}
if (a[i] == )
flag2 = ;
}
printf("%d\n", cnt + );
for (int i = cnt; i >= ; i--)
printf("%d ", ans[i]);
printf("\n");
}
else
{
int cur = n;
for (int i = n; i >= ; i--)
{
if (!check2(a[i]))
{
for (int j = i + ; j <= cur; j++)
vis[a[j]] = ;
ans[++cnt] = i;
cur = i;
}
vis[a[i]] = ;
}
printf("%d\n", cnt + );
for (int i = cnt; i >= ; i--)
printf("%d ", ans[i]);
printf("\n");
}
} void hebing(int x, int y)
{
x = find(x), y = find(y);
fa[x] = y;
} bool check3(int x)
{
for (int i = ; i <= ; i++)
{
if (i * i - a[x] >= && vis[i * i - a[x]] == T)
{
int now = i * i - a[x];
for (int j = ; j < E[now].size(); j++)
{
if (find(x) == find(E[now][j]))
return false;
hebing(x + n, E[now][j]);
hebing(x, E[now][j] + n);
}
}
}
return true;
} void solve2()
{
if (flag)
{
int flag2 = ;
for (int i = n; i >= ; i--)
{
if (flag2 == && a[i] == )
{
ans[++cnt] = i;
flag2 = ;
}
if (a[i] == )
flag2++;
}
printf("%d\n", cnt + );
for (int i = cnt; i >= ; i--)
printf("%d ", ans[i]);
printf("\n");
}
else
if (n <= )
{
for (int i = ; i <= n * ; i++)
fa[i] = i;
int cur = n;
for (int i = n; i >= ; i--)
{
for (int j = i + ; j <= cur; j++)
{
if (!check(a[i], a[j]))
{
if (find(i) == find(j))
{
ans[++cnt] = i;
cur = i;
}
else
{
int xx = find(i + n), yy = find(j + n);
fa[i] = yy;
fa[j] = xx;
}
}
}
}
printf("%d\n", cnt + );
for (int i = cnt; i >= ; i--)
printf("%d ", ans[i]);
printf("\n");
}
else
{
T = ;
for (int i = ; i <= n * ; i++)
fa[i] = i;
for (int i = n; i >= ; i--)
{
if (!check3(i))
{
T++;
ans[++cnt] = i;
}
if (vis[a[i]] != T)
{
vis[a[i]] = T;
E[a[i]].clear();
}
E[a[i]].push_back(i);
}
printf("%d\n", cnt + );
for (int i = cnt; i >= ; i--)
printf("%d ", ans[i]);
printf("\n");
}
} int main()
{
scanf("%d%d", &n, &k);
for (int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
if (a[i] > )
flag = false;
} if (k == )
solve1();
if (k == )
solve2(); return ;
}

noip模拟赛 分组的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. .Net Framework Client Profile 和 .Net Framework的区别[转]

    原文链接 VS2010默认是以.Net Framework Client Profile为生成环境的,如果需要更多的功能,应该调用.Net Framework.

  2. Android最简单的实例 :环境搭建及HelloWorld

    Android开发之旅:环境搭建及HelloWorld 2010-04-12 00:45 by 吴秦, 883961 阅读, 140 评论, 收藏,  编辑 ——工欲善其事必先利其器 引言 本系列适合 ...

  3. laravel 学习

    解决办法:没有开启PHP.ini的fileinfo扩展

  4. Asp.Net识别手机访问

    在VS创建WEB应用程序时会有一个微软开发的典型web应用程序 在根目录有个用户控件用来实现切换手机和电脑 其中有个微软开发的类和方法用来专门判断移动设备和桌面设备 在Microsoft.AspNet ...

  5. hibernate与struts2整合中出现问题以及一级缓存查询数据在业务层问题

    直接上问题: org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Custom ...

  6. poj3109 Inner Vertices

    思路: 树状数组 + 扫描线. 实现: #include <cstdio> #include <vector> #include <algorithm> using ...

  7. 移动端rem

    手机有很多尺寸的型号.使用rem来做为大小单位可以达到兼容的目的. 方法一:js测量手机尺寸,设置font-size:为手机屏幕width /10 + ‘px’.即10rem 为手机屏幕width. ...

  8. js跨域请求的5中解决方式

    跨域请求数据解决方案主要有如下解决方法: ? 1 2 3 4 5 JSONP方式 表单POST方式 服务器代理 Html5的XDomainRequest Flash request 分开说明: 一.J ...

  9. (2)《Head First HTML与CSS》学习笔记---img与基于标准的HTML5

    1.浏览器处理图像的过程: 1.服务器获取文件,显示出文本结构,以及预留默认的大小给<img>(如果该<img>有width-1值和height-1值,则根据这个值提前设好页面 ...

  10. volley的框架安装与使用

    最后一步非常重要   不然会报错: publish = project.has("release")   替换为: publish = project.hasProperty(&q ...