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;}

Joy of Handcraft Gym - 102822J(线段树或差分)相关推荐

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

    2020 CCPC 绵阳站 J-Joy of Handcraft (调和级数 线段树) 之前一直对线段树有种恐惧感,感觉十分晦涩难懂,但是我还是得迎男而上!这题必须补!我说的!耶稣都留不住! 题目 h ...

  2. CodeForces - 731D 80-th Level Archeology(线段树+暴力/差分)

    题目链接:点击查看 题目大意:给出 n 个数列,再给出一个模数 mod,每次操作可以将所有的数字进行:x = x %mod + 1 操作,问至少进行多少次操作,才能使得 n 个数列按照字典序非降序排列 ...

  3. [线段树][树上差分] Jzoj P3397 雨天的尾巴

    Description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...

  4. [BZOJ]4491: 我也不知道题目名字是什么 线段树(差分)

    Description 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 这道题目有两个思路:1.对原序列差分,转化为经典问题.2.线段树维护6个东西, ...

  5. 【BZOJ-4422】Cow Confinement 线段树 + 扫描线 + 差分 (优化DP)

    4422: [Cerc2015]Cow Confinement Time Limit: 50 Sec  Memory Limit: 512 MB Submit: 61  Solved: 26 [Sub ...

  6. HDU-1556-Color the ball (线段树和差分数组两种解法)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...

  7. HDU - 3333 Turing Tree(线段树+离线处理)

    题目链接:点击查看 题目大意:给定一个长度为n的数列,依次求m个区间中不相同数字之和 题目分析:n给的是3e4,看到区间问题先要想到线段树或差分区间或动态规划,暴力是肯定不行滴,那么这个题已经知道是需 ...

  8. luogu T96516 [DBOI2019]持盾 可持久化线段树+查分

    因为题中的操作是区间加法,所以满足前缀相减性. 而每一次查询的时候还是单点查询,所以直接用可持久化线段树维护差分数组,然后查一个前缀和就行了. code: #include <bits/stdc ...

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

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

最新文章

  1. 上课点名app_【APP种草】网瘾少年的自我救赎之最强锁机软件
  2. 春节档总票房突破50亿元 《流浪地球》独占16亿!
  3. java 视频 缩略图_java获取视频缩略图
  4. go语言暂停命令_go test命令(Go语言测试命令)完全攻略
  5. python机器学习库sklearn——决策树
  6. Focal loss原理解析
  7. Multisim基础 桥式整流二极管电路
  8. java实现两个实体类共有字段合二为一
  9. 天池比赛首次参加记录
  10. C# web references 调用出错 The underlying connection was closed: An unexpected error occurred on a send.
  11. 网易跨域实现笔记以及顺便发现的XSS
  12. hive之反斜杠导致Unicode编码字段里的中文无法正常显示
  13. 救赎自己——追风筝的人
  14. PHP_CodeSniffer 的代码静态分析
  15. 1993年入市一老股民愤然离场 今年已亏55万
  16. Three.js中的3D文字效果
  17. Soul App聚焦Z世代社交需求 凭借2021亮眼表现荣获多个奖项
  18. direct wifi 投屏_direct wifi 投屏_告别Wifi直接投AOC无线投屏显示器轻松用
  19. idea企业开发之插件推荐
  20. MAPInfo Professional v10.0026 Final Release下载+破解+汉化

热门文章

  1. 你绝对干过的15件傻事儿
  2. 揭秘神仙高校的课堂!网友跪了:这就是差距啊!
  3. 相亲有风险,且行且珍惜!| 今日最佳
  4. 那些把天聊死的神操作。。| 今日最佳
  5. 魔性十足的数学动态图,这种东西都拿出来分享?
  6. 数据挖掘算法之-关联规则挖掘(Association Rule)(购物篮分析)
  7. python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...
  8. gif分解工具_Python之GIF图倒放,沙雕快乐源泉
  9. 树莓派安装python3.5_梦见树_周公解梦梦到树是什么意思_做梦梦见树好不好_周公解梦官网...
  10. 服务器磁盘系统,服务器磁盘阵列与操作系统