题面

传送门(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;
}

洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)的更多相关文章

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

    传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里

  2. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  3. skkyk:题解 洛谷P3865 【【模板】ST表】

    我不会ST表 智推推到这个题 发现标签中居然有线段树..? 于是贸然来了一发线段树 众所周知,线段树的查询是log(n)的 题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你 ...

  4. 洛谷 P2880 [USACO07JAN]Balanced Lineup G (ST表模板)

    题意:给你一组数,询问\(q\)次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N ...

  5. 「ZJOI2018」胖(ST表+二分)

    「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...

  6. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

  7. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  8. 洛谷P4459/loj#2511 [BJOI2018]双人猜数游戏(博弈论)

    题面 传送门(loj) 传送门(洛谷) 题解 所以博弈论的本质就是爆搜么-- 题解 //minamoto #include<bits/stdc++.h> #define R registe ...

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

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

随机推荐

  1. 自己写着玩的一个天气APP

    打开的界面: 向上滑动,进入主界面: 省份界面: 城市界面: 加载天气界面: 显示天气界面: 侧滑,显示地区,然后根据天气来显示一首诗句(晴,多云,雪,雨什么的): 第一次启动App的时候才会加载数据 ...

  2. git用法小结(1)--建立远程仓库

    最近一直在学习使用git来管理自己的程序,总是今天东学一点,明天西凑一点,到用的时候,总是有些茫然不知所措. 在博客园里看见一篇老好的文章,教我们做笔记啦,但是做完笔记还是要记得总结哦! 来吧,让我们 ...

  3. s3c6410开发板LED驱动程序设计详细…

    2 下面来看看tiny6410关于LED的原理图如图(1)所示: 图1    LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c ...

  4. ubuntu 14.04 安装压缩包版mysql

    既有环境: 1)下载MySQL Community Server 5.6.17 压缩版(mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz) 2)安装目录: /opt/ ...

  5. RequestParam注解的Url参数被省略时该如何处理

    RequestParam注解的Url参数被省略时该如何处理 1.RequestParam的用法 ==================== RequestParam注解可以把包含在Url中的参数映射到U ...

  6. java StirngStringbufferStringbuild的区别

    java StirngStringbufferStringbuild的区别  String 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一旦创建, ...

  7. xcode找回欢迎界面

    [xcode找回欢迎界面] 有一次嫌xcode界面烦,点击了以下checkbox取消了欢迎界面: 随后发现没了欢迎界面反而更不方便,一心想找回欢迎界面,Preference里找了半天没找到开关,原来开 ...

  8. 【原创】5. MYSQL++ mysql_type_info类型

    该类型是SQLBuffer的灵魂,它用来表示从SQL TYPE到C++ TYPE的相互转变.该类型被定义在type_info.h中.在这个头文件中,其实定义了三个类型,其中前两个都是在mysql_ty ...

  9. 【bzoj1016】[JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4863  Solved: 1973[Submit][St ...

  10. php-fpm, nginx ,fastcgi ,php-cgi 关系粗解

    首先,CGI 是干什么的?  CGI 是为了保证web server传递过来的数据是标准格式.CGI  是个协议和 进程没什么关系. CGI 是http服务器于你的本机或者其他电脑上的程序交谈的一种工 ...