人的移动之间会相互影响,因此不妨看成果树逆时针移动,显然果树之间独立

考虑建图: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]收获的更多相关文章

  1. 读一篇Javascript问题贴的收获

    遇到这篇文章<Javascript异步调用时,回调函数内用到了函数外的变量>,是缘于我在<难道这就是JavaScript中的"闭包">文章中遇到的问题时,B ...

  2. 技能收获与C语言学习

    你有什么技能比大多人(超过90%以上)更好? 我会的东西很多,喜欢的东西太多,但是很遗憾广而不专,会而不精.学了很多东西我都是为了娱乐,因为以前我们那里过于强调学习,很多爱好也都被扼杀在摇篮里.我觉得 ...

  3. C#中精确计时的一点收获 【转】

    C#中精确计时的一点收获 [转] 以下所有代码运行环境:Windows 2003, Intel(R) Core(TM) 2 Duo CPU E8400 @  3.00GHz 2.99GHz,2.96G ...

  4. 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一

    细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework        ADO.NET Entity Framework 是微软以 ADO.N ...

  5. 由 excel 转换为 markdown,及收获

    由 excel 转换为 markdown,及收获 1 问题 构建之法(现代软件工程)东北师大站[http://www.cnblogs.com/younggift/]的每周学生作业成绩,执行教学团队[h ...

  6. c#多态之抽象类与接口的一点收获~~

    多态之抽象类与接口的相似点及不同点,刚学习的一点收获,或许不是很完整,借鉴看视频及一些被人写的文章自己写的下的一些心得!以便之久复习使用! 一.抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成 ...

  7. Java程序员的日常 —— 工作一天的收获

    看题目可能是扯皮,其实还是有很多专业知识的.从最开始没有注意到设计原则,到后面的jquery实战技巧,都是今天一天碰到的问题. 每天整理一点点,每天收获一点点. 关于软件设计 在设计系统结构的时候,一 ...

  8. Z-XML团队 软件工程课之我感我思我收获

    <软件工程>这门课像我们的诤友,不断督促我们前进,又不断指引我们收获.时间飞逝,我们Z-XML团队一个个完成了课程中的所有任务,一步步走到了期末年末. 走的远了,也该回头看看.全员7人回顾 ...

  9. Html的一点点收获

    结束了牛腩,总结了自己的收获,我开始了征战HTML的计划,在看<提高班培养计划>的时候,我很诧异,因为<HTML孙鑫>这个项目竟然就只有一天的时间,怎么可以这样,但是,我还是决 ...

随机推荐

  1. 使用CEF(二)— 基于VS2019编写一个简单CEF样例

    使用CEF(二)- 基于VS2019编写一个简单CEF样例 在这一节中,本人将会在Windows下使用VS2019创建一个空白的C++Windows Desktop Application项目,逐步进 ...

  2. 山顶点提取(ArcPy实现)

    一.背景 山顶点指哪些在特定邻域分析范围内,该点都比周围点高的区域.山顶点是地形的重要特征点,它的分布与密度反映了地貌的发育特征,同时也制约着地貌发育.因此,如何基于DEM数据正确有效的提取山顶点,在 ...

  3. FastAPI 学习之路(十八)表单与文件

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  4. pycharm中的terminal和Windows命令提示符有什么区别?二者用pip安装的包是不是位于相同位置?

    那要看pycharm使用了什么shell,可以在设置->工具->终端里查看shell path.如果使用的是cmd.exe那就没区别.pycharm终端和Windows命令提示符用pip安 ...

  5. OO课第三单元总结

    一.梳理JML语言的理论基础 (1)理论基础 JMl的出现很大程度上一为了行为接口的规范化,用这种语言来指定特定模块的特定功能.JML的核心部分分为三个部分:前置条件(requires).后置条件(e ...

  6. 单片机I/O口推挽与开漏输出详解(力荐)

    推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...

  7. 数列极限计算中运用皮亚诺Taylor展开巧解

    这是讲义里比较精华的几个题目,今晚翻看也是想到了,总结出来(处理k/n2形式). 推广式子如下: 例题如下:

  8. 攻防世界 杂项 9.a_good_idea

    题目描述: 汤姆有个好主意 解题思路: 首先按照隐写思路找了一下没找到flag,接着使用winhex打开图片,发现图片里面又包含了一张图片,然后马上改了一下后缀为zip, 解压后发现里面有:hint. ...

  9. Go语言核心36讲(Go语言进阶技术十一)--学习笔记

    17 | go语句及其执行规则(下) 知识扩展 问题 1:怎样才能让主 goroutine 等待其他 goroutine? 我刚才说过,一旦主 goroutine 中的代码执行完毕,当前的 Go 程序 ...

  10. std::string类详解

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...