洛谷mNOIP模拟赛Day1-分组

传送门



首先是贪心的思路

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

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

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

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

打上时间戳避免清零卡常

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<vector>
  6 #define MAXN 131100
  7 using namespace std;
  8 int n,K;
  9 namespace solve1
 10 {
 11     int read(){
 12         int x=0;char ch=getchar();
 13         while(ch<‘0‘||ch>‘9‘){ch=getchar();}
 14         while(ch>=‘0‘&&ch<=‘9‘){x=x*10+(ch^48);ch=getchar();}
 15         return x;
 16     }
 17     int n,K,cnt;
 18     int a[MAXN];
 19     int b[MAXN<<1];
 20     int p[512];
 21     vector<int> v;
 22     int check(int x){
 23         for(int i=512;i>=0;i--){
 24             if(p[i]-x<=0){
 25                 return 1;
 26             }
 27             if(b[p[i]-x]&&b[p[i]-x]==cnt){
 28                 return 0;
 29             }
 30         }
 31         return 1;
 32     }
 33     void solve(){
 34         n=::n,K=::K;
 35         cnt=1;
 36         for(int i=1;i<=512;i++){
 37             p[i]=i*i;
 38         }
 39         for(int i=1;i<=n;i++){
 40             a[i]=read();
 41         }
 42         for(int i=n;i>=1;i--){
 43             if(check(a[i])){
 44                 b[a[i]]=cnt;
 45             }
 46             else{
 47                 cnt++;
 48                 b[a[i]]=cnt;
 49                 v.push_back(i);
 50             }
 51         }
 52         printf("%d\n",cnt);
 53         for(int i=v.size()-1;i>=0;i--){
 54             printf("%d ",v[i]);
 55         }
 56     }
 57 }
 58 namespace solve2
 59 {
 60     int read(){
 61         int x=0;char ch=getchar();
 62         while(ch<‘0‘||ch>‘9‘){ch=getchar();}
 63         while(ch>=‘0‘&&ch<=‘9‘){x=x*10+(ch^48);ch=getchar();}
 64         return x;
 65     }
 66     int f[MAXN<<1];
 67     vector<int> v[MAXN<<1];
 68     int vis[MAXN<<1];
 69     int p[512];
 70     int a[MAXN];
 71     int n,K;
 72     int cnt;
 73     vector<int> ans;
 74     int find(int x){
 75         return (f[x]==x?x:f[x]=find(f[x]));
 76     }
 77     void lik(int x,int y){
 78         x=find(x),y=find(y);
 79         if(x!=y){
 80             f[x]=y;
 81         }
 82     }
 83     bool same(int x,int y){
 84         return (find(x)==find(y));
 85     }
 86     int check(int x){
 87         for(int i=512;i>=1;i--){
 88             if(p[i]-a[x]<=0){
 89                 return 1;
 90             }
 91             else if(vis[p[i]-a[x]]&&vis[p[i]-a[x]]==cnt){
 92                 for(int j=0;j<v[p[i]-a[x]].size();j++){
 93                     int t=v[p[i]-a[x]][j];
 94                     if(same(x,t)){
 95                         return 0;
 96                     }
 97                     lik(x,t+n);
 98                     lik(x+n,t);
 99                 }
100             }
101         }
102         return 1;
103     }
104     void solve(){
105         n=::n,K=::K;
106         cnt=1;
107         for(int i=1;i<=512;i++){
108             p[i]=i*i;
109         }
110         for(int i=1;i<=(n<<1);i++){
111             f[i]=i;
112         }
113         for(int i=1;i<=n;i++){
114             a[i]=read();
115         }
116         for(int i=n;i>=1;i--){
117             if(check(i)){
118                 if(vis[a[i]]!=cnt){
119                     vis[a[i]]=cnt;
120                     v[a[i]].clear();
121                 }
122                 v[a[i]].push_back(i);
123             }
124             else{
125                 cnt++;
126                 vis[a[i]]=cnt;
127                 v[a[i]].clear();
128                 v[a[i]].push_back(i);
129                 ans.push_back(i);
130             }
131         }
132         printf("%d\n",cnt);
133         for(int i=ans.size()-1;i>=0;i--){
134             printf("%d ",ans[i]);
135         }
136     }
137 }
138 int main()
139 {
140 //    freopen("data.in","r",stdin);
141 //    freopen("a.out","w",stdout);
142     scanf("%d%d",&n,&K);
143     if(1==K){
144         solve1::solve();
145     }
146     else{
147         solve2::solve();
148     }
149     return 0;
150 }
时间: 2024-10-08 05:35:03

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

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

题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其父亲必为$x-Fk$($F$为斐波那契数列,且$F_{k}$为不大于$x$的最大数字),举个例子:$7-5=2$,$11-8=3$,对于点$x$和点$y$,我们分别求出其所有直系祖宗,然后扫一遍即可. 由于斐波那契数列为指数级增长,故向上跳的复杂度为一个$log$级别,时间复杂度为$O(m*log(

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

题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子.我们假定, 在整个过程中兔子不会出现任何意外. 小 C 把兔子按出生顺序,把兔子们从 1 开始标号,并且小 C 的兔子都是 1 号兔子和 1 号兔子的后代.如果某两对兔子是同时出生的,那么小 C 会将父

洛谷mNOIP模拟赛Day1-数颜色

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

洛谷mNOIP模拟赛Day2-入阵曲

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整个世界都焕然一新.这世界上怎么会有这么多奇妙的东西?曾经自己觉得难以 解决的问题,被一个又一个算法轻松解决. 小 F 当时暗自觉得,与自己的幼稚相比起来,还有好多要学习的呢. 一年过

洛谷mNOIP模拟赛Day2-将军令

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前

湖南国庆模拟赛day1 分组

题目大意:给你一个n个数的数列s,要对这些数进行分组,当有任意两个数在一种方案在一起而在另一种方案中不在一起算是两种不同的方案,一个组的“不和谐程度”为组内数的极差,如果只有一个人的话,此组的不和谐程度为0,求有多少种分组方式,使所有组的不和谐程度不超过k? 数据范围 1<=n<=200,0<=k<=1000,1<=si<=500 样例 input1 4 5 1 3 5 7 output1 9 input2 5 6 1 4 5 8 9 output2 20 /* 排序,

NOI模拟赛 Day1

[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧张起来!!! 好了不扯淡了...

2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

回形遍历( calc .cpp/c/pas) 时间限制:1s内存 限制: 256MB [问题 描 述]给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子. [输入]输入文件名为 calc.in.一行,包含五个整数:n,m,x,y,z[输出]输出文件名为 calc.out.输出一行,包含两个整数,表示所在格子的横纵坐标[输入输出样例] calc .in calc .out 4 5 3 0 5 2 4 [ 样例解释 ] [数据说明]对于 70%的数据,1<=n,m,

【洛谷P2104&#183;模拟】二进制

题面 题目描述 小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算: 运算 1:将整个二进制数加 1 运算 2:将整个二进制数减 1 运算 3:将整个二进制数乘 2 运算 4:将整个二进制数整除 2 小Z很想知道运算后的结果,他只好向你求助. (Ps:为了简化问题,数据保证+,-操作不会导致最高位的进位与退位) 输入输出格式 输入格式: 第一行两个正整数 n,m,表示原二进制数的长度以及运算数. 接下来一行 n 个字符,分别为'0'或'1'表示