题面:

题意:
给定正整数 nnn 和起始位置 sss。
nnn 表示有 nnn 个杆子,每个杆子由属性 (xi,hi)(x_i,h_i)(xi​,hi​) 构成,表示在 xix_ixi​ 处有一根高度为 hih_ihi​ 的杆子。初始时在 sss 杆子处。

每爬到一个杆子(途径不算)我就会把这个杆子扔掉。

从当前位置要去的下一个杆子符合以下条件:假设当前在杆子 iii 处。
(1)当前还在场上的杆子。
(2)选择hj−∣xi−xj∣h_j-|x_i-x_j|hj​−∣xi​−xj​∣ 最大的杆子。
(3)如果有多个hj−∣xi−xj∣h_j-|x_i-x_j|hj​−∣xi​−xj​∣ 最大的杆子,选择 ∣xi−xj∣|x_i-x_j|∣xi​−xj​∣ 最小的杆子。
(4)如果有多个hj−∣xi−xj∣h_j-|x_i-x_j|hj​−∣xi​−xj​∣ 最大的杆子,且有多个 ∣xi−xj∣|x_i-x_j|∣xi​−xj​∣ 最小的杆子。选择最左侧的杆子。

题解:
考虑对于某一个确定的 xix_ixi​,如果 xi<=xjx_i<=x_jxi​<=xj​,那么条件(2),(3)转化为 max(hj−xj),min(xj)max(h_j-x_j),min(x_j)max(hj​−xj​),min(xj​)。如果 xi>=xjx_i>=x_jxi​>=xj​,那么条件(2),(3) 转化为 max(hj+xj),min(−xj)max(h_j+x_j),min(-x_j)max(hj​+xj​),min(−xj​)。

那么我们开两棵线段树,一棵线段树维护 max(hj−xj),min(xj)max(h_j-x_j),min(x_j)max(hj​−xj​),min(xj​),另一棵线段树维护max(hj+xj),min(−xj)max(h_j+x_j),min(-x_j)max(hj​+xj​),min(−xj​)。

时间复杂度 O(nlogn)O(nlogn)O(nlogn)。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
namespace onlyzhao
{#define ui unsigned int#define ll long long#define llu unsigned ll#define ld long double#define pr make_pair#define pb push_back#define lc (cnt<<1)#define rc (cnt<<1|1)#define len(x)  (t[(x)].r-t[(x)].l+1)#define tmid ((l+r)>>1)#define fhead(x) for(int i=head[(x)];i;i=nt[i])//#define max(x,y) ((x)>(y)?(x):(y))//#define min(x,y) ((x)>(y)?(y):(x))#define one(n) for(int i=1;i<=(n);i++)#define rone(n) for(int i=(n);i>=1;i--)#define fone(i,x,n) for(int i=(x);i<=(n);i++)#define frone(i,n,x) for(int i=(n);i>=(x);i--)#define fonk(i,x,n,k) for(int i=(x);i<=(n);i+=(k))#define fronk(i,n,x,k) for(int i=(n);i>=(x);i-=(k))#define two(n,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++)#define ftwo(i,n,j,m) for(int i=1;i<=(n);i++) for(int j=1;j<=(m);j++)#define fvc(vc) for(int i=0;i<vc.size();i++)#define frvc(vc) for(int i=vc.size()-1;i>=0;i--)#define forvc(i,vc) for(int i=0;i<vc.size();i++)#define forrvc(i,vc) for(int i=vc.size()-1;i>=0;i--)#define cls(a) memset(a,0,sizeof(a))#define cls1(a) memset(a,-1,sizeof(a))#define clsmax(a) memset(a,0x3f,sizeof(a))#define clsmin(a) memset(a,0x80,sizeof(a))#define cln(a,num) memset(a,0,sizeof(a[0])*num)#define cln1(a,num) memset(a,-1,sizeof(a[0])*num)#define clnmax(a,num) memset(a,0x3f,sizeof(a[0])*num)#define clnmin(a,num) memset(a,0x80,sizeof(a[0])*num)#define sc(x) scanf("%d",&x)#define sc2(x,y) scanf("%d%d",&x,&y)#define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z)#define scl(x) scanf("%lld",&x)#define scl2(x,y) scanf("%lld%lld",&x,&y)#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)#define scf(x) scanf("%lf",&x)#define scf2(x,y) scanf("%lf%lf",&x,&y)#define scf3(x,y,z) scanf("%lf%lf%lf",&x,&y,&z)#define scs(x) scanf("%s",x+1)#define scs0(x) scanf("%s",x)#define scline(x) scanf("%[^\n]%*c",x+1)#define scline0(x) scanf("%[^\n]%*c",x)#define pcc(x) putchar(x)#define pc(x) printf("%d\n",x)#define pc2(x,y) printf("%d %d\n",x,y)#define pc3(x,y,z) printf("%d %d %d\n",x,y,z)#define pck(x) printf("%d ",x)#define pcl(x) printf("%lld\n",x)#define pcl2(x,y) printf("%lld %lld\n",x,y)#define pcl3(x,y,z) printf("%lld %lld %d\n",x,y,z)#define pclk(x) printf("%lld ",x)#define pcf2(x) printf("%.2f\n",x)#define pcf6(x) printf("%.6f\n",x)#define pcf8(x) printf("%.8f\n",x)#define pcs(x) printf("%s\n",x+1)#define pcs0(x) printf("%s\n",x)#define pcline(x) printf("%d**********\n",x)#define casett int tt;sc(tt);int pp=0;while(tt--)char buffer[100001],*S,*T;inline char Get_Char(){if (S==T){T=(S=buffer)+fread(buffer,1,100001,stdin);if (S==T) return EOF;}return *S++;}inline int read(){char c;int re=0;for(c=Get_Char();c<'0'||c>'9';c=Get_Char());while(c>='0'&&c<='9') re=re*10+(c-'0'),c=Get_Char();return re;}
};
using namespace onlyzhao;
using namespace std;const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e9;
const int mod=998244353;
const double eps=1e-8;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=100100;
const int maxm=100100;
const int up=100100;ll h[maxn],x[maxn];
int n,s;
struct node
{int l,r;ll maxx,minn;int id;
};void pushup(node &now,const node &l,const node &r)
{if(l.maxx>r.maxx){now.maxx=l.maxx;now.minn=l.minn;now.id=l.id;}else if(l.maxx<r.maxx){now.maxx=r.maxx;now.minn=r.minn;now.id=r.id;}else{if(l.minn<r.minn){now.maxx=l.maxx;now.minn=l.minn;now.id=l.id;}else if(l.minn>r.minn){now.maxx=r.maxx;now.minn=r.minn;now.id=r.id;}else{if(l.id<r.id){now.maxx=l.maxx;now.minn=l.minn;now.id=l.id;}else{now.maxx=r.maxx;now.minn=r.minn;now.id=r.id;}}}
}struct xds
{node t[maxn<<2];void build(int l,int r,int cnt){t[cnt].l=l,t[cnt].r=r;if(l==r){t[cnt].maxx=h[l]-x[l];t[cnt].minn=x[l];t[cnt].id=l;return ;}build(l,tmid,lc);build(tmid+1,r,rc);pushup(t[cnt],t[lc],t[rc]);}node ask(int l,int r,int cnt){if(l<=t[cnt].l&&t[cnt].r<=r)return t[cnt];node now;if(r<t[rc].l) now=ask(l,r,lc);else if(l>t[lc].r) now=ask(l,r,rc);else pushup(now,ask(l,r,lc),ask(l,r,rc));return now;}void change(int pos,int cnt){if(t[cnt].l==t[cnt].r){t[cnt].maxx=-lnf;t[cnt].minn=lnf;t[cnt].id=-1;return ;}if(pos<=t[lc].r) change(pos,lc);else change(pos,rc);pushup(t[cnt],t[lc],t[rc]);}
}t1,t2;set<ll>se;
map<ll,int>mp;int main(void)
{scanf("%d%d",&n,&s);for(int i=1;i<=n;i++){scanf("%lld%lld",&x[i],&h[i]);se.insert(x[i]);mp[x[i]]=i;}t1.build(1,n,1);for(int i=1;i<=n;i++)x[i]=-x[i];t2.build(1,n,1);for(int i=1;i<=n;i++)x[i]=-x[i];t1.change(s,1);t2.change(s,1);se.erase(x[s]);ll ans=0;ll pos=x[s];while(se.size()){auto now=se.upper_bound(pos);node cc;if(now==se.begin()){cc=t1.ask(1,n,1);}else if(now==se.end()){cc=t2.ask(1,n,1);}else{node xx=t2.ask(1,mp[*(--now)],1);node yy=t1.ask(mp[*(++now)],n,1);swap(xx,yy);xx.maxx+=pos;xx.minn-=pos;yy.maxx-=pos;yy.minn+=pos;pushup(cc,xx,yy);}ans+=abs(x[cc.id]-pos);t1.change(cc.id,1);t2.change(cc.id,1);se.erase(x[cc.id]);pos=x[cc.id];}printf("%lld\n",ans);return 0;
}

石油大--2020年秋季组队训练赛第十二场----J、Greedy Termite(线段树)相关推荐

  1. 【upc】2020年秋季组队训练赛第十二场J Greedy Termite | 删点线段树

    状态 题目描述 There are n wooden rods vertically placed over a horizontal line. The rods are numbered 1 th ...

  2. 石油大--2020年秋季组队训练赛第十二场---- L、The Assembly Code(模拟)

    题面: 题意: 就是题目有点长,写起来直接写就好啦. 有一个长度为 232,0≤i<2322^{32},0\le i <2^{32}232,0≤i<232 数组 MMM , MiM_ ...

  3. 石油大--2020年秋季组队训练赛第十三场----B、Bouldering(最短路)

    题面: 题意: 给定一个 h∗wh*wh∗w 点阵,其中某一些点是可以走的. 这些点都有一个权值,表示如果经过当前点,则会花费的力气. 给定一个 rrr,你只能从当前点到达与你欧几里得距离不超过 rr ...

  4. 石油大--2020年秋季组队训练赛第十三场---- C、Colourful Chameleons(思维)

    题面: 题意: 有 nnn 种颜色的变色龙,其中第 iii 种颜色的变色龙有 ai,(ai>=n−1)a_i ,(a_i>=n-1)ai​,(ai​>=n−1) 只. 我每次可以选择 ...

  5. UPC 2020年秋季组队训练赛第十四场

    问题 A: Too Expensive to Buy a House 时间限制: 1 Sec 内存限制: 128 MB 题目描述 WNJXYK and DIDIDI are good friends ...

  6. 【DFS反向建图记忆化搜索】UPC Contest2592 - 2020年秋季组队训练赛第十四场 问题 D: Mysterious Treasure

    问题 D: Mysterious Treasure 时间限制: 1 Sec 内存限制: 128 MB 题目描述 WNJXYK and DIDIDI is playing a game. DIDIDI ...

  7. 【upc】2020年秋季组队训练赛第十四场 Get Strong | 折半搜索、二分

    题目描述 WNJXYK and DIDIDI are friends. They are thinking about getting strong all the time. They are pl ...

  8. 2019年第二阶段我要变强个人训练赛第十八场 扶桑号战列舰(线段树+递归)

    问题 N: 扶桑号战列舰 时间限制: 1 Sec  内存限制: 128 MB  Special Judge 题目描述 众所周知,一战过后,在世界列强建造超无畏级战列舰的竞争之中,旧日本海军根据&quo ...

  9. 石油大--Contest2022 - 2020年秋季组队训练赛第二场--17100 Problem D、Find String in a Grid (AC自动机)

    题面: 题意: 给定一个 R∗CR*CR∗C 的字符矩阵,由大写字母构成. 有 qqq 个询问,每次给定一个由大写字母构成的字符串,问这个字符串在这个字符矩阵中出现了多少次. 某个字符串在矩阵中出现定 ...

最新文章

  1. Codewars-Javascript训练手册:正则表达式(Regular Expressions)
  2. c#截取字符串后几位_基础库的字符串设计
  3. 使用idea编写代码作为生产者,Kafka接收其发来的信息【小案例】(一)
  4. 一台服务器创建多个ssh_如何创建可用于生产的第一台安全服务器
  5. SQL Server删除整个数据库中表数据的方法(不影响表结构)
  6. AIX 6.1环境 yum的安装方法
  7. 找到的程序集的清单定义与程序集引用不匹配
  8. 匿存函数,内存函数,递归函数,二分法查找
  9. switchhosts以管理员身份运行后不显示故障处理
  10. 电脑开机计算机配置,电脑开机显示配置更新怎么办
  11. 金士顿 U盘群联 ps2251_60 量产
  12. iometer - 性能压力测试工具
  13. RocketMQ ConsumeQueue 消费队列文件
  14. Chrome 复制网页不可复制的文字
  15. 【项目管理】干系人绩效域管理
  16. ASP.NET 有哪些web服务器-
  17. python+tkinter实现抖音爆款辞职信小程序
  18. 合影效果java_〖摄影技术〗6个姿势,教你拍好合影
  19. 虚幻4渲染编程(环境模拟篇)【第二卷:体积云天空模拟(2)---3D体纹理低云】...
  20. windows PE结构解析

热门文章

  1. python gevent安装_gevent
  2. JAVA计算机毕业设计中医药科普网站Mybatis+源码+数据库+lw文档+系统+调试部署
  3. linux+sql面试常见基础八股文
  4. ISTA2A模拟运输试验和跌落试验
  5. 江苏师范大学计算机全国排名,2019中国大学排行榜江苏师范大学排名126位
  6. 秋月之谋:5.21黄金震荡先空一次,原油依然强势
  7. jQuery经典小案例
  8. 每个人都在使用LSTM,主流学术圈却只想让它的发明者闭嘴
  9. HTML5+CSS3基础学习笔记:2
  10. Java基础篇面试题49问与答 (2021最新版)