题意

数轴上有两个人,告诉你每个人的指令,即向左/右/不动维持多久,可以随意选择出发点,使得两人在整点位置的见面次数最多

题解

设时刻 iii ,aaa 的位置为 A[i]=A[i−1]+Ra[i]A[i]=A[i-1]+R_a[i]A[i]=A[i−1]+Ra​[i] ,bbb 的位置为 B[i]=B[i−1]+Rb[i]B[i]=B[i-1]+R_b[i]B[i]=B[i−1]+Rb​[i]
相距 D[i]=A[i]−B[i]D[i]=A[i]-B[i]D[i]=A[i]−B[i]
显然,见面次数最多,就是 D[i]D[i]D[i] 中出现频率最高的数的个数
对于 D[i]D[i]D[i] ,最多有 2N2N2N 个转折点,每个转折点有可能为五种
0,1,−1,2,−20,1,-1,2,-20,1,−1,2,−2
针对这5种情况,就知道相邻指令之间经过的距离的范围了,相当于对于距离进行区间覆盖,最后前缀和,找最大的数

注意要分奇偶
因为,对于 0,1,−10,1,-10,1,−1 距离都是连续覆盖的,但是,对于 2,−22,-22,−2 来说,是隔一个覆盖一个距离,而题目要求在整点位置见面才算数,所以,间隔的距离是不能统计的,比如相邻指令经过的距离为 3,5,7,93,5,7,93,5,7,9 显然不能对 [3,9][3,9][3,9]进行覆盖,因为 2,4,6,82,4,6,82,4,6,8 不能算是出现过
分奇偶,只需要对 1,−11,-11,−1 的情况,拆成两个进行覆盖即可

代码

#include<bits/stdc++.h>
#define N 400010
#define INF 0x3f3f3f3f
#define eps 1e-5
#define pi 3.141592653589793
#define mod 1000000007
#define P 1000000007
#define LL long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
// #define lb lower_bound
#define ub upper_bound
#define bug(x) cerr<<#x<<"      :   "<<x<<endl
#define mem(x,y) memset(x,0,sizeof(int)*(y+3))
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;int n,m;
struct node{LL x,y;
}A[N],B[N];
LL q[N],a[2][N],b[2][N],c[2][N],d[N],w[2][N];
int s[2],r[2];
void update(LL x,LL y,LL d,int k){int t=x&1;a[t][++s[t]]=x; b[t][s[t]]=y; w[t][++r[t]]=x; w[t][++r[t]]=y;if (d==0) c[t][s[t]]=q[k+1]-q[k];else c[t][s[t]]=1;
}int main()
{int T; sc(T);while(T--){int cnt=1; q[1]=0;sc(n); for(int i=1;i<=n;i++) scanf("%lld%lld",&A[i-1].y,&A[i].x),A[i].x+=A[i-1].x,q[++cnt]=A[i].x;sc(m); for(int i=1;i<=m;i++) scanf("%lld%lld",&B[i-1].y,&B[i].x),B[i].x+=B[i-1].x,q[++cnt]=B[i].x;sort(q+1,q+cnt+1);cnt=unique(q+1,q+cnt+1)-q-1;LL dis=3e18; r[0]=r[1]=s[0]=s[1]=0; int la=0,lb=0,fa,fb;A[cnt].y=B[cnt].y=0; q[cnt+1]=q[cnt]+1;for(int i=1;i<=cnt;i++){if (A[la].x==q[i]) fa=A[la++].y;else fa=A[la-1].y;if (B[lb].x==q[i]) fb=B[lb++].y;else fb=B[lb-1].y;LL x,y,t=q[i+1]-q[i];if(fa==fb) update(dis,dis+2,0,i);  elseif(fa-1==fb){x=dis;y=dis+t;  dis+=t;update(x,(t&1)+y,1,i);update(x+1,y+1-(t&1),1,i);}elseif(fa+1==fb){x=dis-(t-1); y=dis+1; dis-=t;update(x,(t&1)+y,1,i);update(x+1,y+1-(t&1),1,i);}elseif(fa-2==fb){x=dis;y=dis+t*2;  dis+=t*2;update(x,y,1,i);}elseif(fa+2&&fb){x=dis-t*2+2; y=dis+2; dis-=t*2;update(x,y,1,i);}}LL ans=0;for(int j=0;j<2;j++){sort(w[j]+1,w[j]+1+r[j]);r[j]=unique(w[j]+1,w[j]+1+r[j])-w[j]-1;for(int i=1;i<=r[j];i++) d[i]=0;for(int i=1;i<=s[j];i++){int x=lower_bound(w[j]+1,w[j]+r[j]+1,a[j][i])-w[j],y=lower_bound(w[j]+1,w[j]+r[j]+1,b[j][i])-w[j];d[x]+=c[j][i];d[y]-=c[j][i];}for(int i=1;i<=r[j];i++) d[i]+=d[i-1],ans=max(ans,d[i]);}printf("%lld\n",ans);}return 0;
}

HDU 6232 2017 哈尔滨 Confliction相关推荐

  1. 2017哈尔滨ACM CCPC-final 总结

    本来不想写总结了,不过教练要求每场比赛都要写总结,那我就偷个懒把两个总结写一起吧 基本上是算退役赛了 两场比赛按照惯例都没打好,CCPCfinal铜尾,ICPCfinal铜首 这两年打下来,无数个银和 ...

  2. HDU 6183 2017广西邀请赛:Color it(线段树)

    题目太长了就直接放链接吧 http://acm.hdu.edu.cn/showproblem.php?pid=6183 题意: 一个空的坐标系,有④种操作:①1 x y c表示在(x, y)点染上颜色 ...

  3. HDU 6134 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)

    实在太长了直接放题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6134 这题就是求 考虑当Gcd(i, j)==1时,除了j为1的情况,其它时候i/j一 ...

  4. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  5. 2017哈尔滨理工大学新生赛

    A: 仔细读题ORZ A.涂山红十字会 Time Limit: 1000 MS Memory Limit: 256000 K Total Submit: 1121 (338 users) Total ...

  6. HDU 6184 2017广西邀请赛:Counting Stars(三元环)

    题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...

  7. HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)

    题意: 有一棵n个节点的树,每个节点都有一个值,m次查询,每次两个数x y表示以x为根的子树中哪个节点权值异或y得出的结果最大,求最大结果 离线 和线段树合并一样,在搜索过程中将多个字典树并在一起 每 ...

  8. HDU 6185 2017广西邀请赛:Covering(矩阵快速幂)

    题意: 用1*2的骨牌铺满4*n的矩形总共有多种方法 经典题:可见骨牌铺方格的多种做法 因为宽只有4,考虑先求递推式,假设当前长度为x,有: ①长度为x-1的所有情况后面竖着放2个骨牌,f(x) += ...

  9. HDU 6188 2017广西邀请赛:Duizi and Shunzi

    题意: 有n张牌,每张牌上都有一个不超过n的正整数,你可以选择三张数字连续的牌作为一个顺子,也可以选择两张数字一样的牌作为一个对子,现要让对子和顺子的数量之和尽可能多,求最大数量 先排序 因为对子只消 ...

  10. HDU 6186 2017广西邀请赛:CS Course

    题意: n个数,m次查询,每次给出一个p,求出除了第p个数以外其它所有数的且和,或和,异或和 统计下每个二进制位1的数量,例如z[5] = x表示有x个数第5个二进制位为1 之后每次查询只要check ...

最新文章

  1. 在微服务架构中做机器学习,真的太难了
  2. MySql -- 数据结构
  3. window下ffmpeg的编译
  4. ThinkPHP 3.2.3 简单后台模块开发(一)常用配置
  5. TCP,UDP发送数据包大小浅析
  6. ⑥NuPlayer播放源码分析之DecoderBase分析
  7. 李迟2022年1月知识总结
  8. Scrum Meeting day 2
  9. 每日算法系列【LeetCode 128】最长连续序列
  10. 从嗤之以鼻到“奇迹” 前淘宝工程师详解12306技术
  11. 《优势教养》:开放式沟通vs负面偏见
  12. 计蒜客 - 蒜头君的任务
  13. 计算机中完成全选的快捷键,怎么全选-很实用!word中全选的快捷键介绍及使用方法...
  14. 进阶实验2-3.1 海盗分赃 (25 分)
  15. 多元回归分析(multiple regression)及其应用
  16. 读《消失的真实》有感
  17. RecyclerView添加下划线
  18. 以太坊P2P中Kad算法解析
  19. linux系统时间同步,硬件时钟和系统时间同步,时区的设置
  20. Nokia NBU备份文件查看工具(包含联系人和短信)

热门文章

  1. der解码规则_DER 编码规范理解
  2. bed格式转vcf格式
  3. 基于Perclos&改进YOLOv7的疲劳驾驶DMS检测系统(源码&教程)
  4. 使用ftp访问资源管理器托拽文件下载出现“当前的安全设置不允许从该位置下载文件”提示
  5. Windows Hello安装和体验
  6. lua能解决php什么问题,我们能用lua做什么
  7. 虚拟机安装panabit详细图解
  8. csdn 修改博客皮肤
  9. Win7系统ip地址配置错误网络无法连接的解决办法
  10. redis 返回 key 的剩余的过期时间(RedisTemplate封装PTTL 命令)