问题 G: 疯狂的馒头(bzoj2054)
时间限制: 1 Sec 内存限制: 128 MB
提交: 93 解决: 26
[提交][状态]
题目描述

输入
第一行四个正整数N,M,p,q

输出
一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0)。

样例输入
4 3 2 4
样例输出
2
2
3
0
提示

林肯是大头:
http://www.accoders.com/problem.php?cid=1965&pid=6
bzoj
https://www.lydsy.com/JudgeOnline/problem.php?id=2054
思路:并查集!感觉用法很巧妙了吧,,,
首先,颜色的覆盖导致只有该位置馒头最后一次上色才影响结果,所以倒着循环,开个ans数组,每个位置判断为0时涂上染色,之后就不管啦。
接着,并查集部分!把每个馒头连到右边的那个,再通过循环的j=find(j)来向右更新,这样的结果,使下一次直接跳过该区间(直接从左边界到右边界的右边一个),减少时间复杂度。
注意:
1.RE原因:f数组赋初值时要赋到n+1位,否则直接死循环爆栈
2.优化:所有馒头都涂上色后就BREAK就好了

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000000+10;
int n,m,p,q;
int f[maxn];
int ans[maxn];
inline int find(int x)
{if(f[x]==x) return x;else        return f[x]=find(f[x]);
}
int main()
{scanf("%d%d%d%d",&n,&m,&p,&q);for(int i=1;i<=n+1;i++)//最后一个向右到n+1 f[i]=i;int k=0; for(int i=m;i>=1;i--)//从后向前循环:答案只与最后一次染色有关,只存一次 {int l=(i*p+q)%n+1,r=(i*q+p)%n+1;if(l>r) swap(l,r);//有用? for(int j=l;j<=r;j=find(j))//j=find(j)->不断向右扩展 {//  printf("%d %d\n",find(l),find(r));if(!ans[j]) k++,ans[j]=i;f[j]=j+1;}if(k==n) break;//优化:所有馒头已全染色 //printf("i%d\n",i);}for(int i=1;i<=n;i++)printf("%d\n",ans[i]);return 0;
}

疯狂的馒头(bzoj2054)相关推荐

  1. bzoj2054疯狂的馒头(巧用非递归并查集)

    www.cnblogs.com/shaokele/ bzoj2054:疯狂的馒头 Time Limit: 10 Sec Memory Limit: 162 MB Description Input 第 ...

  2. bzoj2054 疯狂的馒头

    bzoj上现在找不到这题,所以目前只是过了样例,没有测 2054: 疯狂的馒头 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 715  Solved ...

  3. BZOJ2054疯狂的馒头

    2054: 疯狂的馒头 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 634 Solved: 250 Description Input 第一行四个正 ...

  4. BZOJ2054 疯狂的馒头 并查集

    2054: 疯狂的馒头 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 974 Solved: 423 [Submit][Status][Discuss ...

  5. 【BZOJ 2054】 疯狂的馒头

    2054: 疯狂的馒头 Time Limit: 10 Sec   Memory Limit: 162 MB Submit: 449   Solved: 175 [ Submit][ Status] D ...

  6. 【BZOJ2054】疯狂的馒头

    Description Input 第一行四个正整数N,M,p,q Output 一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0). Sample Input 4 3 2 4 ...

  7. BZOJ2054: 疯狂的馒头(并查集)

    题意 题目链接 Sol 直接倒着并查集一波就行了 #include<bits/stdc++.h> // #define int long long using namespace std; ...

  8. 【BZOJ2054】疯狂的馒头(并查集)

    /* 经典思路, 倒序并查集处理即可*/#include<cstdio> #include<algorithm> #include<cstring> #includ ...

  9. acwing 3115 bzoj2054 疯狂的馒头

    https://www.acwing.com/problem/content/3118/ 做法:并查集 逆序枚举,因为最后染色的就是最后的颜色. find(f[i])表示为右边第一个没有被染色的点,通 ...

最新文章

  1. 云计算(2)it 是什么
  2. 65. Leetcode 153. 寻找旋转排序数组中的最小值 (二分查找-局部有序)
  3. sqlmap使用_sqlmap于sql labs下使用
  4. nginx 启动命令_Nginx实战001:Window中配置使用Nginx入门
  5. python中怎样使用re模块_python如何导入re模块
  6. NGINX(二)内存池
  7. 拓端tecdat|用SPSS估计HLM多层(层次)线性模型
  8. vue全局引入scss文件(推荐)
  9. BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分 - 点权剖分 - 单点权修改)
  10. TFWmodi-修改tfw文件
  11. java通过itext方法往pdf中插入图片(交互式pdf插入图片无法显示)
  12. 添加https证书信任
  13. git push 遇到 error: cannot update the ref ‘refs/remotes/origin/master‘: Permission denied
  14. JAVA前端与后端交互面试题
  15. 内存优化之一——内存优化工具参数详解
  16. 4A(统一安全管控平台)解析
  17. 自己遇到的Java软件工程师部分面试题(带答案解析)
  18. 区间相关问题的学习: 最多不相交区间问题,区间选点问题与区间覆盖问题
  19. 远程控制软件PcAnyWhere教程图解
  20. Java IDE推荐

热门文章

  1. Nuke和Hiero的使用记录
  2. wps怎么做时间线_ 在家办公总是做不好时间管理怎么办?学会加减乘除轻松搞定...
  3. B站充电|单周充电超500,B站游戏UP主连续5周位居前三
  4. html隐藏form样式,form表单标签
  5. MicroPython实现ESP8266 控制电子墨水屏(SPI)
  6. 在微软的Word中使用输入法打字,发现文字候选框在右上角,这种情况可能需要点击一下键盘上的Insert按键
  7. Red Hat Enterprise Linux 各个版本以及发布日期
  8. 《王者荣耀》新英雄金蝉携86版西游记联动皮肤登场,你期待吗?
  9. lisp捕捉垂足_AutoLISP目标捕捉函数osnap
  10. Mysql 命令大全