题意:有n个空心物品,每个物品有外部体积outi和内部体积ini,如果ini>outj,那么j就可以套在i里面。现在我们要选出n个物品的一个子集,这个子集内的k个物品全部套在一起,且剩下的物品都无法添加到这个子集中(没有空间塞进去)。

定义浪费的空间为子集中空心的部分,即ini1+(ini2−outi1)+(ini3−outi2)+⋯+(inik−outik−1)ini1+(ini2−outi1)+(ini3−outi2)+⋯+(inik−outik−1)。求浪费空间最少的子集个数。

解法:第一时间能想到最短路计数,但是朴素建图办法是n^2的。不会线段树优化建图,这里学习的是https://www.cnblogs.com/birchtree/p/11274812.html这位大佬的。

上面大佬的博客说得十分好了。线段树优化的原理其实就是通过一棵线段树当作工具树,这棵树不附带信息,只是作为一个桥梁连原图结点,且因为线段树能极短地表示区间的优点使得:向区间连边时极大的优化边数。

从而达到优化边数的目的。

upd:好像被新数据hack了

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
const int MOD=1e9+;
int n,s,t,tot,p[N],b[N],tag[N],indeg[N],outdeg[N];
typedef long long LL;
struct dat{
int l,r;
bool operator < (const dat &rhs) const {
return r<rhs.r;
}
}a[N]; int cnt=,head[N],nxt[N<<],to[N<<],len[N<<];
void add_edge(int x,int y,int z) {
nxt[++cnt]=head[x]; to[cnt]=y; len[cnt]=z; head[x]=cnt;
indeg[y]++; outdeg[x]++;
} void build(int rt,int l,int r) {
tot=max(tot,rt);
if (l==r) {
p[l]=rt;
return;
}
int mid=l+r>>;
add_edge(rt,rt<<,); add_edge(rt,rt<<|,);
build(rt<<,l,mid);
build(rt<<|,mid+,r);
} void query(int rt,int l,int r,int ql,int qr,int i) {
if (ql<=l && r<=qr) {
add_edge(tot+i,rt,a[i].l);
return;
}
int mid=l+r>>;
if (ql<=mid) query(rt<<,l,mid,ql,qr,i);
if (qr>mid) query(rt<<|,mid+,r,ql,qr,i);
} queue<int> q;
LL dis[N],ans[N];
LL toposort() {
memset(dis,0x3f,sizeof(dis));
memset(ans,,sizeof(ans));
for (int i=;i<=n;i++) {
tag[i]+=tag[i-];
if (tag[i]==) add_edge(s,tot+i,);
else add_edge(p[i],tot+i,-a[i].r);
}
q.push(s); dis[s]=; ans[s]=;
add_edge(s,,0x3f3f3f3f);
while (!q.empty()) {
int x=q.front(); q.pop();
for (int i=head[x];i;i=nxt[i]) {
int y=to[i];
if (dis[x]+len[i]<dis[y]) {
dis[y]=dis[x]+len[i];
ans[y]=ans[x];
} else if (dis[x]+len[i]==dis[y]) {
ans[y]=(ans[x]+ans[y])%MOD;
}
if (--indeg[y]==) q.push(y);
}
}
return ans[t];
} int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d%d",&a[i].r,&a[i].l);
sort(a+,a+n+);
tot=;
build(,,n);
//for (int i=1;i<=n;i++) add_edge(p[i],tot+i,-a[i].r);
for (int i=;i<=n;i++) b[i]=a[i].r;
s=; t=tot+n+;
for (int i=;i<=n;i++) {
int tmp=upper_bound(b+,b+i+,a[i].l)-b-;
if (tmp>=) query(,,n,,tmp,i),tag[]++,tag[tmp+]--;
else add_edge(tot+i,t,);
} cout<<toposort()<<endl;
return ;
}

Educational Codeforces Round 69 E - Culture Code (最短路计数+线段树优化建图)的更多相关文章

  1. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  2. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路

    B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...

  3. 区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D

    http://codeforces.com/contest/787/problem/D 题目大意:有n个点,三种有向边,这三种有向边一共加在一起有m个,然后起点是s,问,从s到所有点的最短路是多少? ...

  4. CodeForces 786B Legacy(线段树优化建图+最短路)

    [题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...

  5. Educational Codeforces Round 81 (Rated for Div. 2)E(线段树)

    预处理把左集划分为大小为1~i-1时,把全部元素都移动到右集的代价,记作sum[i]. 然后枚举终态时左集的大小,更新把元素i 留在/移动到 左集的代价. 树状数组/线段树处理区间修改/区间查询 #d ...

  6. Educational Codeforces Round 73 (Rated for Div. 2)F(线段树,扫描线)

    这道题里线段树用来区间更新(每次给更大的区间加上当前区间的权重),用log的复杂度加快了更新速度,也用了区间查询(查询当前区间向右直至最右中以当前区间端点向右一段区间的和中最大的那一段的和),也用lo ...

  7. Educational Codeforces Round 72 (Rated for Div. 2)E(线段树,思维)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;#define BUF_SIZE 100000 ...

  8. Codeforces.1045A.Last chance(最大流ISAP 线段树优化建图)

    题目链接 \(Description\) 你需要用给定的\(n\)个武器摧毁\(m\)架飞船中的某一些.每架飞船需要被摧毁恰好一次. 武器共三种:1.可以在给定的集合中摧毁一架飞船:2.可以摧毁区间\ ...

  9. Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)

    题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...

随机推荐

  1. 第二节:专做自己是小白——重新认识MySQL 学习记录

    一.安装MySQL的一些知识点 1.进程号是操作系统随机分配,每次启动程序都会有一个新的进程号.    2.mysql服务器进程默认名称MySQL,MySQL客户端进程默认名称mysql.    3. ...

  2. python 中 len()和range()

    https://blog.csdn.net/qq_36357820/article/details/77850841

  3. P4707 重返现世 扩展 MinMax 容斥+DP

    题目传送门 https://www.luogu.org/problem/P4707 题解 很容易想到这是一个 MinMax 容斥的题目. 设每一个物品被收集的时间为 \(t_i\),那么集齐 \(k\ ...

  4. Xcode7.1环境下上架iOS App到AppStore 流程③

    前言部分 part三 部分主要讲解 Xcode关联绑定发布证书的配置.创建App信息.使用Application Loader上传.ipa文件到AppStore 一.Xcode配置发布证书信息 1)给 ...

  5. pytorch数据预处理错误

    出错: Traceback (most recent call last): File , in <module> train_model(model_conv, criterion, o ...

  6. 如何利用nginx实现负载均衡(总结)

    如何利用nginx实现负载均衡(总结) 一.总结 一句话总结: 推荐使用nginx七层(应用层)负载均衡的实现:配置那是相当的简单 1.nginx配置实例? |||-begin #这里的域名要和下面p ...

  7. SQL:REGEXP

    作为一个更为复杂的示例,正则表达式B[an]*s匹配下述字符串中的任何一个:Bananas,Baaaaas,Bs,以及以B开始.以s结束.并在其中包含任意数目a或n字符的任何其他字符串. 以下是可用于 ...

  8. sql查询某个时间内的数据

    hour) 七天之前的数据 SELECT * FROM commodity_order where create_time <= (now()-INTERVAL 7 DAY) order by ...

  9. PS操作

    笔:B 橡皮:E 新建:C+N 选取套索:L 套索后按Alt,移动 放大:Ctrl + “+” 或 Z 缩小:Ctrl + “-” 或 Alt Z / Alt ,然后用滑轮控制大小 撤销:Ctrl + ...

  10. python中列表元素连接方法join用法实例

    python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...