【HDU - 5700】【51nod - 1672】 区间交(贪心,STLset 或线段树第k大)

题干:

小A有一个含有n个非负整数的数列与m个区间,每个区间可以表示为li,ri。

它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大。(是指k个区间共同的交,即每个区间都包含这一段,具体可以参照样例)

 

在样例中,5个位置对应的值分别为1,2,3,4,6,那么选择[2,5]与[4,5]两个区间的区间交为[4,5],它的值的和为10。

 收起

输入

第一行三个数n,k,m(1<=n<=100000,1<=k<=m<=100000)。
接下来一行n个数ai,表示小A的数列(0<=ai<=10^9)。
接下来m行,每行两个数li,ri,表示每个区间(1<=li<=ri<=n)。

输出

一行表示答案

输入样例

5 2 3
1 2 3 4 6
4 5
2 5
1 4

输出样例

10

解题报告:

   这题解法很多,因为元素值都是正数,所以我们可以枚举每一个位置,找到区间最左端的满足的,这一定就是对于当前i作为右端点的最大答案了。怎么看最左端满足的呢?也就是找到左端k个值,也就是找到左端第k大就行了,但是这题要判断一下是否一共这棵线段树中有k个元素,我们用tree[1].sum就可以得到。

  同样,维护位置和值 也可以用set。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
vector<int> vv[MAX];
int n,m,k; 
ll a[MAX];
struct TREE {int l,r;int sum;
} tree[MAX*4];
void pushup(int cur) {tree[cur].sum = tree[cur*2].sum + tree[cur*2+1].sum;
}
void build(int l,int r,int cur) {tree[cur].l = l;tree[cur].r = r;if(tree[cur].l == tree[cur].r) {tree[cur].sum = 0;return ;}int m = (l+r)>>1;build(l,m,cur*2);build(m+1,r,cur*2+1);pushup(cur);
}
int query(int tar,int cur) {if(tree[cur].l == tree[cur].r) return tree[cur].l;if(tar <= tree[cur*2].sum) return query(tar,cur*2);else return query(tar - tree[cur*2].sum,cur*2+1);
}
void update(int tar,int val,int cur) {if(tree[cur].l == tree[cur].r) {tree[cur].sum += val; return;}int m = tree[cur*2].r;if(tar <= m) update(tar,val,cur*2);else update(tar,val,cur*2+1); pushup(cur);
}
int main() 
{ll ans=0;cin>>n>>k>>m;build(1,n,1);for(int i = 1; i<=n; i++) scanf("%lld",a+i),a[i] += a[i-1];for(int x,y,i = 1; i<=m; i++) {scanf("%d%d",&x,&y);vv[x].pb(x);vv[y+1].pb(-x);}for(int i = 1; i<=n; i++) {int up = vv[i].size();for(int j = 0; j<up; j++) {if(vv[i][j] > 0) update(vv[i][j],1,1);else update(-vv[i][j],-1,1);} if(tree[1].sum >= k) {int pos = query(k,1);ans = max(ans,a[i] - a[pos-1]);} }printf("%lld\n",ans);return 0;
}

首先排序右端点从小到大,然后枚举右端点(保证所枚举的那个端点最少有k个区间可以覆盖)作为所求的交区间的右端点,这时候需要求出交区间的左端点,我们可以知道,右端点确定下,如果左端点越靠左,这个区间的范围约大。为了保证所交区间有k个,我们需要找到第k小的左端点,为了保证我枚举的右端点肯定是交区间的右端点,我们必须边枚举,边单点更新左端点。
 

#include<bits/stdc++.h>
#define inf 1e18
#define ll long long
#define N 300010
#define lson rt<<1
#define rson rt<<1|1
#define mo 1000000007
using namespace std;
typedef pair<int,int> P;
inline ll read() {ll x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,m,K;
ll sz[N*4],ans,sum[N];
struct node {int l,r;
} s[N];
bool cmp(node a,node b) {if (a.r==b.r) return a.l>b.l;return a.r<b.r;
}
void pushup(int rt) {sz[rt]=sz[lson]+sz[rson];
}
void modify(int rt,int l,int r,int pos) {if (l==r) {sz[rt]++;return ;}int mid=(l+r)>>1;if (pos<=mid) modify(lson,l,mid,pos);else modify(rson,mid+1,r,pos);pushup(rt);
}
int query(int rt,int l,int r,int x) {if (l==r) return l;int mid=(l+r)>>1;if (x<=sz[lson]) return query(lson,l,mid,x);else return query(rson,mid+1,r,x-sz[lson]);
}
int main() {n=read(),K=read(),m=read();for (int i=1; i<=n; i++) {sum[i]=read();sum[i]+=sum[i-1];}for (int i=1; i<=m; i++) s[i].l=read(),s[i].r=read();sort(s+1,s+m+1,cmp);for (int i=m-K+2; i<=m; i++) modify(1,1,n,s[i].l);for (int i=m-K+1; i>=1; i--) {modify(1,1,n,s[i].l);int x=query(1,1,n,K);if (x<=s[i].r) ans=max(ans,sum[s[i].r]-sum[x-1]);}printf("%lld",ans);return 0;
}

枚举i作为左端点的。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX = 100005;
ll sum[MAX] ;
ll a[MAX];
multiset<int> ss;
vector<int> vv[MAX];int main() 
{int n,k,m;while(~scanf("%d%d%d",&n,&k,&m) ) {memset(sum,0,sizeof sum);ss.clear();for(int i = 1; i<=n; i++) vv[i].clear();for(int i = 1; i<=n; i++) scanf("%lld",&a[i]),sum[i] = sum[i-1] + a[i];while(m--) {int l,r;scanf("%d%d",&l,&r);vv[l].push_back(r);}ll ans = 0;for(int i = 1; i<=n; i++) {int up = vv[i].size();for(int j = 0 ; j<up ; j++) ss.insert(vv[i][j]);if(ss.empty() == 0) {while(ss.size() > k || *ss.begin() < i) {ss.erase(ss.begin());if(ss.size() == 0) break;}				}if(ss.size() == k) ans = max(ans , sum[*(ss.begin())] - sum[i-1]);}printf("%lld\n" , ans);}return 0;
}

 

 

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define fi first
#define se second
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<ll ,int> pii;
const ll N = 101000, siz = 20, mod = 1e9+7, blk = 316, eps = 1e-10;
ll fpow(ll a, ll b){ll ret=1;for(a%=mod;b;b>>=1,a=a*a%mod)if(b&1)ret=ret*a%mod;return ret;}
priority_queue<int, vector<ll >, greater<int> >q;
ll n, m, k, sum[N], ans, t;
pair<ll ,ll >a[N];
int main(){cin>>n>>k>>m;for(ll i=1;i<=n;i++){cin>>t;sum[i] = sum[i-1]+t;}for(ll i=0;i<m;i++)cin>>a[i].fi>>a[i].se;sort(a, a+m);for(ll i=0;i<m;i++){q.push(a[i].se);while(!q.empty() && q.top() < a[i].fi)q.pop();while(q.size() > k) q.pop();if(q.size() == k){//cout<<a[i].fi<<" "<<q.top()<<endl;ans = max(ans, sum[q.top()]-sum[a[i].fi-1]);}}cout<<ans<<endl;return 0;
}

 

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

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

相关文章

python 爬虫 博客园_Python爬虫爬取博客园作业

分析一下他们的代码&#xff0c;我在浏览器中对应位置右键&#xff0c;然后点击检查元素&#xff0c;可以找到对应部分的代码。但是&#xff0c;直接查看当前网页的源码发现&#xff0c;里面并没有对应的代码。我猜测这里是根据服务器上的数据动态生成的这部分代码&#xff0c;…

【洛谷 - P1507 】NASA的食物计划(二维费用背包,dp)

题干&#xff1a; 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生&#xff0c;谁也无法保证,在遇到这类航天问题时,解决方法也许只能让航天员出仓维修,但是多次的维修…

java 与 xml_xml与java对象转换

public static void main(String[] args) {//java bean 转 xmlDept d new Dept();List staffs new ArrayList<>();Staff s1 new Staff("wuyun", 20);Staff s2 new Staff("lilei", 22);staffs.add(s1);staffs.add(s2);d.setDeptName("开放平…

【蓝桥杯官网试题 - 算法训练 】P0502(乱搞,tricks)

题干&#xff1a; 编写一个程序&#xff0c;读入一组整数&#xff0c;这组整数是按照从小到大的顺序排列的&#xff0c;它们的个数N也是由用户输入的&#xff0c;最多不会超过20。然后程序将对这个数组进行统计&#xff0c;把出现次数最多的那个数组元素值打印出来。如果有两个…

python循环中的else_python 循环中else的简单示例

导读热词对python这个高级语言感兴趣的小伙伴&#xff0c;下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧&#xff01;众多语言中都有if else这对条件选择组合&#xff0c;但是在python中还有更多else使用的地方&#xff0c;比如说循环for&#xff0c;或者while都可以和els…

【蓝桥杯官网试题 -算法训练】素因子去重(数学,数论,因子约数)

题干&#xff1a; 问题描述 给定一个正整数n&#xff0c;求一个正整数p&#xff0c;满足p仅包含n的所有素因子&#xff0c;且每个素因子的次数不大于1 输入格式 一个整数&#xff0c;表示n 输出格式 输出一行&#xff0c;包含一个整数p。 样例输入 1000 样例输出 10 数…

【蓝桥杯官网试题 - 算法提高】 贪吃的大嘴 (多重背包转0-1背包,dp)

题干&#xff1a; 问题描述 有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕. 输…

java applet socket_Java swing applet中使用的套接字

小编典典基于此示例&#xff0c;这是一个使用Swing的简单网络客户端/服务器对。请注意与正确同步有关的一些问题&#xff1a;GUI本身是使用事件分配线程构建的invokeLater()。此外&#xff0c;代码还依赖的线程安全性append()。最后&#xff0c;它结合了文章Text Area Scrollin…

【牛客 - 370A】签到题(线段树扫描线 或 STLset)(求线段并)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/A 来源&#xff1a;牛客网 恭喜你找到了本场比赛的签到题&#xff01; 为了让大家都有抽奖的机会&#xff0c;只需要复制粘贴以下代码&#xff08;并且稍微填下空&#xff09;即可 AC&#xff1…

java sqlserver分页查询_SQLServer之常用的分页查询语句介绍

在SqlServer中&#xff0c;分页查询是经常用到的查询语句&#xff0c;一个好的分页查询语句&#xff0c;不能能将代码省略&#xff0c;还能提高运行效率&#xff0c;下面我们来探讨一下SQLServer中的分页查询语句。具体的业务逻辑是这样的&#xff0c;我数据库中有100条数据&am…

【牛客 - 370H】Rinne Loves Dynamic Graph(分层图最短路)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/H 来源&#xff1a;牛客网 Rinne 学到了一个新的奇妙的东西叫做动态图&#xff0c;这里的动态图的定义是边权可以随着操作而变动的图。 当我们在这个图上经过一条边的时候&#xff0c;这个图上所…

中位数及带权中位数问题(转)

先从一到简单的题看起&#xff1a; 士兵站队问题 在一个划分成网格的操场上&#xff0c;n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步&#xff0c;但在同一时刻任一网格点上只能有一名士兵。按照军官的命令&#xff0c;…

java编写学籍管理系统_java学籍管理系统源代码.doc

java学籍管理系统源代码package zuoye;//主类import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.Hashtable;public class ManagerWindow extends JFrame implements ActionListener{InputStudent 基本信息录入null;ModifySit…

*【SGU - 114】Telecasting station (带权中位数 或 三分)

题干&#xff1a; Every city in Berland is situated on Ox axis. The government of the country decided to build new telecasting station. After many experiments Berland scientists came to a conclusion that in any city citizens displeasure is equal to product…

java的et5_Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )

在某个项目中&#xff0c;需要开发一个与native相对应的web前端app&#xff0c;后台用的是java restful接口&#xff0c;请求数据时需要用的3des加密。如果想要请求接口&#xff0c;则需要javascript的加密与java相同&#xff0c;于是在baidu与google进行了大量搜索&#xff0c…

*【HDU - 4272 】LianLianKan (dfs 或 状压dp,贪心不行)

题干&#xff1a; I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack. Now we have a number stack, and we should link and pop the same element…

java中的values函数_巧用valueat函数(快逸免费版)

在制作报表时&#xff0c;经常会遇到将数据库里一列数据按照条件取值后&#xff0c;分为多列显示的需求&#xff0c;例如&#xff1a;数据库中有一列名为type的数据&#xff0c;在报表中&#xff0c;第一列选择type为1的数据&#xff0c;第二列选择type为2的数据。由于受到扩展…

Java设计流程执行器_Java进阶面试精选系列:SpringMVC+SpringBoot+Hibernate+Mybatis+设计模式...

小编精心收集&#xff1a;为金三银四准备&#xff0c;以下面试题先过一遍&#xff0c;为即将到了的面试做好准备&#xff0c;也过一遍基础知识点。一、Spring/Spring MVC1.为什么要使用 spring&#xff1f;2.解释一下什么是 aop&#xff1f;3.解释一下什么是 ioc&#xff1f;3.…

【CCFCSP - 201403-4】无线网络(分层图最短路)

题干&#xff1a; 试题编号&#xff1a;201403-4试题名称&#xff1a;无线网络时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述   目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要…

【牛客 - 370E】Rinne Loves Gift(Bellman_Ford判负环,二分,分数规划)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/E 来源&#xff1a;牛客网 Rinne 喜欢礼物&#xff0c;也喜欢送礼物 圣诞节快到了&#xff0c;Rinne 要去给给住在城市里的人送礼物 城市的交通可以抽象成一个 n 个点 m 条边的有向图 每条边上有…