HDU 6232 2017 哈尔滨 Confliction
题意
数轴上有两个人,告诉你每个人的指令,即向左/右/不动维持多久,可以随意选择出发点,使得两人在整点位置的见面次数最多
题解
设时刻 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相关推荐
- 2017哈尔滨ACM CCPC-final 总结
本来不想写总结了,不过教练要求每场比赛都要写总结,那我就偷个懒把两个总结写一起吧 基本上是算退役赛了 两场比赛按照惯例都没打好,CCPCfinal铜尾,ICPCfinal铜首 这两年打下来,无数个银和 ...
- HDU 6183 2017广西邀请赛:Color it(线段树)
题目太长了就直接放链接吧 http://acm.hdu.edu.cn/showproblem.php?pid=6183 题意: 一个空的坐标系,有④种操作:①1 x y c表示在(x, y)点染上颜色 ...
- HDU 6134 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)
实在太长了直接放题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6134 这题就是求 考虑当Gcd(i, j)==1时,除了j为1的情况,其它时候i/j一 ...
- HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...
- 2017哈尔滨理工大学新生赛
A: 仔细读题ORZ A.涂山红十字会 Time Limit: 1000 MS Memory Limit: 256000 K Total Submit: 1121 (338 users) Total ...
- HDU 6184 2017广西邀请赛:Counting Stars(三元环)
题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...
- HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)
题意: 有一棵n个节点的树,每个节点都有一个值,m次查询,每次两个数x y表示以x为根的子树中哪个节点权值异或y得出的结果最大,求最大结果 离线 和线段树合并一样,在搜索过程中将多个字典树并在一起 每 ...
- HDU 6185 2017广西邀请赛:Covering(矩阵快速幂)
题意: 用1*2的骨牌铺满4*n的矩形总共有多种方法 经典题:可见骨牌铺方格的多种做法 因为宽只有4,考虑先求递推式,假设当前长度为x,有: ①长度为x-1的所有情况后面竖着放2个骨牌,f(x) += ...
- HDU 6188 2017广西邀请赛:Duizi and Shunzi
题意: 有n张牌,每张牌上都有一个不超过n的正整数,你可以选择三张数字连续的牌作为一个顺子,也可以选择两张数字一样的牌作为一个对子,现要让对子和顺子的数量之和尽可能多,求最大数量 先排序 因为对子只消 ...
- HDU 6186 2017广西邀请赛:CS Course
题意: n个数,m次查询,每次给出一个p,求出除了第p个数以外其它所有数的且和,或和,异或和 统计下每个二进制位1的数量,例如z[5] = x表示有x个数第5个二进制位为1 之后每次查询只要check ...
最新文章
- 在微服务架构中做机器学习,真的太难了
- MySql -- 数据结构
- window下ffmpeg的编译
- ThinkPHP 3.2.3 简单后台模块开发(一)常用配置
- TCP,UDP发送数据包大小浅析
- ⑥NuPlayer播放源码分析之DecoderBase分析
- 李迟2022年1月知识总结
- Scrum Meeting day 2
- 每日算法系列【LeetCode 128】最长连续序列
- 从嗤之以鼻到“奇迹” 前淘宝工程师详解12306技术
- 《优势教养》:开放式沟通vs负面偏见
- 计蒜客 - 蒜头君的任务
- 计算机中完成全选的快捷键,怎么全选-很实用!word中全选的快捷键介绍及使用方法...
- 进阶实验2-3.1 海盗分赃 (25 分)
- 多元回归分析(multiple regression)及其应用
- 读《消失的真实》有感
- RecyclerView添加下划线
- 以太坊P2P中Kad算法解析
- linux系统时间同步,硬件时钟和系统时间同步,时区的设置
- Nokia NBU备份文件查看工具(包含联系人和短信)