Wannafly模拟赛3-F 监视任务(贪心+线段树区间更新)
来源:互联网 发布:软件详细设计模板 java 编辑:程序博客网 时间:2024/06/08 11:10
题目链接:https://www.nowcoder.com/acm/contest/13/F
题解:把所有约束按照右端点排序。
这样每一个前面的约束区间[l1,r1],与后面的一个约束区 间[l2,r2]的交,一定为[max(l1,l2),r1]。
对于排序后的区间依次满足约束,假设当前枚举到的约束现在没有满足,
就不断把对应区间中最右端的0改为1。 这些过程可以用线段树维护来完成。
#include<set> #include<map> #include<stack> #include<queue> #include<vector> #include<string> #include<time.h> #include<math.h> #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<algorithm> #include<functional> using namespace std; #define ll long long #define inf 1000000000 #define mod 1000000007 #define maxn 500005 #define lowbit(x) (x&-x) #define eps 1e-9 struct node{int l,r,k;}a[maxn*2];int n,m,sum[maxn*5],lazy[maxn*5];bool comp(node a,node b){return a.r<b.r;}void pushdown(int l,int r,int id){if(lazy[id]){int mid=(l+r)/2;lazy[id*2]=1;sum[id*2]=mid-l+1;lazy[id*2+1]=1;sum[id*2+1]=r-mid;lazy[id]=0;}}int update(int id,int L,int R,int l,int r,int val){if(val<=0)return 0;if(L>=l && R<=r){if(R-L+1-sum[id]<=val){val-=R-L+1-sum[id];lazy[id]=1;sum[id]=R-L+1;return val;}}pushdown(L,R,id);int mid=(L+R)/2;if(r>mid)val=update(id*2+1,mid+1,R,l,r,val);if(l<=mid)val=update(id*2,L,mid,l,r,val);sum[id]=sum[id*2]+sum[id*2+1];return val;}int query(int id,int L,int R,int l,int r){if(L>=l && R<=r)return sum[id];pushdown(L,R,id);int mid=(L+R)/2,res=0;if(l<=mid)res+=query(id*2,L,mid,l,r);if(r>mid)res+=query(id*2+1,mid+1,R,l,r);return res;}int main(void){int i;scanf("%d%d",&n,&m);for(i=1;i<=m;i++)scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].k);sort(a+1,a+m+1,comp);for(i=1;i<=m;i++)update(1,1,n,a[i].l,a[i].r,a[i].k-query(1,1,n,a[i].l,a[i].r));printf("%d\n",query(1,1,n,1,n));return 0;}
阅读全文
0 0
- Wannafly模拟赛3-F 监视任务(贪心+线段树区间更新)
- Wannafly模拟赛3 监视任务(贪心+线段树)
- 牛客练习赛3 F 监视任务 每个区间K个 树状数组+贪心
- Wannafly模拟赛4 CSum(线段树)
- Wannafly模拟赛5 F Course
- Wannafly模拟赛3
- Wannafly模拟赛5 A Split 【贪心】
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
- Wannafly模拟赛 树(dp)
- Wannafly模拟赛5 待更新 题解
- FZU 1608 Huge Mission (线段树区间更新 + 贪心)
- 线段树(单点更新+区间更新)
- Wannafly模拟赛3 题解
- Wannafly模拟赛3 题解
- 线段树区间更新
- 线段树区间更新
- 线段树 区间更新
- 线段树区间更新
- Django中生成二维码
- 编写自己的一个ajax库。
- tensorflow学习(一):Reduction以及tesorflow数学操作函数查找地址
- GNSS接收机通道数
- C++下载指定Url网络地址上的文件-Windows Api
- Wannafly模拟赛3-F 监视任务(贪心+线段树区间更新)
- Python快速笔记
- FCM聚类算法
- [Spring Cloud] Eureka 的自我保护模式及相关问题
- js 递归调用无返回值的问题
- 修改tomcat默认的编码方式
- Kth Largest Element in an Array解题心得
- 第一次作业
- bfs和dfs