链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054

线段树写法:

点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前被染过了,就不用再染了,对区间染色我们可以暴力在线段树上进行更新,并用线段树维护下那些区间已经被染色了,被染色的区间更新的时候直接跳过,这样可以节省很多时间。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
const int M = 1e6 + 10;
int sum[M<<2];void pushup(int rt){sum[rt] = sum[rt<<1]&&sum[rt<<1|1];
}void update(int L,int R,int c,int l,int r,int rt){if(sum[rt]) return ;if(l == r){sum[rt] = c;return ;}mid;if(L <= m) update(L,R,c,lson);if(R > m) update(L,R,c,rson);pushup(rt);
}void ct(int l,int r,int rt){if(l == r){printf("%d\n",sum[rt]);return ;}mid;ct(lson); ct(rson);
}int main()
{int n,m,p,q;scanf("%d%d%d%d",&n,&m,&p,&q);for(int i = m;i >= 1;i --){int x = ((i*p+q)%n)+1;int y = ((i*q+p)%n)+1;if(x > y) swap(x,y);update(x,y,i,1,n,1);}ct(1,n,1);
}

并查集写法:

和线段树的思路一样,我们需要快速跳过已染色区间,这里用并查集维护已染色的区间,区间更新时可以利用并查集快跳过被染色的区间。

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int M = 1e6+10;
int ans[M],f[M];
int Find(int x){if(x == f[x]) return x;return f[x] = Find(f[x]);
}int main()
{int n,m,p,q;scanf("%d%d%d%d",&n,&m,&p,&q);for(int i = 0;i <= n+1;i ++) f[i] = i;for(int i = m;i >= 1;i --){int x = ((i*p+q)%n)+1,y = ((i*q+p)%n)+1;if(x > y) swap(x,y);for(int j = Find(x);j <= y;j = Find(j+1)){f[j] = Find(j+1); ans[j] = i;}}for(int i = 1;i <= n;i ++)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/kls123/p/10580554.html

bzoj 2054: 疯狂的馒头(线段树||并查集)相关推荐

  1. [BZOJ 2054]疯狂的馒头

    这题一看是区间染色,直接上线段树.数据范围N<= 106,M <= 107,如果跑线段树复杂度为O(MlogN),但是时间限制10s,所以复杂度能过. 具体操作就是倒着算区间,因为每个馒头 ...

  2. P3273-[SCOI2011]棘手的操作【线段树,并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/P3273 题目大意 nnn个点有权值,要求支持操作 连接两个点 单点加权 联通块加权 全图加权 单点询问 联通块询问 ...

  3. 【Codeforces811E】Vladik and Entertaining Flags [线段树][并查集]

    Vladik and Entertaining Flags Time Limit: 20 Sec  Memory Limit: 512 MB Description n * m的矩形,每个格子上有一个 ...

  4. UVA 1455 Kingdom 线段树+并查集

    并查集维护:y的最大最小值.城市数量 线段树维护:城市数量,洲数量 合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树. //#pragma comment(li ...

  5. 【BZOJ5005】乒乓游戏 [线段树][并查集]

    乒乓游戏 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 5 1 1 5 1 5 11 2 ...

  6. [BZOJ 2054]疯狂的馒头(并查集)

    Description CQF十分喜欢吃馒头.兴奋之下他一下子买了N 个馒头请所有认识他的人吃. 但是CQF不喜欢白色,喜欢红色.黄色.绿色等鲜艳的颜色.于是他把所有白色的馒头排成一列.然后进行M 次 ...

  7. Bzoj 2054: 疯狂的馒头

    题目 我们先想一想暴力模拟,算出l,r,染色,最后输出,很明显会超时.想一下每个点的最终颜色仅与它最后一次被染色的情况决定,这就是NOIP2011D1T1铺地毯复杂版. 我们可以用倒序将并查集将从左向 ...

  8. [BZOJ] 2054 疯狂的馒头

    只有最后一次染色有效,时光倒流,用并查集保证每个点只被染一次,染够n次及时退出,复杂度O(n) #include<iostream> #include<cstdio>using ...

  9. BZOJ 2054 疯狂的馒头

    [Description] n个点,m次操作,每次把(i*p+q)%n+1与(i*q+p)%n+1之间的点染上颜色i,被染过色的会被新颜色覆盖,求最后每个点的颜色. [题解] 因为被染过的颜色会被新的 ...

最新文章

  1. Selenium3自动化测试——16. 处理HTML5视频播放
  2. r语言electricity数据集_R语言学习10-查看数据
  3. not accessible due to restriction on required library
  4. iOS开发-Runtime详解(简书)
  5. PKI/CA (4)根CA信任模型“证书构建”
  6. IOS中通知中心(NSNotificationCenter)的使用总结
  7. 我的世界修改服务器头像,我的世界单机模式更换头像的方法 各种怪物的头等来换...
  8. clone git 修改保存路径_用git管理版本,你必须知道的事情
  9. idea 调试java技巧_Intellij IDEA Debug 调试技巧
  10. 使用词和图嵌入来衡量统一医学语言系统概念之间的语义相关性
  11. JavaScript---文件下载处理文件下载失败兼容IE11文件下载
  12. 参考文献中英文人名_参考文献英文名字应该怎么写?
  13. ransomware(假的勒索病毒)逆向分析
  14. opencv之fitline直线拟合
  15. 学学Gnuplot(常用命令及参数)
  16. 牛客练习赛37 C 筱玛的迷阵探险(Trie+折半)
  17. 概率公理化定义的理解
  18. 没有模拟器是JavaScript做不到的~
  19. gprs模块与服务器通信协议,什么是DTU模块和GPRS模块?它们有什么关系?
  20. 高精度AOA定位技术原理及市场需求-新导智能

热门文章

  1. 【Byrd-SAGA】Federated Variance-Reduced Stochastic Gradient Descent with Robustness
  2. 前端工程师怎么写后端?试试 koa.js + Apache APISIX 吧~
  3. 【内容替换】shell脚本批量替换文件内容(替换ip及其他配置文件)
  4. 一个有关未来十年的预言
  5. 2008年06月06日
  6. GCN的邻接矩阵归一化为什么能解决梯度消失和梯度爆炸
  7. 《乔布斯传》经典摘录(五)
  8. 辐射76 服务器位置,辐射76掠夺者动力装甲在哪 辐射76掠夺者动力装甲位置一览-游侠网...
  9. mysql describe什么意思_mysql DESCRIBE语法概述
  10. 口袋超萌服务器维护中,口袋超萌训练师如何升级