题面

传送门(loj)

传送门(洛谷)

题解

我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点

若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([p-d,p+d]\)中不存在点到\(p\)的距离小于\(u\)到\(p\)的距离,那么\(u\)就可以作为\(p\)的最短路的起点

易知可行的\(p\)肯定是连续的一段区间,所以我们可以二分左右端点

设\(sum_i\)表示点\(i\)到点\(1\)的距离,我们维护关键点的区间中\((sum_i-l_i)_{\max}\)和\((sum_i+l_i)_{\min}\)。对于\(p\)来说,\([p-d,p]\)中可行的关键点肯定是最大的\(sum_i-l_i\),而\([p,p+d]\)中肯定是最小的\(sum_i+l_i\),用\(ST\)表可以做到\(O(1)\)查询。然后把这两个点和\(u\)比较,如果\(u\)比起它们仍然更优,那么\(u\)就可以占领\(p\)

注意判断一下如果两个关键点到\(p\)的距离相等只能算一个,所以特判一下就好了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=2e5+5;
struct node{int u,d;node(){}node(R int x,R int y):u(x),d(y){}inline bool operator <(const node &b)const{return u<b.u;}
}e[N];
ll st1[N][21],st2[N][21],l1[N],l2[N],sum[N];
int Log[N],n,m,k;
inline int Max(R int x,R int y){return l1[x]==l1[y]?max(x,y):l1[x]>l1[y]?x:y;}
inline int Min(R int x,R int y){return l2[x]==l2[y]?min(x,y):l2[x]<l2[y]?x:y;}
inline int get1(int l,int r){int k=Log[r-l+1];return Max(st1[l][k],st1[r-(1<<k)+1][k]);
}
inline int get2(int l,int r){int k=Log[r-l+1];return Min(st2[l][k],st2[r-(1<<k)+1][k]);
}
void init(){sort(e+1,e+1+k);fp(i,1,k){l1[i]=sum[e[i].u]-e[i].d,l2[i]=sum[e[i].u]+e[i].d;st1[i][0]=st2[i][0]=i;}for(R int j=1;(1<<j)<=k;++j)fp(i,1,k-(1<<j)+1){st1[i][j]=Max(st1[i][j-1],st1[i+(1<<(j-1))][j-1]);st2[i][j]=Min(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);}
}
int better(int x,int y,int p){ll ans1=e[x].d+abs(sum[e[x].u]-sum[p]);ll ans2=e[y].d+abs(sum[e[y].u]-sum[p]);if(ans1!=ans2)return ans1<ans2?x:y;if(abs(p-e[x].u)!=abs(p-e[y].u))return abs(p-e[x].u)<abs(p-e[y].u)?x:y;return min(x,y);
}
bool ck(int p,int g){int d=abs(e[g].u-p);int l=lower_bound(e+1,e+1+k,node(p-d,0))-e;int r=upper_bound(e+1,e+1+k,node(p+d,0))-e-1;int mid=upper_bound(e+1,e+1+k,node(p,0))-e-1;if(l<=mid&&better(g,get1(l,mid),p)!=g)return false;if(r>mid&&better(g,get2(mid+1,r),p)!=g)return false;return true;
}
void solve(){ll res=0;fp(i,1,k){int l=1,r=e[i].u,mid,x,ans;while(l<=r)ck(mid=(l+r)>>1,i)?(ans=mid,r=mid-1):(l=mid+1);x=ans;l=e[i].u,r=n;while(l<=r)ck(mid=(l+r)>>1,i)?(ans=mid,l=mid+1):(r=mid-1);res+=ans-x+1;}print(res);
}
int main(){
//  freopen("testdata.in","r",stdin);n=read(),m=read();fp(i,2,n)sum[i]=read()+sum[i-1],Log[i]=Log[i>>1]+1;while(m--){k=read();fp(i,1,k)e[i].u=read(),e[i].d=read();init(),solve();}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10485500.html

洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)相关推荐

  1. 【洛谷3865】 【模板】ST表(猫树)

    传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里 转载于:https://www.cnblogs.com/ml ...

  2. 洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)

    题面 传送门(loj) 传送门(洛谷) 题解 我果然是人傻常数大的典型啊-- 题解在这儿 //minamoto #include<bits/stdc++.h> #define R regi ...

  3. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...

    仰望半月的夜空 题解 可以的话,支持一下原作吧... 这道题数据很弱..... 因此各种乱搞估计都是能过的.... 算法一 暴力长度然后判断判断,复杂度\(O(n^3)\) 期望得分15分 算法二 通 ...

  6. 洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】

    组合计数的一道好题.什么非主流题目 题目背景 (背景冗长请到题目页面查看) 题目描述 不妨假设枫叶上有 \(n​\) 个穴位,穴位的编号为 \(1\sim n​\).有若干条有向的脉络连接着这些穴位. ...

  7. 洛谷 P1948 / loj 10074 / 一本通 1496【分层图】

    坑点:求得是最大边权,dijk需要把求和改成最大值. #include <bits/stdc++.h> #define int long longusing namespace std;v ...

  8. 洛谷 P4269 / loj 2041 [SHOI2015] 聚变反应炉 题解【贪心】【DP】

    树上游戏..二合一? 题目描述 曾经发明了零件组装机的发明家 SHTSC 又公开了他的新发明:聚变反应炉--一种可以产生大量清洁能量的神秘装置. 众所周知,利用核聚变产生的能量有两个难点:一是控制核聚 ...

  9. 洛谷 1966 loj 2069 火柴排队 题解

    博客观赏效果更佳 题意简述 给定两个数列 a , b a,b a,b,长度均为 n ( < = 100000 ) n(<=100000) n(<=100000), a , b a,b ...

最新文章

  1. css实现文字超出显示省略号...
  2. POJ 3041 Asteroids 二分图匹配
  3. SAP IDES、DEV、QAS、PRD都是什么含义
  4. JAVA_list总结
  5. Singleton patterns 单件(创建型模式)
  6. JMX:一些入门说明
  7. duration java_Java Duration类| toHours()方法与示例
  8. Spark的操作列表
  9. VC MFC 换肤 SkinSharp
  10. 最新Python3.10官方文档PDF来了(最新Python大词典)
  11. 终端的乐趣--Linux下有趣的终端命令或者工具
  12. win10任务管理器中的专用GPU内存 vs 共享GPU内存
  13. 关于兔子吃萝卜问题,走一步吃个萝卜。
  14. php中errorreporting,php中error_reporting函数用法详解_PHP教程
  15. css 属性 calc 的使用
  16. ssm实现记住账号密码(cookie)
  17. 欢迎注册和登陆我们的学海灯塔
  18. RabbitMQ 安装与web后台管理界面开启
  19. mysql导入wps_WpS数据数据库导入
  20. 好消息!IBM技术商用 家乐福食品可追溯 商权让消费增值

热门文章

  1. 近期必读的5篇AI顶会CVPR 2020 GNN (图神经网络) 相关论文
  2. Ios文件连接dlna服务器,iOS播放多种视频格式,实现DLNA|AirPlay投射盒子总结
  3. SAP MM里的ERS功能不适用于供应商寄售采购模式
  4. SAP RETAIL 通过自动补货功能触发采购申请
  5. 这个登上Nature封面的群体学习,无需中央协调员比联邦学习更优秀
  6. LeNet5,AlexNet,MobileNet它们的前身你知道吗?
  7. 机器学习(1)特征选择与特征抽取
  8. 深度学习概述:从感知机到深度网络(找到一篇大牛的文章快围观)
  9. 吴恩达机器学习笔记 —— 1 绪论:初识机器学习
  10. SAP MM PO Item Category 内部code的用处?