[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孙鑫>这个项目竟然就只有一天的时间,怎么可以这样,但是,我还是决 ...
随机推荐
- Spring Bean装配笔记
Spring Bean装配笔记 Spring中的Bean是一个很重要的概念.Spring作为一个Bean容器,它可以管理对象和对象之间的依赖关系,我们不需要自己建立对象,把这部分工作全部转交给容器完成 ...
- PAT (Basic Level) Practice (中文)1007 素数对猜想 (20分)
1007 素数对猜想 (20分) 让我们定义dn为:dn = pn+1 − pn,其中pi是第i个素数.显然有d1 = 1,且对于n > 1有dn是偶数."素数对猜想"认 ...
- UI BLOCK自定义枚举控件的宽度
三步: 1.修改PresentationStyle属性为Radio Box 2.修改NumberOfColumns属性为指定的宽度(显示字符的个数) 3.将PresentationStyle属性改回O ...
- Qt学习-模仿Qt实现一个colorbutton
1.mycolorbutton.h #include<QToolButton> #include<QtGlobal> #include<QColor> class ...
- 计算机网络传输层之TCP流量控制
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105531547 学习课程:<2019王道考研计算机网络> 学习目的 ...
- Python import commands ImportError: No module named 'commands'
ImportError: No module named 'commands' 在Python3中执行shell脚本,想要获取其执行状态和标准输出.错误输出 的数据,遇到这个错误,原因是command ...
- Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused
zabbix 监控连接失败 1.查看配置文件端口,server端口10051开启正常,agent端10050开启正常 2.查看/var/log/zabbix/zabbix_server.log./va ...
- 面试题系列:用了这么多年的 Java 泛型,我竟然只知道它的皮毛
面试题:说说你对泛型的理解? 面试考察点 考察目的:了解求职者对于Java基础知识的掌握程度. 考察范围:工作1-3年的Java程序员. 背景知识 Java中的泛型,是JDK5引入的一个新特性. 它主 ...
- testNG安装与使用
1.Eclipse集成TestNG插件 a.下载TestNG离线插件并解压得到features和plugins两个文件夹: b.将features文件下的org.testng.eclipse_6.9. ...
- Qt 窗口阴影效果的实现
前言 今天正好搞一下窗口的阴影,发现一篇文章写的真是不错.毫不犹豫滴转过来了,感谢作者分享. 转自:http://blog.sina.com.cn/s/blog_a6fb6cc90101eoop.ht ...