传送门


首先是贪心的思路

从后向前选,能多选就多选,

理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小

对于K==1,枚举1~512直接判断

对于K==2,需要用镜像并查集,来刻画“敌对关系”,如果a和b产生矛盾,就把a和b的镜像(b')连接 ,b和a'连接,然后判断自己是不是和自己的镜像连接了

打上时间戳避免清零卡常

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 131100
using namespace std;
int n,K;
namespace solve1
{
int read(){
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(ch^);ch=getchar();}
return x;
}
int n,K,cnt;
int a[MAXN];
int b[MAXN<<];
int p[];
vector<int> v;
int check(int x){
for(int i=;i>=;i--){
if(p[i]-x<=){
return ;
}
if(b[p[i]-x]&&b[p[i]-x]==cnt){
return ;
}
}
return ;
}
void solve(){
n=::n,K=::K;
cnt=;
for(int i=;i<=;i++){
p[i]=i*i;
}
for(int i=;i<=n;i++){
a[i]=read();
}
for(int i=n;i>=;i--){
if(check(a[i])){
b[a[i]]=cnt;
}
else{
cnt++;
b[a[i]]=cnt;
v.push_back(i);
}
}
printf("%d\n",cnt);
for(int i=v.size()-;i>=;i--){
printf("%d ",v[i]);
}
}
}
namespace solve2
{
int read(){
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(ch^);ch=getchar();}
return x;
}
int f[MAXN<<];
vector<int> v[MAXN<<];
int vis[MAXN<<];
int p[];
int a[MAXN];
int n,K;
int cnt;
vector<int> ans;
int find(int x){
return (f[x]==x?x:f[x]=find(f[x]));
}
void lik(int x,int y){
x=find(x),y=find(y);
if(x!=y){
f[x]=y;
}
}
bool same(int x,int y){
return (find(x)==find(y));
}
int check(int x){
for(int i=;i>=;i--){
if(p[i]-a[x]<=){
return ;
}
else if(vis[p[i]-a[x]]&&vis[p[i]-a[x]]==cnt){
for(int j=;j<v[p[i]-a[x]].size();j++){
int t=v[p[i]-a[x]][j];
if(same(x,t)){
return ;
}
lik(x,t+n);
lik(x+n,t);
}
}
}
return ;
}
void solve(){
n=::n,K=::K;
cnt=;
for(int i=;i<=;i++){
p[i]=i*i;
}
for(int i=;i<=(n<<);i++){
f[i]=i;
}
for(int i=;i<=n;i++){
a[i]=read();
}
for(int i=n;i>=;i--){
if(check(i)){
if(vis[a[i]]!=cnt){
vis[a[i]]=cnt;
v[a[i]].clear();
}
v[a[i]].push_back(i);
}
else{
cnt++;
vis[a[i]]=cnt;
v[a[i]].clear();
v[a[i]].push_back(i);
ans.push_back(i);
}
}
printf("%d\n",cnt);
for(int i=ans.size()-;i>=;i--){
printf("%d ",ans[i]);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("a.out","w",stdout);
scanf("%d%d",&n,&K);
if(==K){
solve1::solve();
}
else{
solve2::solve();
}
return ;
}

洛谷mNOIP模拟赛Day1-分组的更多相关文章

  1. 【洛谷mNOIP模拟赛Day1】T1 斐波那契

    题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...

  2. 洛谷mNOIP模拟赛Day1-斐波那契

    题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家 ...

  3. 洛谷noip 模拟赛 day1 T3

    T7983 大芳的逆行板载 题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇 ...

  4. 洛谷mNOIP模拟赛Day2-星空

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. ...

  5. 洛谷mNOIP模拟赛Day2-将军令

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...

  6. 洛谷mNOIP模拟赛Day2-入阵曲

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...

  7. 洛谷mNOIP模拟赛Day1-数颜色

    传送门 题目大意: 给定一个序列,维护每个数字在[L,R]出现的次数以及交换a[x]和a[x+1]的操作 一开始想的分桶法,感觉复杂度还可以吧,常数有点大,于是死得很惨(65分) #include&l ...

  8. 洛谷noip 模拟赛 day1 T1

    T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...

  9. 湖南国庆模拟赛day1 分组

    题目大意:给你一个n个数的数列s,要对这些数进行分组,当有任意两个数在一种方案在一起而在另一种方案中不在一起算是两种不同的方案,一个组的"不和谐程度"为组内数的极差,如果只有一个人 ...

随机推荐

  1. C语言第一次博客作业—输入输出

    一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...

  2. 【评分】集美大学软件工程1413班工程项目管理个人作业2——APP案例分析

    [评分]个人作业2--APP案例分析 作业要求 作业地址及完成情况 博文要求 通过分析你选中的产品,结合阅读<构建之法>,写一篇随笔,包含下述三个环节的所有要求. 第一部分 调研, 评测 ...

  3. 成功案例分享:raid5两块硬盘掉线数据丢失恢复方法

    1. 故障描述    本案例是HP P2000的存储vmware exsi虚拟化平台,由RAID-5由10块lT硬盘组成,其中6号盘是热备盘,由于故障导致RAID-5磁盘阵列的两块盘掉线,表现为两块硬 ...

  4. caffe实现GAN

    我实现GAN网络结构比较复杂: 通过建立两个一模一样的网络,他们相对应的层共享权重,一个网络用来跟新D model另一个网络用来更新G model 更新G model的网络,D部分只进行梯度传递,不进 ...

  5. installutil 安装windows service

    1:路径:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2:执行指令:C:\Windows\Microsoft.NET\Framework\v4.0.30 ...

  6. PHP trait

    ps:由于PHP是单继承的,无法继承多个类所以可以用triat(关键字,特性)来命名达到子类继承多个父类的效果:暂且理解为类吧.class = trait <?php trait A { pub ...

  7. Highcharts tooltip显示多条线的信息

    直接上代码吧,简单粗暴点: tooltip: { shared: true, valueSuffix: '分', formatter: function () { let s = "&quo ...

  8. maven入门(9)Maven常用命令

    Maven常用命令 清理 clean编译 compile打包 package安装 install跳过测试 clean package -Dmaven.test.skip=true

  9. python/基础输出输入用法

    输出及输入的简单用法 print print,中文意思是打印,在python里它不是往纸上打印,而是打印在命令行,或者叫终端.控制台里面.print是python里很基本很常见的一个操作,它的操作对象 ...

  10. __new__ 单例

    a.实例化类 实例化一个类时 1. 创建一个对象,调用__new__方法,如果没有会调用父类的__new__方法 2. 调用__init__方法 3. 返回对象的引用 class Dog(object ...