[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孙鑫>这个项目竟然就只有一天的时间,怎么可以这样,但是,我还是决 ...
随机推荐
- Apache ShardingSphere 元数据加载剖析
唐国城 小米软件工程师,主要负责 MIUI 浏览器服务端研发工作.热爱开源,热爱技术,喜欢探索,热衷于研究学习各种开源中间件,很高兴能参与到 ShardingSphere 社区建设中,希望在社区中努力 ...
- SpringBoot-语言国际化
在resouce下新建i18ni18n 类似的还有k8s在i18n下新建signIn.properties再新建 signIn_zh_CN.properties此时,iden会帮助合并: 现在可以在这 ...
- CSS绘制三角的小技巧
网页中常见一些三角形,使用css直接画出来就可以,不必做成图片或者字体图标当把一个盒子的高和宽的长度都设置为0,并且分别指定边框样式时,就会得到以下图形: 受此启发,可以知道三角是如何制作的(想要保留 ...
- python json中的 dumps loads函数
一.概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行js ...
- 跟着老猫一起来学GO,环境搭建
老猫的GO学习系列博客已经正式发车了,相信大家以前学习一门编程语言的时候也有经验,咱们一般都是从环境开始,在此呢,大家也跟着老猫从最开始的搭建环境开始. GO语言的安装 首先呢,我们开始需要下载GO语 ...
- 航胥:北航教务助手——Alpha阶段发布声明
本软件项目为北京航空航天大学2020年"软件工程"课程项目 v1.0.5版本下载地址:https://bhpan.buaa.edu.cn:443/#/link/D10B71B69E ...
- (数据科学学习手札129)geopandas 0.10版本重要新特性一览
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...
- Prometheus监控Canal
Prometheus监控Canal 一.背景 二.实现步骤 1.修改prometheus.yml配置文件 2.启动prometheus 3.查看prometheus是否成功接入canal 4.cana ...
- Noip模拟6 2021.6.10
T1 辣鸡 首先吐嘈一下,这题的测试点就离谱,不说了,附上我65分代码: 1 #include<bits/stdc++.h> 2 #define int long long 3 using ...
- Spring Boot 2.5.0 重新设计的spring.sql.init 配置有何用?
前几天Spring Boot 2.5.0发布了,其中提到了关于Datasource初始化机制的调整,有读者私信想了解这方面做了什么调整.那么今天就要详细说说这个重新设计的配置内容,并结合实际情况说说我 ...