监视任务

来源:牛客网

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

𝑅𝑒𝑘𝑖在课余会接受一些民间的鹰眼类委托,即远距离的狙击监视防卫。
𝑅𝑒𝑘𝑖一共接到了𝑚份委托,这些委托与𝑛个直线排布的监视点相关。 第𝑖份委托的内容为:对于区间[𝑙𝑖,
𝑟𝑖]中的监视点,至少要防卫其中的𝑘𝑖个。 𝑅𝑒𝑘𝑖必须完成全部委托,并且希望选取尽量少的监视点来防卫。

输入描述:
第一行,两个正整数𝑛,𝑚。
接下来𝑚行,每行三个整数𝑙𝑖,𝑟𝑖,𝑘𝑖。
输出描述:
一行,一个整数,即所需防卫的最少监视点数量。
示例1
输入
复制

11 5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1

输出
复制

6

备注:

对于10%的数据,𝑛 ≤ 10。
对于20%的数据,𝑛 ≤ 20。
对于30%的数据,𝑛,𝑚 ≤ 30。
对于60%的数据,𝑛,𝑚 ≤ 1000。
对于100%的数据,𝑛 ≤ 500000,𝑚 ≤ 1000000,𝑙𝑖 ≤ 𝑟𝑖,𝑘𝑖 ≤ 𝑟𝑖−𝑙𝑖+1

题解:

贪心+线段树
我们先将给的m个区间进行排序,按照右端点值从小到大排
然后对每个区间值查询监视点的数量,如果不满足要求就填充,记得要尽可能的给区间的右侧填充,因为这样更有利于后面的区间能用上
比如[1,3]和[3,6],两个区间各需要一个监视点,我们我们给[1,3]按上一个,尽可能在右侧安装,也就是点3,这样查询[3,6]时我们发现已经有了,就不用给[3,6]再安装了
区间修改操作涉及到了线段树
那在线段树区间修改的时候,怎么能先优先更新右侧?
很简单,我们在更新是优先更新右节点

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

代码中是先更新id*2+1即右节点,这样就会优先在右侧填充,如果两个语句反过来,就是优先填充左侧
有两种写法(一种用到pushdown的区间修改,另一种单纯只用到单点修改)对了,每个坐标点只能放置一个监视点。。

代码:

#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++){int w=query(1,1,n,a[i].l,a[i].r);int w1=query(1,1,n,6,6);printf("%d~%d w=%d\n",a[i].l,a[i].r,w);//printf("%d~%d w=%d\n",6,6,w1);update(1,1,n,a[i].l,a[i].r,a[i].k-w);}printf("%d\n",query(1,1,n,1,n));return 0;
}
// 监视任务 运行/限制:898ms/2000ms
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct node {int l, r, k;bool operator<(const node& b)const {return r < b.r;}
}a[1000005];
int sum[500005 << 2];
int book[500005];
void pushUp(int root) {sum[root] = sum[root << 1] + sum[root << 1 | 1];
}
void build(int le, int rig, int root) {if (le == rig) {sum[root] = 0;return;}int mid = (le + rig) >> 1;build(le,mid,root<<1);build(mid+1,rig,root<<1|1);pushUp(root);
}
int query(int l, int  r, int le, int rig, int root) {if (l <= le && r >= rig) {return sum[root];}int re = 0;int mid = (le + rig) >> 1;if (l <= mid) {re += query(l, r, le,mid,root<<1);}if (r > mid) {re += query(l, r, mid+1,rig,root<<1|1);}return re;
}
void update(int pos, int le, int rig, int root) {if (le == rig) {sum[root] = 1;return;}int mid = (le + rig) >> 1;if (pos <= mid) {update(pos, le,mid,root<<1);}else {update(pos, mid+1,rig,root<<1|1);}pushUp(root);
}
int main(){int n, m, ans;while (scanf("%d%d", &n, &m) != EOF) {ans = 0;memset(book, 0, sizeof(book));for (int i = 0; i < m; i++) {scanf("%d%d%d",&a[i].l, &a[i].r, &a[i].k);}build(1, n, 1);sort(a, a + m);for (int i = 0; i < m; i++) {int pos = a[i].r;//区间右边界int cnt = query(a[i].l,a[i].r, 1, n, 1);//查询该区间已经被防卫的点的数量while (cnt < a[i].k) {while (book[pos]) pos--;//从右向左找位置加防卫book[pos] = 1;update(pos, 1, n, 1);ans++;cnt++;}}printf("%d\n", ans);}return 0;
}

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

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

相关文章

【模板】最大密度子图

ACM模板 目录概念做法例题概念 选择一个子图G′(V′,E′)G(V,E)G′(V′,E′)&#xff0c;其中对于任意一条边的两个端点必须在所选的点集中&#xff0c;最大化∣E′∣∣V′∣\frac{|E|}{|V|}∣V′∣∣E′∣​ 做法 利用01分数规划二分即最大化 ∣E′∣−g∣V′∣|E|-g|V|∣E…

牛客练习赛79E-小G的数学难题【dp,单调队列】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出nnn个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci​)。 要求选出一个集合SSS&#xff0c;要求 (∑i∈Sai)≤P,(∑i∈Sbi)≥P\left(\sum_{i\in S}a_i\right)\leq P,\left(\sum_{i\in S}b_i\right)\…

手把手教你写DI_2_小白徒手撸构造函数注入

在上一节&#xff1a;手把手教你写DI_1_DI框架有什么&#xff1f;我们已经知道我们要撸哪些东西了那么我们开始动工吧&#xff0c;这里呢&#xff0c;我们找小白同学来表演下小白同学 &#xff1a;我们先定义一下我们的广告招聘纸有什么&#xff1a;好&#xff0c;我们实现两种…

E. Pattern Matching(题意理解+拓扑排序)

E. Pattern Matching 首先p[mtj]p[mt_j]p[mtj​]必须能够匹配所给字符sjs_jsj​&#xff0c;然后把所有能够匹配的sjs_jsj​的其他模板串也找出来&#xff0c;这些必须放在p[mtj]p[mt_j]p[mtj​]的后面&#xff0c;典型拓扑排序&#xff0c;连边然后排序即可 #define IO ios:…

Sum

链接&#xff1a;https://ac.nowcoder.com/acm/problem/14269 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 考虑维护一个这样的问题&#xff1a…

NOI.AC#2266-Bacteria【根号分治,倍增】

正题 题目链接:http://noi.ac/problem/2266 题目大意 给出nnn个点的一棵树&#xff0c;有一些边上有中转站&#xff08;边长度为222&#xff0c;中间有一个中转站&#xff09;&#xff0c;否则就是边长为111。 mmm次询问一个东西从xxx出发走到yyy&#xff0c;每隔kkk步中转站…

服务器win2008 R2 x64 部署ASP.net core到IIS 并解决 HTTP Error 502.5 的问题

1、发布网站 &#xff1b;2、安装 vc_redist.x64 (Visual C Redistributable for Visual Studio 2015) 新装的系统没装的补丁&#xff0c;装过略过&#xff1b;3、安装WindowsHosting &#xff1a;如&#xff1a; dotnet-hosting-2.1.3-win &#xff1b;4、安装.Net Core SDK&…

codeforces1271 D. Portals(dp or 带悔贪心)

D. Portals 由于每个点可以选择前面的某些点存在重复选择的情况&#xff0c;考虑除去重复选择的可能。 贪心&#xff1a;对于每一个城堡&#xff0c;我们都尽可能在最晚的时间控制&#xff0c;也就是在最后一个能控制它的点考虑是否控制。 于是考虑设计dp 状态表示&#xf…

P3337-[ZJOI2013]防守战线【单纯形】

正题 题目链接:https://www.luogu.com.cn/problem/P3337 题目大意 nnn个地方可以建立塔也可以不建立塔&#xff0c;第iii个位置建立需要消耗CiC_iCi​元 mmm个限制要求在某个区间内的塔的数量超过DiD_iDi​ 1≤n≤1000,1≤m≤100001\leq n\leq 1000,1\leq m\leq 100001≤n≤10…

Data Structure Problem

试题链接 题目描述 题意&#xff1a; 有两个序列&#xff0c; 操作1是将a序列的第x位改成y 操作2是将b序列的第x位改成y 操作3是找到一个cx&#xff0c;满足递推式c00&#xff0c;ci max(ci-1bi&#xff0c;ai) 题解&#xff1a; 官方题解 说实话我没大看懂。。。 题是我同…

定制Ocelot来满足需求

这篇文章&#xff0c;我们将从Ocelot的中间件源码分析&#xff0c;目前Ocelot已经实现那些功能&#xff0c;还有那些功能在我们实际项目中暂时还未实现&#xff0c;如果我们要使用这些功能&#xff0c;应该如何改造等方面来说明。一、Ocelot源码解读在使用一个组件前&#xff0…

codeforces1151 E. Number of Components(计数)

E. Number of Components 方法一&#xff1a;考虑每个点的贡献&#xff0c;认为一个联通块里让编号最大的点产生贡献 那么&#xff0c;对于一个点 iii&#xff0c;如果对答案产生贡献&#xff0c;一定要点 iii 存在&#xff0c;而点 i1i 1i1 不存在。 #define IO ios::sync_…

P2490-[SDOI2011]黑白棋【博弈论,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2490 题目大意 一个长度为nnn的棋盘上放下kkk个棋子。 第一个要是白色&#xff0c;下一个要是黑色&#xff0c;在下一个是白色以此类推。 先手操控白&#xff0c;后手操控黑。白色只能往右&#xff0c;黑色只能往左。每次…

【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

从本文开始&#xff0c;我们正式进入项目研发阶段&#xff0c;首先我们分析下统一认证平台应该具备哪些功能性需求和非功能性需求&#xff0c;在梳理完这些需求后&#xff0c;设计好系统采用的架构来满足已有的需求和未来的扩展应用。1 功能性需求统一认证平台应该具备以下基本…

Shift and Reverse

题目链接 题意&#xff1a; 一个序列a1&#xff0c;a2&#xff0c;a3…an 选择一个i&#xff0c;然后将序列改成ai,ai-1,…a1,an,an-1,…ai1 可以进行无数次这样的操作 问&#xff1a;最多有多少不同的序列产生&#xff1f;&#xff08;答案mod1e97&#xff09; 题解&#xf…

UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】

正题 题目链接:https://uoj.ac/problem/33 题目大意 给出nnn个点的一棵树 定义f(x,y)gcd(dis(x,lca),dis(y,lca))f(x,y)gcd(\ dis(x,lca),dis(y,lca)\ )f(x,y)gcd( dis(x,lca),dis(y,lca) )。 对于每个iii求有多少对f(x,y)i(x<y)f(x,y)i(x<y)f(x,y)i(x<y) 1≤n≤1…

codeforces1167 E. Range Deleting(双指针)

E. Range Deleting 首先不难知道如果f(l,r)f(l,r)f(l,r)满足题意&#xff0c;那么f(l,r1),f(l,r2),…,f(l,x)f(l,r1),f(l,r2),\dots,f(l,x)f(l,r1),f(l,r2),…,f(l,x)都满足题意。 因而对于每一个左端点lll&#xff0c;需要找到最小的一个右端点rrr 单调性&#xff1a;对于每…

Redis基本使用及百亿数据量中的使用技巧分享

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9941208.html作者&#xff1a;大石头时间&#xff1a;2018-11-10 晚上20&#xff1a;00地点&#xff1a;钉钉群&#xff08;组织代码BKMV7685&#xff09;QQ群&#xff1a;1600800内容&#xff1…

Subsequence Pair

题目 题目描述 题意&#xff1a; X和Y两个字符串&#xff0c;两个字符串各取子序列X1和Y1&#xff0c;问X1<Y1的情况下X1和Y1的长度和最长是多少&#xff1f; 比如例子&#xff1a; zazxwabzczazazd abcaa 第一个字符串选取子序列为azxwabzczazazd 第二个为bcaa azxwabzc…

NOI.AC#2144-子串【SAM,倍增】

正题 题目链接:http://noi.ac/problem/2144 题目大意 给出一个字符串sss和一个序列aaa。将字符串sss的所有本质不同子串降序排序后&#xff0c;求有多少个区间[l,r][l,r][l,r]使得子串sl,rs_{l,r}sl,r​排名等于al∼ra_{l\sim r}al∼r​的和。 1≤n≤21051\leq n\leq 2\times…