noip模拟赛 分组


分析:暴力分挺多,也挺好想的,个人感觉两个特殊性质没什么卵用.
对于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模拟赛 分组的更多相关文章
- 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 ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- 对char类型数组的英文字母进行冒泡排序
import java.util.Arrays; import java.util.Scanner; public class Demo02 { public static void main(Str ...
- ADO.net增删改的使用
添加数据 -------------------------------------------------- //让用户输入要添加的内容 Console.WriteLine("请输入要添加 ...
- 窗体WINFORM
窗体的事件:删除事件:先将事件页面里面的挂好的事件删除,再删后台代码里面的事件 Panel是一个容器 1.Label -- 文本显示工具Text:显示的文字取值.赋值:lable1.Text 2.Te ...
- 教你如何在实战项目中使用WCF
我们都知道调用WCF直接在Service References中引用可以远程调用的WCF Url就行了. 但是我们想过没,在Development环境中可以这样做,但是QA.UAT.Productio ...
- Oracle Mysql的jdbc连接
Oracle和MySql的jdbc或连接池中的连接,写下来以便随时参考 Oracle: driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc ...
- CROSS APPLY AND CROSS APPLY
随着业务千奇百怪,DBA数据库设计各有不同,一对多关系存JSON或字符串逗号分隔... 今天小编给大家分享一下针对这个问题的解决办法 问题一.存储过程接受参数格式为XXX,XXX 解决办法:将字符转成 ...
- 详解java基础--抽象类、接口与多态
抽象类.接口.多态都是面向对象中很基础的东西,我相信看到能本篇博客的人本不会再纠结它的基本定义了,本篇文章将尽量的更加深层次的挖掘其内涵,希望能对大家有帮助. 一.抽象类 1.形式 abstract ...
- angular2快速开始
简介 5 分钟从0搭建一个ng2项目demohttps://angular.io/docs/js/latest/quickstart.html 你运气真好,竟然看到了这篇文章,你省事了,一分钟让你完成 ...
- spring中路径的注入
@RequestMapping("${mgt}/file") //请求的路径的统一添加,需要在mvc层配置<context:property-placeholder loca ...
- app dcloud 打包公用证书
Android平台云端打包使用的DCloud公用证书 分类:HTML5+ 5+App开发 HBuilder|HBuilderX应用云端打包Android平台默认使用的DCloud公用证书,其信息如下: ...