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

Joy of Handcraft Gym - 102822J

题意:

每个灯有亮的周期和亮度,问1~m这段时间灯光最亮是多少

题解:

线段树维护区间最大值
根据灯的周期向这段区间加亮度k,然后利用线段树维护区间最大值
但是这样会超时,加个小优化就ac了(670ms)
我们考虑,因为题目只要求最亮的一段,而且所有灯亮的时间起点是一样的,也就是如果两个灯周期一样,只有亮度高的才会有用,所有我们将所有灯按照亮度排序,每加完一组灯,记录该周期,后面再出现该周期的就不用加了。因此所有的区间数量为Σi->n(m/ti)= mlogn

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e5+9;
struct node{int time,light;
}a[maxn];
struct tree{int l,r;int lazy;int sum;
}tr[maxn<<2];
bool cmp(node a,node b){return a.light>b.light;
}
void solve(int rt,int val){tr[rt].sum=max(tr[rt].sum,val);tr[rt].lazy=max(tr[rt].lazy,val);
} 
void pushdown(int rt){solve(rt<<1,tr[rt].lazy);solve(rt<<1|1,tr[rt].lazy);tr[rt].lazy=0;
}
void pushup(int rt){tr[rt].sum=max(tr[rt<<1].sum,tr[rt<<1|1].sum);
}
void build(int rt,int l,int r){tr[rt].l=l;tr[rt].r=r;if(l==r){tr[rt].lazy=0;tr[rt].sum=0;return ;}int mid=l+r>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);pushup(rt);
}
void update(int rt,int l,int r,int k){if(tr[rt].l>r||tr[rt].r<l)return ;if(tr[rt].l>=l&&tr[rt].r<=r){solve(rt,k);return ;}if(tr[rt].lazy)pushdown(rt);update(rt<<1,l,r,k);update(rt<<1|1,l,r,k);pushup(rt);
}
int query(int rt,int l,int r){if(tr[rt].l>r||tr[rt].r<l)return 0;if(tr[rt].l>=l&&tr[rt].r<=r){return tr[rt].sum;}pushdown(rt);return max(query(rt<<1,l,r),query(rt<<1|1,l,r));
}
int vis[maxn];
int main()
{int t;cin>>t;int cas=0;while(t--){int n,m;cin>>n>>m;memset(tr,0,sizeof(tr));memset(vis,0,sizeof(vis));build(1,1,m);for(int i=1;i<=n;i++){scanf("%d%d",&a[i].time,&a[i].light);}sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){if(vis[a[i].time])continue;vis[a[i].time]=1;for(int j=0;j!=-1;j++){int l=2*j*a[i].time+1,r=2*j*a[i].time+a[i].time;//	printf("l=%d r=%d\n",l,r);if(l>m)break;if(r>m)update(1,l,m,a[i].light);else update(1,l,r,a[i].light);}}printf("Case #%d:",++cas);for(int i=1;i<=m;i++){printf(" %d",query(1,i,i));}printf("\n");}return 0;
}

方法二 差分

整体思路,我们对所有灯按照灯光从小到达排序,然后利用差分思想来存灯光,add来存这个灯光的开始时刻,del来存结束时刻
如图,红色表示开始时刻,蓝色为删除,红色到蓝色(不含蓝色)这一段均为该灯亮的时刻,从蓝色开始熄灭
在这里插入图片描述
这样存得到add和del,再查询答案时,对于每一时刻,加入当前的灯光开始时刻的灯光亮度,然后删除此刻del中记录的灯光,利用差分来维护
复杂度是(Ologlogm)
时间:904ms
(注意我们对灯光是排过序的,所以输出是ans的尾)

差分代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>using namespace std;const int MAXN = 4e5+5;struct bub {int t, x;
}b[MAXN];bool cmp(bub a, bub b) {return a.x>b.x;
}bool vis[MAXN];
vector<int> add[MAXN], del[MAXN];
multiset<int> ans;void init(int n) {for(int i=0;i<=n;++i) {	add[i].clear();del[i].clear();}memset(vis, 0, sizeof(vis));ans.clear();
}int main() {int T; scanf("%d", &T);for(int kase =1;kase<=T;++kase) {int n, m; scanf("%d%d", &n, &m);init(m);for(int i=0;i<n;++i) {	scanf("%d%d", &b[i].t, &b[i].x);}sort(b, b+n, cmp);for(int i=0;i<n;++i) {if(vis[b[i].t]) continue;vis[b[i].t]=true;for(int j=0;j<=m/b[i].t+1;j+=2) {add[j*b[i].t+1].push_back(b[i].x);del[(j+1)*b[i].t+1].push_back(b[i].x);}}printf("Case #%d:", kase);for(int i=1;i<=m;++i) {for(const auto &x: add[i]) {ans.insert(x);}for(const auto &y: del[i]) {//ans.erase(y)是删去集合内所有的元素yans.erase(ans.find(y));}if(!ans.empty()) printf(" %d", *ans.rbegin());else printf(" 0");}	printf("\n");		}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 使用 HttpClient SSL 请求出错的解决办法

问题使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常&#xff0c;并且证书已经传入。下面就是问题代码&#xff1a;public class Program{public static void Main(string[] args){var url &quo…

CF1580C Train Maintenance(分块)

CF1580C Train Maintenancedescriptionsolutioncodedescription 题目链接 solution 这是一种利用根号平衡时间复杂度的套路 分α\alphaα【操作参数】与n\sqrt{n}n​的关系&#xff0c;一半采取暴力&#xff0c;一半利用工具特殊处理 对于本题&#xff0c;假设第iii辆车的加…

P3746 [六省联考 2017] 组合数问题(倍增、dp)

解析 再次被“组合数问题”吊打qwq 和上一次不一样的是&#xff0c;这次更加被恶心到了。 一方面受上一个组合数问题影响&#xff0c;另外出题人也十分阴间&#xff0c;一开始还给了个组合数的公式&#xff0c;更加使我坚定的认为这是一道数学推柿子题。 然后就开始各种打表玩…

CF1473E Minimum Path(拆点+最短路)

CF1473E Minimum Pathdescriptionsolutioncodedescription 题目链接 solution 看到 ∑i1kwei\sum_{i1}^kw_{e_i}∑i1k​wei​​ 的式子&#xff0c;就应该联想到最短路 先考虑题目的弱化版&#xff0c;去掉 max,min\text{max},\text{min}max,min 的限制&#xff0c;变成一条…

2020CCPC绵阳

2020CCPC绵阳 题号题目名难度知识点AA Colorful GridBBuilding BlocksCCode a TrieDDefuse the Bombs签到二分EEscape from the IslandFFracture RayGGame of Cards银牌博弈论&#xff0c;SG函数HHide and SeekIInvaluable AssetsJJoy of Handcraft快铜线段树KKnowledge is Po…

P3747 [六省联考 2017] 相逢是问候(欧拉定理、线段树、光速幂)

解析 洛谷你恶事做尽&#xff01; 第三个tag在LOJ、bzoj等都是不需要的… 但在洛谷三只log根本过不去… 我谔谔。 如果做过 上帝与集合的正确用法 &#xff0c;那么本题就并不难了。 打个表就可以发现&#xff0c;不断取欧拉函数的上限只有log级别&#xff0c;这使得我们暴力…

Lottery Gym - 102822L

Lottery Gym - 102822L 题意&#xff1a; 有n个盒子&#xff0c;每个盒子有x个球&#xff0c;每个球的数值为2a,问最多能组成多少数&#xff1f;答案mod 1e97 题解&#xff1a; 二进制思维题&#xff0c;浓浓的cf风格 参考题解 我们将数按照幂次进行排序&#xff08;从小到…

[CCO 2019] Sirtet(差分约束+最短路)

[CCO 2019] Sirtetdescriptionsolutioncodedescription 题目链接 solution 很巧妙地将差分约束隐藏起来 问题的关键在于求出每一个sand停止运动的时间&#xff0c;这样很容易填涂出最后的答案&#xff08;向下平移即可&#xff09; 不妨设 ti,jt_{i,j}ti,j​ 表示 (i,j)(i…

P3748 [六省联考 2017] 摧毁“树状图”(树形dp)

Foreword\text{Foreword}Foreword 《小清新》树形 dp。 其实本题没有那么&#xff08;重读&#xff09;恶心&#xff0c;但我一开始写完 x0x0x0 后眼瞎没有看到 x1,2x1,2x1,2 时也必然是最优方案&#xff08;这种东西不黑体吗…&#xff09;可以直接无视&#xff0c;还在苦苦的…

微软4年后重登市值第一,纳德拉如何做到的?

他用4年多时间将微软的市值提高了5000亿美元&#xff0c;超越苹果再次成为全球市值最高的上市公司。译 | 达达萨提亚纳德拉&#xff08;Satya Nadella&#xff09;2014年刚刚执掌微软时&#xff0c;微软当时是一个日渐没落的帝国。但在他领导的4年多时间里&#xff0c;微软百花…

[AtCoder Regular Contest 124E] Pass to Next(dp+数学)

ARC 124 E Pass to Nextproblemsolutioncodeproblem 题目链接 solution 令 ci:c_i:ci​: 第 iii 个人传给下一个人球的个数 当 min⁡{ci}≠0\min\{c_i\}\neq 0min{ci​}​0 时&#xff0c;将每一个 cic_ici​ 都减小 111&#xff0c;显然答案序列并不会改变 所以&#x…

P2015 二叉苹果树

P2015 二叉苹果树 题意&#xff1a; 一个完全二叉树&#xff0c;n个点&#xff0c;n-1个边&#xff0c;每个边都有边权&#xff0c;问保留q个边&#xff0c;所能保留的最大边权是多少 题解&#xff1a; 树形dp dp[u][i]表示u的子树上保留i条边&#xff0c;至多保留的苹果数…

P4384 [八省联考 2018] 制胡窜(SAM)

Foreword\text{Foreword}Foreword 人都道正难则反&#xff0c;我偏说正也不难。 这里介绍一种正面直接统计的做法。 和补集做法相比&#xff0c;没有那么多的分类讨论&#xff0c;更多的是对问题的正向分析和逐层化简、转化&#xff0c;也并不麻烦。 由于需要写很多线段树的操作…

【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

首先说声抱歉&#xff0c;可能是因为假期综合症&#xff08;其实就是因为懒哈&#xff09;的原因&#xff0c;已经很长时间没更新博客了&#xff0c;现在也调整的差不多了&#xff0c;准备还是以每周1-2篇的进度来更新博客&#xff0c;并完成本项目所有功能。言归正传&#xff…

树上子链(树形dp求树的直径)

树上子链 题意&#xff1a; 给定一棵树 T &#xff0c;树 T 上每个点都有一个权值。 定义一颗树的子链的大小为&#xff1a;这个子链上所有结点的权值和 。 请在树 T 中找出一条最大的子链并输出。 题解&#xff1a; 求树的直径&#xff0c;题目中存在负权值&#xff0c;树…

【无码专区1】简单路径的第二大边权(启发式合并+最小生成树)

只有std&#xff0c;没有自我实现&#xff0c;所以叫做无码专区 description 给一张无向图&#xff0c;多次询问&#xff0c;每次询问两个点之间所有简单路径&#xff08;不重复经过点&#xff09;中边权第二大&#xff08;不是严格第二大&#xff09;的权值的最小值。 数据…

# CF1572B Xor of 3(构造)

解析 你CF还是你CF 省选刷到2017再往前不是很想做了&#xff0c;就来CF玩一玩。 再次感受到被CF浅颜色构造虐的快感。 本题靠着各种乱搞特判在WA了无数次之后艹过去了。 根本没有什么正确性的玄学做法&#xff0c;但是看CF数据似乎把 nnn 较小的所有情况全都pia到数据里了&…

NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会...

前言日志&#xff0c;一直以来都是开发人员和运维人员最关心的问题。开发人员可通过日志记录来协助问题定位&#xff0c;运维人员可通过日志发现系统隐患&#xff0c;故障等定位问题。如果你的系统中没有日志&#xff0c;就像一个断了线的风筝&#xff0c;你永远不知道它会的落…

【无码专区2】序列划分(数学)

有std&#xff0c;但是没有自我实现&#xff0c;所以是无码专区 description 完全由数字组成的字符串 sss&#xff0c;划分成若干段&#xff0c;每一段看成一个十进制的数&#xff08;允许前导零&#xff09;求有多少种划分方法使得相邻两个数至少一个是 DDD 的倍数。对 1097…

Rinne Loves Edges

Rinne Loves Edges 题意&#xff1a; 有n给点&#xff0c;m个边&#xff0c;每个边有边权&#xff0c;给你一个点S&#xff0c;问最少花多少代价&#xff0c;可以让叶子节点无法与S点连通 题解&#xff1a; dp[u]:表示u到叶子节点的最短费用的和 dp[u]min(dp[v],w); 代码&…