[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孙鑫>这个项目竟然就只有一天的时间,怎么可以这样,但是,我还是决 ...
随机推荐
- Java JDK环境变量如何配置?Java基础!
在了解什么是Java.Java 语言的特点以及学习方法之后,本节将介绍如何搭建编写 Java JDK环境变量如何配置,只有搭建了环境才能敲代码! 学Java的都知道,JDK 是一种用于构建在 Java ...
- 每日总结:Number&Math类(2021.10.4)
Java语言为每一个内置数据类型提供了对应的包装类. 所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类 其中Integer 对应的基 ...
- 深度剖析Redis6的持久化机制(大量图片说明,简洁易懂)
Redis的强劲性能很大程度上是由于它所有的数据都存储在内存中,当然如果redis重启或者服务器故障导致redis重启,所有存储在内存中的数据就会丢失.但是在某些情况下,我们希望Redis在重启后能够 ...
- 【技术博客】利用handler实现线程之间的消息传递
[技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...
- Prometheus之告警规则的编写
Prometheus之告警规则的编写 一.前置知识 二.需求 三.实现步骤 1.编写告警规则 2.修改prometheus.yml执行告警规则的位置 3.配置文件截图 4.页面上看告警数据信息 5.查 ...
- window系统上实现mongodb副本集的搭建
一.问题引出 假设我们生产上的mongodb是单实例在跑,如果此时发生网络发生问题或服务器上的硬盘发生了损坏,那么这个时候我们的mongodb就使用不了.此时我们就需要我们的mongodb实现高可用, ...
- linux中的strip命令简介
转载:https://blog.csdn.net/qq_37858386/article/details/78559490 strip:去除,剥去 一.下面是man strip获得到的信息,简 ...
- Python ValueError: Attempted relative import in non-package Relative import相对引用 错误
包含相对路径import的python脚本不能直接运行,只能作为module被引用. 例如 from . import mod1 有这样代码的文件只能最为moulule为不能直接运行.相对路径就是相对 ...
- Ubuntu virtualenv 创建 python3 虚拟环境 激活 退出
首先默认安装了virtualenv 创建python3虚拟环境 your-name@node-name:~/virtual_env$ virtualenv -p /usr/bin/python3 py ...
- Django 实现分页功能(django 2.2.7 python 3.7.5 )
Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能.本文就讲解如何使用 Paginator 实现分页功能. 一. Paginator Paginator 类的作用是将我们需 ...