2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树)

之前一直对线段树有种恐惧感,感觉十分晦涩难懂,但是我还是得迎男而上!这题必须补!我说的!耶稣都留不住!

题目

https://pintia.cn/problem-sets/1322796904464203776/problems/1322798545527595017

题意

有n个灯泡,每个灯泡有两种属性分别为t,x。
t表示的是开关周期,一个灯泡打开的时间为 (2kt+1)- (2kt+t​​),关闭时间为(2kt+t+1)- (2kt+2t+t)[其中k=0,1,2,…] 。意思就是如果t=1,那么灯会在1,3,5,7…的时间亮起,其他时间关闭。
x表示的是该灯泡的亮度 现在问你从1到m的时间,每单位时间的最大亮度为多少。
n,m (1≤n,m≤10​5)

题解

线段树的想法就是,把每个灯泡能开的时间段都塞到线段树里。然后求答案的时候在取每一个点的最大值。

接下来就考虑一下时间复杂度,假设在长度为m的时间里,1~m的时间都有不同灯泡亮着,那这样我们需要插入的次数就为:
m1+m2+......+mm=m∗ln(m+1)+r\frac{m}{1}+\frac{m}{2}+......+\frac{m}{m}=m* ln(m+1) + r1m​+2m​+......+mm​=m∗ln(m+1)+r其中r为欧拉常数,这是个调和级数。复杂度可以近似为m∗logmm*logmm∗logm

加上线段树插入的复杂度logmlogmlogm,总的时间复杂度为m∗2logmm*2logmm∗2logm,我们可以近似认为这个算法时间复杂度为O(m∗logm)O(m*logm)O(m∗logm)。(四舍五入好多常数都被忽略了,xixi~)

然后我们就能写了。
代码中稍微优化了一下,加了个去重,把相同时间,亮度小的灯泡直接忽略了。
具体是参考的这篇博客

为什么不用树状数组要使用线段树?
emmmmmmmm,这里插入数据是区间插入,我好像听说树状数组可以区间插入,但是网上没看到有人这么写,而且线段树有lazy标记,区间插入也是比较简单的,只是多了pushdown()和pushup()的操作而已。

AC代码

#include <bits/stdc++.h>
//线段树的正解做法
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 7;
int n,m;
struct node
{int t,x;
} b[MAXN],a[MAXN];
struct Tree {int l,r;int mx,lazy;
}t[MAXN << 2];
bool cmp(node a,node b)
{if(a.t == b.t) return a.x > b.x;//相同时间区间内找出亮度最大的即可else return a.t < b.t;
}
int tree[MAXN<<2],lazy[MAXN<<2];
void pushup(int i)
{t[i].mx = max(t[i * 2].mx,t[i * 2 + 1].mx);
}
void pushdown(int i)
{if(t[i].lazy){t[i * 2].lazy = max(t[i].lazy,t[i * 2].lazy);t[i * 2 + 1].lazy = max(t[i].lazy,t[i * 2 + 1].lazy);t[i * 2].mx = max(t[i].lazy,t[i * 2].mx);t[i * 2 + 1].mx = max(t[i].lazy,t[i * 2 + 1].mx);t[i].lazy = 0;}
}
void build(int i, int L, int R)
{t[i].l = L;t[i].r = R;t[i].mx = t[i].lazy = 0;if(L == R){return;}int mid = (L + R) >> 1;build(i * 2,L,mid);build(i * 2 + 1,mid + 1,R);pushup(i);
}
void update(int i,int x,int y,int v)
{if(x <= t[i].l && t[i].r <= y){t[i].lazy = max(t[i].lazy,v);t[i].mx = max(t[i].mx,v);return;}pushdown(i);int m = (t[i].l + t[i].r) >> 1;if(x <= m) update(i * 2,x,y,v);if(y > m) update(i * 2 + 1,x,y,v);pushup(i);
}
int query(int i,int x)
{if(t[i].l == t[i].r){return t[i].mx;}pushdown(i);int m = (t[i].l + t[i].r) >> 1;if(x <= m) return query(i * 2,x);if(x > m) return query(i * 2 + 1,x);return -1;
}int main()
{int T,cas = 0;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i = 1; i <= n; i ++){scanf("%d%d",&b[i].t,&b[i].x);}sort(b+1,b+1+n,cmp);int cnt = 1;a[1] = b[1];for(int i = 2; i <= n; i ++) //按照时间去一下重{if(b[i].t != a[cnt].t)a[++cnt] = b[i];}build(1,1,m);for(int i = 1; i <= cnt; i ++){for(int k = 0;; k ++){//2kt+1 ~ (2k+1)t+1int l = k*2*a[i].t + 1,r = (k*2+1)*a[i].t;r = min(r,m);//有些区间的长度可能右端点超过m 取个minif(l <= m && r <= m) update(1,l,r,a[i].x);if(l >= m || r == m) break;}}printf("Case #%d:",++cas);for(int i = 1; i <= m; i ++){printf(" %d",query(1,i));}printf("\n");}return 0;
}

2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树)相关推荐

  1. 2020CCPC-绵阳站-Joy of Handcraft (线段树因子拆分)

    Little Horse always does some handcrafts, which is full of joy. This time, he builds a circuit that ...

  2. 石油大--2020年秋季组队训练赛第十二场----J、Greedy Termite(线段树)

    题面: 题意: 给定正整数 nnn 和起始位置 sss. nnn 表示有 nnn 个杆子,每个杆子由属性 (xi,hi)(x_i,h_i)(xi​,hi​) 构成,表示在 xix_ixi​ 处有一根高 ...

  3. 【upc】2020年秋季组队训练赛第十二场J Greedy Termite | 删点线段树

    状态 题目描述 There are n wooden rods vertically placed over a horizontal line. The rods are numbered 1 th ...

  4. 线段树 ---- 2021牛客多校第一场 J Journey among Railway Stations [线段树维护区间可行性判断]

    题目链接 题目大意: 一段路上有 NNN 个点,每个点有一个合法时间段[ui,vi][u_i,v_i][ui​,vi​],相邻两个点有一个长度wiw_iwi​.有qqq次询问,每次询问,在 [ui,v ...

  5. 计蒜客 2020 蓝桥杯省赛 B 组模拟赛(五)E区间dp H 裴蜀 J dp A-J 权值线段树

    题目链接 因为要去笔试.所以只打了两个小时,有点求快,很多细节没写好就匆匆交,而且没有检查,打的有点菜 C-煎牛排 做法: 所有的面的个数sum=2*n   然后sum/(2*k)即可. ans=ma ...

  6. Joy of Handcraft Gym - 102822J(线段树或差分)

    Joy of Handcraft Gym - 102822J 题意: 每个灯有亮的周期和亮度,问1~m这段时间灯光最亮是多少 题解: 线段树维护区间最大值 根据灯的周期向这段区间加亮度k,然后利用线段 ...

  7. 【2022 CCPC 桂林站 日志】部分题解

    [2022 CCPC 桂林站] 蒟蒻侥幸铜(打铁原地退役算了 赛前看着参赛队伍大名单就感觉够呛,不少985/211等强校一队,rank+=n.实际战况确实如此,一边开题一边感慨这么多细节怎么这么多队直 ...

  8. 2020 ccpc 吉林省赛 H

    2020 ccpc 吉林省赛 H 题意: 给一组数 a i a_i ai​,求 ∑ i = 1 n ∑ j = 1 n [ g c d ( a i , a j ) = d ] \sum\limits_ ...

  9. CCPC 桂林站总结

    2018 CCPC 桂林站 总结 这次到了桂林,又是打铁,差点出了H就能铜了,比去年杭州不丢人一点,但是我的心比去年还痛. 赛前 坐火车20小时左右才到的桂林,舟车劳顿,到桂林前一晚中途醒来好几次(特 ...

最新文章

  1. app获取个人信息是否合法_APP隐私合规介绍和实施方案
  2. Timers cannot be stopped from another thread
  3. C语言 | 基于STM32的MPU6050模块程序(主程序)
  4. 关于一些对location认识的误区(转)
  5. 安装部署Exchange Server 2010 CAS NLB MailBox DAG
  6. win10录屏工具_win10怎么录屏?这才是最长情陪伴你的录屏工具
  7. MySQL 索引底层数据结构实现
  8. 小米 android 7.0下载地址,小米5安卓7.0公测版固件下载地址 仅限开发版
  9. 大数据开发基础入门与项目实战(三)Hadoop核心及生态圈技术栈之1.Hadoop简介及Apache Hadoop完全分布式集群搭建
  10. java程序 扑克牌概率_java扑克牌洗牌程序,求抽可以抽出特定牌的次数
  11. 263企业邮箱imap服务器,263企业邮箱支持IMAP邮箱搬家功能
  12. 麻雀虽小五脏俱全----blender介绍
  13. Halcon学习笔记:3D_coordinates(3D标定)
  14. android延迟时间设置,控制Android上的延迟
  15. 电脑配置单4(自用勿删)
  16. apache dubbo 源码分析系列汇总
  17. 倾情分享:Android 开发者们不要错过的网站宝藏~
  18. Linux网络配置完全正确却ping不通易忽略的地方
  19. Java多线程创建方式初探
  20. 渗透修改服务器权限,利用CMS漏洞渗透并获取某服务器权限

热门文章

  1. 一文搞懂最强裂变团队的黑科技
  2. 正方教务隐藏入口_正方教务处抓包分析
  3. Github每日精选(第66期):擦图老照片修复神器--Lama Cleaner
  4. 669. 修剪二叉搜索树
  5. 土壤C、N动态对大气臭氧污染的生态学响应
  6. tushare股票数据分析中遇到的问题
  7. 【Week8作业 C】班长竞选【SCC缩点】
  8. 如何用多因子模型预测资险
  9. ROSTEA软件下载及情感分析详细操作教程(附网盘链接)
  10. nginx匹配问号的问题