[loj3278]收获
人的移动之间会相互影响,因此不妨看成果树逆时针移动,显然果树之间独立
考虑建图:1.每一棵果树向其逆时针旋转后第一个人连边;2.每一个人向其逆时针旋转不小于$C$的第一个人连边(即下一个摘的人),边权都为两点逆时针的距离
根据这张有向图,每一棵树对答案的贡献从这棵果树即不断移动(直至距离之和大于$t$),经过$k$的次数
暴力复杂度仍然过高,由于每一个人有且仅有1条出边,因此必然构成了一张基环内向树森林
将询问离线存储在节点上,对于询问点分类讨论:
1.不在环上,那么即维护子树内果树深度、查询子树中比$t$小的点,线段树维护即可
2.在环上,任取一点$r$,并断开其出边,即以$r$为根建树
对于每一棵果树,在其走到$r$之前可以看作一棵树,处理方法与不在环上相同
在$r$上记录每一棵果树第一次到$r$的时间$t_{i}$,假设$r$到$k$距离为$l'$,环长为$len$,答案即$\sum \max(\lfloor\frac{t-t_{i}-l'+len}{len}\rfloor,0)$
不妨令$t'=t-l'+len$,那么$\lfloor\frac{t'-t_{i}}{len}\rfloor=\lfloor\frac{t'}{len}\rfloor-\lfloor\frac{t_{i}}{len}\rfloor-[(t'\ mod\ len)<(t_{i}\ mod\ len)]$,前两个都为定值(注意第一个还要乘上果树个数),对最后一个式子维护即可
还有一个问题,如果$t'<t_{i}$如何处理,可以先将$t'$和$t_{i}$排序,然后利用单调性仅插入小于$t'$的$t_{i}$即可
时间复杂度为$o(n\log_{2}n)$,可以通过
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 400005
4 #define ll long long
5 #define oo (ll)1e16
6 #define fi first
7 #define se second
8 #define mid (l+r>>1)
9 struct ji{
10 int nex,to,len;
11 }edge[N];
12 vector<ll>vl;
13 vector<pair<ll,int> >vq,v[N];
14 int V,E,rt,n,m,q,x,a[N],b[N],head[N],vis[N],fa[N],dfn[N],ls[N*50],rs[N*50],f[N*50];
15 ll t,len,sh[N],ans[N];
16 void update(int &k,ll l,ll r,ll x){
17 if (!k){
18 k=++V;
19 f[k]=ls[k]=rs[k]=0;
20 }
21 f[k]++;
22 if (l==r)return;
23 if (x<=mid)update(ls[k],l,mid,x);
24 else update(rs[k],mid+1,r,x);
25 }
26 int query(int k,ll l,ll r,ll x,ll y){
27 if ((!k)||(l>y)||(x>r))return 0;
28 if ((x<=l)&&(r<=y))return f[k];
29 return query(ls[k],l,mid,x,y)+query(rs[k],mid+1,r,x,y);
30 }
31 void add(int x,int y,int z){
32 edge[E].nex=head[x];
33 edge[E].to=y;
34 edge[E].len=z;
35 head[x]=E++;
36 }
37 void dfs1(int k,int st){
38 if (vis[k]){
39 if (k==st)x=1;
40 return;
41 }
42 vis[k]=1;
43 for(int i=head[k];i!=-1;i=edge[i].nex)dfs1(edge[i].to,st);
44 }
45 void dfs2(int k,ll s,int st){
46 if ((s)&&(k==st)){
47 len=s;
48 return;
49 }
50 sh[k]=s;
51 for(int i=0;i<v[k].size();i++)ans[v[k][i].se]-=query(rt,0,oo,0,min(v[k][i].fi+s,oo));
52 if (k>n){
53 vl.push_back(s);
54 update(rt,0,oo,s);
55 }
56 for(int i=head[k];i!=-1;i=edge[i].nex){
57 fa[edge[i].to]=k;
58 dfs2(edge[i].to,s+edge[i].len,st);
59 }
60 for(int i=0;i<v[k].size();i++)ans[v[k][i].se]+=query(rt,0,oo,0,min(v[k][i].fi+s,oo));
61 }
62 int main(){
63 int l,c;
64 scanf("%d%d%d%d",&n,&m,&l,&c);
65 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
66 for(int i=1;i<=m;i++)scanf("%d",&b[i]);
67 scanf("%d",&q);
68 for(int i=1;i<=q;i++){
69 scanf("%d%lld",&x,&t);
70 v[x].push_back(make_pair(t,i));
71 }
72 for(int i=1;i<=n;i++)sort(v[i].begin(),v[i].end());
73 memset(head,-1,sizeof(head));
74 for(int i=1;i<=m;i++)
75 if (a[1]>b[i])add(n,i+n,(b[i]+l-a[n])%l);
76 else{
77 x=lower_bound(a+1,a+n+1,b[i])-a-1;
78 add(x,i+n,b[i]-a[x]);
79 }
80 for(int i=1;i<=n;i++){
81 x=((a[i]-c)%l+l)%l;
82 if (a[1]>x)add(n,i,c+(x+l-a[n])%l);
83 else{
84 int y=upper_bound(a+1,a+n+1,x)-a-1;
85 add(y,i,c+x-a[y]);
86 }
87 }
88 for(int i=1;i<=n+m;i++)
89 if (!vis[i]){
90 x=0;
91 dfs1(i,i);
92 if (x){
93 V=rt=0;
94 vl.clear();
95 dfs2(i,0,i);
96 sort(vl.begin(),vl.end());
97 vq.clear();
98 for(int j=0;j<v[i].size();j++)vq.push_back(v[i][j]);
99 for(int j=fa[i];j!=i;j=fa[j])
100 for(int k=0;k<v[j].size();k++)
101 vq.push_back(make_pair(v[j][k].fi+sh[j],v[j][k].se));
102 sort(vq.begin(),vq.end());
103 V=rt=t=0;
104 for(int j=0,k=0;j<vq.size();j++){
105 while ((k<vl.size())&&(vl[k]<vq[j].fi)){
106 t+=vl[k]/len;
107 update(rt,0,len,vl[k++]%len);
108 }
109 ans[vq[j].se]+=vq[j].fi/len*vl.size()-t-query(rt,0,len,vq[j].fi%len+1,len);
110 }
111 }
112 }
113 for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
114 }
[loj3278]收获的更多相关文章
- 读一篇Javascript问题贴的收获
遇到这篇文章<Javascript异步调用时,回调函数内用到了函数外的变量>,是缘于我在<难道这就是JavaScript中的"闭包">文章中遇到的问题时,B ...
- 技能收获与C语言学习
你有什么技能比大多人(超过90%以上)更好? 我会的东西很多,喜欢的东西太多,但是很遗憾广而不专,会而不精.学了很多东西我都是为了娱乐,因为以前我们那里过于强调学习,很多爱好也都被扼杀在摇篮里.我觉得 ...
- C#中精确计时的一点收获 【转】
C#中精确计时的一点收获 [转] 以下所有代码运行环境:Windows 2003, Intel(R) Core(TM) 2 Duo CPU E8400 @ 3.00GHz 2.99GHz,2.96G ...
- 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework ADO.NET Entity Framework 是微软以 ADO.N ...
- 由 excel 转换为 markdown,及收获
由 excel 转换为 markdown,及收获 1 问题 构建之法(现代软件工程)东北师大站[http://www.cnblogs.com/younggift/]的每周学生作业成绩,执行教学团队[h ...
- c#多态之抽象类与接口的一点收获~~
多态之抽象类与接口的相似点及不同点,刚学习的一点收获,或许不是很完整,借鉴看视频及一些被人写的文章自己写的下的一些心得!以便之久复习使用! 一.抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成 ...
- Java程序员的日常 —— 工作一天的收获
看题目可能是扯皮,其实还是有很多专业知识的.从最开始没有注意到设计原则,到后面的jquery实战技巧,都是今天一天碰到的问题. 每天整理一点点,每天收获一点点. 关于软件设计 在设计系统结构的时候,一 ...
- Z-XML团队 软件工程课之我感我思我收获
<软件工程>这门课像我们的诤友,不断督促我们前进,又不断指引我们收获.时间飞逝,我们Z-XML团队一个个完成了课程中的所有任务,一步步走到了期末年末. 走的远了,也该回头看看.全员7人回顾 ...
- Html的一点点收获
结束了牛腩,总结了自己的收获,我开始了征战HTML的计划,在看<提高班培养计划>的时候,我很诧异,因为<HTML孙鑫>这个项目竟然就只有一天的时间,怎么可以这样,但是,我还是决 ...
随机推荐
- 七牛云的 python sdk 是如何 批量删除资源的
今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码 这里做一下简单的记录 from qiniu imp ...
- 免费 CDN 玩法 —— 文件一键上传到 NPM
前言 unpkg.jsdelivr 等站点可加速 NPM 包文件,适合作为个人网站或演示案例的免费 CDN. 虽然上传文件到 NPM 很简单,创建 package.json 然后 npm publis ...
- MySQL:基础语法-2
MySQL:基础语法-2 记录一下 MySQL 基础的一些语法,便于查询,该部分内容主要是参考:bilibili 上 黑马程序员 的课程而做的笔记,由于时间有点久了,课程地址忘记了 上文MySQL:基 ...
- the Agiles Scrum Meeting 5
会议时间:2020.4.13 20:00 1.每个人的工作 今天已完成的工作 增量组:完成了增量开发的基础工作,初步完成了自动评测机制 issues:增量组:准备评测机制,增加仓库自动创建和管理 完善 ...
- Spring Cloud Alibaba 的服务注册与发现
Spring Cloud Alibaba 服务发现例子 一.需求 1.提供者完成的功能 2.消费者完成的功能 3.可以附加的额外配置 二.实现步骤 1.总的依赖引入 2.服务提供者和发现者,引入服务发 ...
- java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情.那么什么时候可能出现这种情况呢.比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就 ...
- 链地址法查找成功与不成功的平均查找长度ASL
晚上,好像是深夜了,突然写到这类题时遇到的疑惑,恰恰这个真题只让计算成功的ASL,但我想学一下不成功的计算,只能自己来解决了,翻了李春葆和严蔚敏的教材没有找到相关链地址法的计算,于是大致翻到两篇不错的 ...
- nodejs:使用puppeteer在服务器中构建一个获取电影电视剧剧集的接口
首先我们看下数据来源: 来源于这个网站:https://z1.m1907.cn/ 可以说这个网站上能找到很多你想看的很多电影或电视剧,最重要的是很多电影电视剧在别的网站是收费的,但是在这里看是免费的, ...
- (三)FastDFS 高可用集群架构学习---Client 接口开发
一.Python3 与 FastDFS 交互 1.安装 py3fdfs模块 # pip3 install py3Fdfs 2.测试使用 py3Fdfs 与 Fastdfs 集群交互(上传文件) fro ...
- ffmpeg第7篇:数据流选择神器-map指令
自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ...