【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)
我就不说我很sb的用线段树来维护值。。。。。。
本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法。最后一小时才想出来线段树(果然太弱)
。。
首先想到贪心,答案一定是某个区间的右端点。。。(这个很容易想也容易证,我就不说了。。。。。)
然后按右端点排序
然后我维护了个左端点前缀和,将来枚举每一个右端点的时候所得到的答案就是sum[n]-sum[i]-he+ge*a[i].r
he表示包含右端点的所有区间的左端点之和,ge表示包含这个点的区间个数。(均不包括自己)
。。
然后离散一下端点用线段树就可以维护he和ge了。。。。
。。
噗,为嘛我没想到直接差分就行了。。。。。。。。
我们直接枚举每个端点,然后维护一个左端点的(后缀和,应该这么说对吧。。。。),每遇到一个左端点就剪掉,就是he,ge数就++同理。。。。。
遇到右端点ge就--且更新答案。QAQ
然后就行了。。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int max(const int &a, const int &b) { return a>b?a:b; }
const int min(const int &a, const int &b) { return a<b?a:b; }
#define read(x) scanf("%d", &x)
#define error(x) if(x) { puts("error"); }
#define dbg(x) cout << (#x) << " = " << x << endl
#define rep(i, n) for(int i=0; i<n; ++i)
#define for1(i,a,n) for(int i=(a); i<=(n); ++i)
#define for2(i,a,n) for(int i=(a); i<(n); ++i)
#define for3(i,a,n) for(int i=(a); i>=(n); ++i)
#define for4(i,a,n) for(int i=(a); i>(n); ++i) #define lc x<<1
#define rc x<<1|1
#define lson l, m, lc
#define rson m+1, r, rc
#define MID (l+r)>>1 const int N=1e5+10;
struct dat { ll l, r; int pl, pr; }a[N];
struct Tre { int s; ll sum; }t[N<<4];
void pushup(int x) { t[x].s=t[lc].s+t[rc].s; t[x].sum=t[lc].sum+t[rc].sum; }
void update(int l, int r, int x, int pos, ll sum, int k) {
if(l==r) {
t[x].s+=k;
t[x].sum+=sum;
return;
}
int m=MID;
if(pos<=m) update(lson, pos, sum, k); else update(rson, pos, sum, k);
pushup(x);
}
int ask1(int l, int r, int x, int L, int R) {
if(L<=l && r<=R) return t[x].s;
int m=MID, ret=0;
if(L<=m) ret+=ask1(lson, L, R); if(m<R) ret+=ask1(rson, L, R);
return ret;
}
ll ask2(int l, int r, int x, int L, int R) {
if(L<=l && r<=R) return t[x].sum;
int m=MID; ll ret=0;
if(L<=m) ret+=ask2(lson, L, R); if(m<R) ret+=ask2(rson, L, R);
return ret;
}
bool cmp(const dat &a, const dat &b) { return a.r<b.r; }
int n, num;
ll sum[N], he, ans, E, ge, b[N<<1];
int main() {
read(n);
for1(i, 1, n) read(a[i].l), read(a[i].r), b[++num]=a[i].l, b[++num]=a[i].r; sort(a+1, a+1+n, cmp);
sort(b+1, b+1+num);
num=unique(b+1, b+1+num)-b-1;
for1(i, 1, n) a[i].pl=lower_bound(b+1, b+1+num, a[i].l)-b;
for1(i, 1, n) a[i].pr=lower_bound(b+1, b+1+num, a[i].r)-b;
for1(i, 1, n) update(1, num, 1, a[i].pl, a[i].l, 1); for1(i, 1, n) sum[i]=sum[i-1]+a[i].l;
for1(i, 1, n) {
update(1, num, 1, a[i].pl, -a[i].l, -1);
while(a[i].r==a[i+1].r) {
++i;
update(1, num, 1, a[i].pl, -a[i].l, -1);
}
ge=ask1(1, num, 1, 1, a[i].pr);
he=ask2(1, num, 1, 1, a[i].pr);
ll tp=sum[n]-sum[i]-he+ge*a[i].r+a[i].r;
if(tp>ans) {
ans=tp;
E=a[i].r;
}
}
printf("%lld %lld\n", E, ans);
return 0;
}
背景
描述
输入格式
接下来N行每行两个整数ai、bi,第i+1行表示第i种元素的封印区间。
输出格式
测试样例1
输入
2
5 10
20 25
输出
10 30
备注
对于 100% 的数据,1<=N<=10^5,1<=ai<=bi<=10^9。
【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)的更多相关文章
- 「Poetize10」封印一击
描述 Description Nescafe由n种元素组成(编号为1~n), 第i种元素有一个封印区间[ai,bi].当封印力度E小于ai时,该元素将获得ai的封印能量:当封印力度E在ai到bi之间时 ...
- 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树
LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- 2018.06.26「TJOI2018」数学计算(线段树)
描述 小豆现在有一个数 xxx ,初始值为 111 . 小豆有 QQQ 次操作,操作有两种类型: 111 $ m$ : x=x×mx=x×mx=x×m ,输出 xxx modmodmod MMM : ...
- loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】
题目链接 loj2537 题解 观察题目的式子似乎没有什么意义,我们考虑计算出每一种权值的概率 先离散化一下权值 显然可以设一个\(dp\),设\(f[i][j]\)表示\(i\)节点权值为\(j\) ...
- LOJ2537. 「PKUWC2018」Minimax [DP,线段树合并]
传送门 思路 首先有一个\(O(n^2)\)的简单DP:设\(dp_{x,w}\)为\(x\)的权值为\(w\)的概率. 假设\(w\)来自\(v1\)的子树,那么有 \[ dp_{x,w}=dp_{ ...
- LOJ 2302 「NOI2017」整数——压位线段树
题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...
- 牛客小白月赛19 E 「火」烈火燎原 (思维,树)
牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库
正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...
随机推荐
- js数组高阶方法reduce经典用法代码分享
以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...
- 【Firefly API文档】—— Package Distributed
http://bbs.gameres.com/forum.php?mod=viewthread&tid=219654 package distributed 这个包中主要封装了各个服务进程间进 ...
- (三)Solr——Solr的基本使用
1. Schema.xml 在schema.xml文件中,主要配置了solrcore的一些数据信息,包括Field和FieldType的定义等信息,在solr中,Field和FieldType都需要先 ...
- Android App补丁更新
上一周比较忙,忙的不可开交,写的文章也就两篇,在此希望大家见谅.这周呢,突然闲下来了,有时间了,就重构了下代码,捣鼓点前卫的技术,沉淀沉淀.所以呢,今天就分享下这几天研究的东西. 移动互联网主打的就是 ...
- HTTP 状态码总结 (HTTP Status Codes)
今天与同事聊天中提及到HTTP状态码的问题,突然发现工作这么些年对这个天天打交道的东西也没有一个详细的了解.日常最常见的状态码莫过于500和404了,几乎从事IT的应该都知道或许不从事的都知道,呵呵! ...
- geopandas python地图绘制
#geopandas python地理数据处理 瓦片地图:瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变.首先确定地图服务平台所要提供的缩放级 ...
- 自制MVC框架的插件与拦截器基础
上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以下抽象类来实现插件或者拦截器. 1 ...
- 【SSH之旅】一步步学习Struts1框架(二):Struts实例
从上篇博客能够看到,事实上Struts1框架就是封装了一些页面的转向.数据类型的转换,去除冗余的if else推断.除了这些,事实上还封装了一些我们寻经常使用的JSTL标签库,文件上传等等. 以下看怎 ...
- 现在的C语言编辑器里的int范围为什么是-2147483648~2147483647 2014-08-05 10:21 100人阅读 评论(0) 收藏
下面是引用百度文库的一段话: "这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为111111111111111 ...
- html5_storage存取实例
<script src="jquery-1.8.3.js"></script><script>function set(){ var tt ...