题意:OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“我的手速虽然已经站在了人类的巅峰,但是打隔膜还是输。我换了很多队友,但是没有用。请问应该怎样打好隔膜?”
长者回答:“你啊,Too Young Too Simple,Sometimes Naive!不过你来看看这个游戏,或许对你有些帮助。”
这是一个类似星球大战的游戏。有n个星球排成一列,第i个星球和第i+1个星球存在一条耗时为1、可多次经过的航线。同时还存在m扇传送门,一扇由i到j的传送门可以瞬间将抖儿从第i个星球传送到第j个星球或从第j个星球传送到第i个星球,但是传送完毕后传送门会消失。此外,抖儿目前的资源可以额外建造不多于p扇传送门。
抖儿可以从任意一个星球出发,经过所有的航线和传送门至少一次,然后在任意一个星球结束。抖儿自然希望能在尽量短的时间内完成任务,请你帮忙计算答案。

对于所有的数据,保证n≤1e9,m≤100000,p≤100000

思路:LYY压轴题

pascal用堆实现带删除priority_queue

开两个堆,一个放被删除元素的堆,删除元素时将其复制放入

取堆顶时判断堆顶是否与删除堆的堆顶相同

因为此题元素有两个值,需要二次比较

写的神志模糊 转C保平安

 type arr=record
x:int64;
y,t:longint;
end; var q1,q2:array[..]of arr;
d,du,x,y:array[..]of longint;
pre,next:array[..]of longint;
a:array[..]of int64;
n,m,i,t,t1,t2,up,cnt1,cnt2,p,tmp,p1,p2,k:longint;
ans:int64; procedure swap(var x,y:int64);
var t:int64;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,t,mid:longint;
begin
i:=l; j:=r; mid:=d[(l+r)>>];
repeat
while mid>d[i] do inc(i);
while mid<d[j] do dec(j);
if i<=j then
begin
t:=d[i]; d[i]:=d[j]; d[j]:=t;
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function hash(k:longint):longint;
var l,r,mid:longint;
begin
l:=; r:=up;
while l<=r do
begin
mid:=(l+r)>>;
if d[mid]=k then exit(mid);
if d[mid]<k then l:=mid+
else r:=mid-;
end;
end; procedure ins(x:int64;y:longint);
var t1,t2,t,tmp,k:longint;
begin
inc(cnt1);
q1[cnt1].x:=x; q1[cnt1].y:=y;
k:=cnt1;
while (k>)and((x<q1[k>>].x)or(x=q1[k>>].x)and(y<q1[k>>].y)) do
begin
t:=k>>;
t1:=q1[k].y; t2:=q1[t].y;
swap(q1[k].x,q1[t].x);
tmp:=q1[k].y; q1[k].y:=q1[t].y; q1[t].y:=tmp;
k:=k>>;
end;
end; procedure del(x:int64;y:longint);
var t1,t2,t,tmp,k:longint;
begin
inc(cnt2);
q2[cnt2].x:=x; q2[cnt2].y:=y;
k:=cnt2;
while (k>)and((x<q2[k>>].x)or(x=q2[k>>].x)and(y<q2[k>>].y)) do
begin
t:=k>>;
t1:=q2[k].y; t2:=q2[t].y;
swap(q2[k].x,q2[t].x);
tmp:=q2[k].y; q2[k].y:=q2[t].y; q2[t].y:=tmp;
k:=k>>;
end;
end; begin readln(n,m,p);
up:=; d[]:=; d[]:=n;
for i:= to m do
begin
read(x[i],y[i]);
inc(up); d[up]:=x[i];
inc(up); d[up]:=y[i];
end;
qsort(,up);
t:=up; up:=;
for i:= to t do
if d[i]<>d[up] then begin inc(up); d[up]:=d[i]; end;
du[]:=; du[up]:=;
for i:= to m do
begin
x[i]:=hash(x[i]);
y[i]:=hash(y[i]);
du[x[i]]:=du[x[i]] xor ;
du[y[i]]:=du[y[i]] xor ;
end; tmp:=; m:=;
for i:= to up do
if du[i]= then
begin
if tmp> then begin inc(m); a[m]:=d[i]-d[tmp]; end;
tmp:=i;
end; for i:= to m do
begin
//writeln(a[i]);
ins(a[i],i);
pre[i]:=i-;
next[i]:=i+;
end; t:=(m-) div -p;
//writeln(t);
for i:= to t do
begin
if cnt2> then
begin
t1:=; t2:=;
while (q1[t1].x=q2[t2].x)and(q1[t1].y=q2[t2].y) do
begin
q1[t1].x:=<<;
while t1<<<=cnt1 do
begin
k:=t1<<;
if (k+<=cnt1)and((q1[k+].x<q1[k].x)or
((q1[k+].x=q1[k].x)and(q1[k+].y<q1[k].y))) then inc(k);
if q1[k].x<q1[t1].x then
begin
swap(q1[k].x,q1[t1].x);
tmp:=q1[k].y; q1[k].y:=q1[t1].y; q1[t1].y:=tmp;
t1:=k;
end
else break;
end;
q2[t2].x:=<<;
while t2<<<=cnt2 do
begin
k:=t2<<;
if (k+<=cnt2)and((q2[k+].x<q2[k].x)or
((q2[k+].x=q2[k].x)and(q2[k+].y<q2[k].y))) then inc(k);
if q2[k].x<q2[t2].x then
begin
swap(q2[k].x,q2[t2].x);
tmp:=q2[k].y; q2[k].y:=q2[t2].y; q2[t2].y:=tmp;
t2:=k;
end
else break;
end;
t1:=; t2:=;
end;
end;
t2:=q1[].y; t1:=q1[].x;
del(t1,t2);
ans:=ans+t1;
if pre[t2]= then
begin
p1:=next[t2];
// writeln(p1);
del(a[p1],p1);
pre[next[next[t2]]]:=;
continue;
end
else if next[t2]>m then
begin
p1:=pre[t2];
// writeln(p1);
del(a[p1],p1);
next[pre[pre[t2]]]:=m+;
continue;
end;
tmp:=t2;
p1:=pre[tmp]; p2:=next[tmp];
// writeln(p1,' ',p2);
pre[tmp]:=pre[p1];
next[tmp]:=next[p2];
pre[next[tmp]]:=tmp;
next[pre[tmp]]:=tmp;
a[tmp]:=a[p1]+a[p2]-a[tmp];
ins(a[tmp],tmp);
del(a[p1],p1);
del(a[p2],p2);
end; writeln(ans+n-); end.
【后记】
抖儿深深沉迷于这个游戏不能自拔,日渐消瘦。
终于有一天,抖儿大彻大悟,说:“我知道了!玩游戏要的不仅仅是蛮力和手速,还需要智慧和策略。”
长者嘿嘿一笑:“你想多了。难道你还没发现你只适合玩单机游戏?”
抖儿恼羞成怒,便怂恿香港记者们造了一个大新闻,将长者批判了一番。

【NOIP2017练习】怎样打好隔膜(贪心,堆,带删除priority_queue)的更多相关文章

  1. 【贪心+堆】XMU 1584 小明的烦恼

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能 ...

  2. BZOJ_2151_种树_贪心+堆+链表

    BZOJ_2151_种树_贪心+堆 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编 ...

  3. BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表

    BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...

  4. BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆

    BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是 ...

  5. 【bzoj4425】[Nwerc2015]Assigning Workstations分配工作站 贪心+堆

    题目描述 佩内洛普是新建立的超级计算机的管理员中的一员. 她的工作是分配工作站给到这里来运行他们的计算研究任务的研究人员. 佩内洛普非常懒惰,不喜欢为到达的研究者们解锁机器. 她可以从在她的办公桌远程 ...

  6. 【bzoj1029】[JSOI2007]建筑抢修 贪心+堆

    题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建 ...

  7. 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆

    题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...

  8. BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板 贪心 + 堆 + 反向思考

    Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50, ...

  9. [JSOI2010]缓存交换 贪心 & 堆

    ~~~题面~~~ 题解: 首先我们要使得Miss的次数尽量少,也就是要尽量保证每个点在被访问的时候,这个点已经存在于Cache中. 那么我们可以得到一个结论: 如果Cache已满,那么我们就从Cach ...

随机推荐

  1. sdut1283Five in a Row, Again

    一简单的状压题 比赛时跑偏了 ,脑子最近乱的跟浆糊似得呢.. #include <iostream> #include<cstdio> #include<cstring& ...

  2. 通过 DBCA 工具创建Oracle数据库

    DBCA 是 Oracle 提供的一款图形化界面工具,用来帮助数据库管理员快速.直观地创建数据库,避免了繁琐复杂的 SQL命令操作. 使用 DBCA创建数据库的过程如下. (1)依次 单击“开始 ”→ ...

  3. composer Failed to decode zlib stream 无法解码zlib流

    Win7 中安装 Composer (PHP) 国内有些网络不能访问美国的Composer官网,可访问 Composer 中文网 学习. 目标 可以在任何目录下的项目中执行 PHP composer. ...

  4. (一)Spring之初了解

    1.认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AO ...

  5. 30款jQuery常用网页焦点图banner图片切换

    1.jquery 图片滚动特效制作 slide 图片类似窗帘式图片滚动 查看演示 2.jquery幻灯片插件带滚动条的圆形立体图片旋转滚动 查看演示 3.jQuery图片层叠旋转类似洗牌翻转图片幻灯片 ...

  6. Node.js——流的下载

    https://cnodejs.org/topic/59d8f43b2543cb3368b1623e var request = require('request'); var fs = requir ...

  7. chpasswd - 成批更新用户的口令

    总览 chpasswd [-e] 描述 chpasswd 从系统的标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令.在没有用 -e 这个开关选项的情况下,口令将按明文的形式接 ...

  8. 10 Steps To be a senior programmer

    What 软件工程师的职业生涯要历经以下几个阶段:初级.中级,最后才是高级.这篇文章主要是讲如何通过 10 个步骤助你成为一名高级软件工程师. Why 得到更多的报酬!因为你的薪水会随着你水平的提高而 ...

  9. 02Hibernate基本配置

    Hibernate基本配置 1.引入jar 2.建立项目 3.创建实体类 package com.sqlserver.domain; public class Customer { long cust ...

  10. Hadoop架构模型

    1.hadoop 1.x架构模型:分布式文件存储系统:HDFSNameNode(主节点:管理元数据) secondaryNameNode(作用是合并元数据信息,辅助NameNode管理元数据信息)Da ...