博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5254 : [Fjwc2018]红绿灯
阅读量:6091 次
发布时间:2019-06-20

本文共 1186 字,大约阅读时间需要 3 分钟。

显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间。

将所有询问的时间模$g+r$,并按时间用set维护。

那么对于每个红灯,在set中可以找出$1$到$2$个区间,将里面所有的询问暴力取出,添加一个新点作为等到绿灯后的询问放入。

那么询问与新点之间构成了一棵树结构,每个询问实际的答案为它到根路径上所有点的答案之和。

时间复杂度$O(n\log n)$。

 

#include
#include
#include
using namespace std;typedef long long ll;typedef pair
P;const int N=150010;int n,m,i,f[N],q[N],cnt,tot;ll A,B,per,d[N],x,w[N],sum;bool v[N];set

T;inline void read(ll&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}ll dfs(int x){ if(v[x])return w[x]; return v[x]=1,w[x]+=dfs(f[x]);}inline void solve(ll L,ll R,ll K){ cnt=0; while(1){ set

::iterator it=T.lower_bound(P(L,0)); if(it==T.end())break; if(it->first>R)break; q[cnt++]=it->second; w[it->second]+=K-it->first; T.erase(it); } if(!cnt)return; tot++; for(int i=0;i

=per)solve(0,R%per,K-per);}int main(){ scanf("%d%lld%lld",&n,&A,&B); per=A+B; for(i=0;i<=n;i++)read(d[i]); scanf("%d",&m); for(i=1;i<=m;i++)read(w[i]),T.insert(P(w[i]%per,i)); for(tot=m,i=0;i<=n;i++){ sum+=d[i]; if(i

  

转载地址:http://zmlwa.baihongyu.com/

你可能感兴趣的文章
带空格文件名的处理(find xargs grep ..etc)
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
需要学的东西
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>