蚂蚁(ant)
【题目描述】
  小 R 种了一棵苹果树,这棵树上有 n 个节点(标号从 0 到 n-1),有 n-1 条树枝连接这
  n 个节点,这 n 个节点相互连通。每条树枝的长度为 1。
  苹果树上的每一个节点上生长着一个苹果,这个苹果散发着香味。在 0 时刻,第 i 个
  节点的苹果散发香味的浓郁度为 s[i],以后每过一个单位时间,香味的浓郁度就会增加 a[i]。
  苹果树上还有一只蚂蚁,在 0 时刻时,这只蚂蚁在 0 号节点,在第 i 时刻,它会朝着
  第 i 时刻时香味最浓郁的节点方向走 1 个单位长度。
  (如果两个节点的浓郁度相同,则标号
  较大的节点被认为是香味更浓郁的)
  。如果在第 i 时刻,蚂蚁所处的位置已经是香味最浓郁
  的节点了,那么它会选择在原地休息。
  现在,小 R 有 m 个问题,他想知道在第 t[i]个时刻蚂蚁的位置。
  【输入格式】
  第一行 2 个整数 n,m,表示点数和询问数。
  第二行 n 个整数,表示每个节点的初始香味浓郁度 s[i]。
  第三行 n 个整数,表示每个节点的香味浓郁度的增加值 a[i]。
  接下来 n-1 行,每行三个整数 s,t,表示 s 和 t 之间有一条边。
  最后一行 m 个整数,表示 m 个询问。
  【输出格式】
  对于每个询问输出一行答案,表示在 t[i]时刻蚂蚁的位置。
  【样例输入】
  3 4
  6 3 1
  0 6 7
  0 1
  0 2
  1 2 3 4
【样例输出】
  0
  1
  0
  2
【样例解释】
  在 0 时刻时,0 号节点的香味最浓郁,蚂蚁原地休息,因此在 1 时刻蚂蚁仍在 0 号点
  在 1 时刻时,1 号节点的香味最浓郁,蚂蚁向 1 号节点走去,因此在 2 时刻蚂蚁在 1 号点
  在 2 时刻时,2 号节点的香味最浓郁,蚂蚁向 2 号节点走去,因此在 3 时刻蚂蚁在 0 号点
  在 3 时刻时,2 号节点的香味最浓郁,蚂蚁向 2 号节点走去,因此在 4 时刻蚂蚁在 2 号点

【数据规模和约定】
  对于 100%的数据 n<=100000,m<=100000,0<=a[i]<=10^6,0<=s[i]<=10^15,0<=t[i]<=10^9

这个题我一开始傻逼的以为是一个动态点分治,然后打了一个暴力,准备拿来对拍;

打着打着发现这是一个半平面交啊,我迟疑了一下,说好的数据结构呢???怎么没有一题要打数据结构

但是在没有办法了,于是只能拿计算几何幼儿园级别的水平硬着头皮敲了一个半平面交+暴力转移,然后调了半天,各种细节

实在是调不出来,只能再次滚粗

考完之后出题人很震惊,说T1只要是个人都应该写得出来吧!!!

好吧其实的确是的,但不过对于这道很操的细节题我也是不想说话

大体思路是这样的:

苹果的香味是一个关于时间的一次函数(很显然吧)

然后其实是要求每一个时刻苹果香味最大的苹果在哪里,并向其移动

这就很像水平可见直线了,在每个直线能被看到的那段时间就表示是会向那个点移动

(注意还有一个与水平可见直线不一样的地方:交点必须在x轴正半轴,被坑了好久;)(貌似半平面交要加一堆特判???,我记得我的斜率优化不是这样的啊!!!)

然后我们考虑到t有10^9级别,那我们就不能暴力跳了,先把询问离线排序

接着我们可以在半平面交中找出所有转折点(直线的交点),然后两个交点的每一段分段处理

在每一段上用倍增快速跳.

附上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;
const int N=100050;
const int Inf=2147483647;
vector<int> p[N];
int f[N][18],deep[N],ans[N];
int n,m,u,v,t[N],tn;
struct data {
int id;
long long s,a;
} a[100100],qu[100100];
struct query {
int id,t;
} q[100100];
bool operator<(data a,data b) {
return a.a < b.a;
}
bool operator<(query a,query b) {
return a.t < b.t;
}
void dfs(int x) {
for (int i=0;i<p[x].size();i++)
if (f[p[x][i]][0]==-1) {
f[p[x][i]][0]=x;
deep[p[x][i]]=deep[x] + 1;
dfs(p[x][i]);
}
}
void pre_BZ() {
for (int i=1;i<n;i++) f[i][0]=-1;
f[0][0]=0;deep[0]=0;dfs(0);
for (int i=1;i<18;i++)
for (int j=0;j<n;j++)
f[j][i]=f[f[j][i-1]][i-1];
}
int lca(int a,int b) {
if (deep[a]>deep[b]) return lca(b,a);
for (int j=17;j>=0;j--)
if (deep[b]-(1<<j) >=deep[a])
b=f[b][j];
for (int j = 17;j >= 0;j--)
if (f[a][j] != f[b][j])
a=f[a][j],b=f[b][j];
if (a != b) return f[a][0];
return a;
}
int meeting(data &a,data &b) {
if (a.a == b.a) {
if (b.s>a.s||(b.s==a.s&&b.id>a.id)) return -1;
return Inf;
}
int ans = (a.s-b.s)/(b.a - a.a) + 1;
if ((a.s-b.s)%(b.a-a.a)==0&&b.id>a.id) ans--;
if (ans<0) return -1;
if (ans>Inf) return Inf;
return ans;
}
void BPMJ() {
sort(a,a+n);int tail=0,c1,c2;
for (int i=0;i<n;i++) {
while(tail>0) {
c1=meeting(qu[tail],a[i]);
if (c1<=0) {tail--;continue;}
if(tail>1){c2=t[tail-2];if(c2>=c1){tail--;continue;}}
break;
}
qu[++tail]=a[i];
if(tail>1) t[tail-2]=c1;
}
tn=tail-1;
}
int jump(int a,int l) {
for(int j=17;j>=0;j--)
if (l>=(1<<j)) {
a=f[a][j];
l-=(1 << j);
}
return a;
}
int move(int st,int ed,int t) {
int LCA=lca(st,ed);
int l1=deep[st]-deep[LCA];
int l2=deep[ed]-deep[LCA];
if (t<=l1) return jump(st,t);
if (t<=l1+l2) return jump(ed,l1+l2-t);
return ed;
}
int gi(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
void work(){
sort(q,q+m);int now=0,lastt=0,i=0,j=0;
while (j<m) {
if (t[i]<q[j].t&&i<tn) {
now=move(now,qu[i+1].id,t[i]-lastt);
lastt=t[i];i++;
}
else {
now=move(now,qu[i+1].id,q[j].t-lastt);
lastt=q[j].t;ans[q[j].id]=now;j++;
}
}
}
main() {
freopen("ant.in","r",stdin);
freopen("ant.out","w",stdout);
n=gi(),m=gi();
for(int i=0;i<n;i++) a[i].s=gi(),a[i].id=i;
for(int i=0;i<n;i++) a[i].a=gi();
for(int i=0;i<n-1;i++) {
int u=gi(),v=gi();
p[u].push_back(v);p[v].push_back(u);
}
for (int i=0;i<m;i++) q[i].t=gi(),q[i].id=i;
pre_BZ();BPMJ();work();
for (int i=0;i<m;i++) printf("%lld\n",ans[i]);
return 0;
}

Ryz的鬼题的更多相关文章

  1. 一道叉姐的AC自动机鬼题

    题面描述丢失了... 给n个串模板串,然后再给你m个串,对于这m个串的每个串,问在[L,R]的模板串中,在多少个串中出现过; 这题的正解是对于后m个串建AC自动机,然后离线,在fail树上树链求并. ...

  2. 鬼题Ghost [manacher]

    本题目来自five20的周末考试题. Description 给定一个 0/1 序列,求其中满足 " ⺉ " 性质的子串个数. " ⺉ " 性质解释: &quo ...

  3. SAC E#1 - 一道中档题 Factorial

    题目背景 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服 ...

  4. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  5. 【bzoj2456】 mode

    http://www.lydsy.com/JudgeOnline/problem.php?id=2456 (题目链接) 只看了一眼,直觉便告诉我这是水题.于是跟某码农打赌说10分钟做出来叫爸爸,结果输 ...

  6. [bzoj 2159]Crash的文明世界

    今天看到一个鬼题 心情好的时候写 [题意]求树上所有点对距离的k次方和,所有边权为1 大爷方的题解:http://tonyfang.is-programmer.com/posts/204972.htm ...

  7. BZOJ 3786 星系探索

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  8. HDU1829(种类并查集)

    ps:本来是想找个二分图判断的题来写,结果百度到这鬼题 Problem Description Background Professor Hopper is researching the sexua ...

  9. bzoj 5016: [Snoi2017]一个简单的询问

    Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...

随机推荐

  1. Less的Mixin

    什么是Mixin Less中,允许你将一个类嵌入到另一个类中,被嵌入的类也可以看作变量.换句话说,你可以用一个类定义样式,然后把它当作变量,在另一个类中,只要引用变量的名字,就能使用它的所有属性, L ...

  2. 最强离线安装MySQL_8.0.2方法

    最强离线安装MySQL_8.0.2方法,一次就能安装成功. 按照此方式,离线安装MySQL五分钟都花不到,节省了大量的宝贵时间. 前戏,假设你已经从MySQL官网中获取了下面这个压缩包: 解压之后变成 ...

  3. Android 软键盘的显示和隐藏,这样操作就对了

    一.前言 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文会讲讲弹出和收起软键盘的一些细节,最终还会从源码进行分析. 想要操作软键盘,需要使用到 InputMetho ...

  4. java自动生成entity文件

    网上关于自动生成entity文件的代码很多,看了很多代码后,在先辈们的基础上再完善一些功能(指定多个表,全部表). 为了使用方便所以把两个类写在一个java文件中,所以大家可以直接拿这个java文件, ...

  5. Spring Cloud 之 Ribbon

    新建Spring Boot工程,命名为ribbon 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"? ...

  6. 修复mysql表

    1>用"repair table"方式修复语法:repair table 表名 [选项]选项如下:QUICK 用在数据表还没被修改的情况下,速度最快EXTENDED 试图去恢 ...

  7. 网页设计——3.html运行原理,基本标签

    一.运行原理 (1)本地运行 自己写的html网页用电脑上浏览器打开,就是实现了本地运行. 可以把浏览器当成一个软件,可以打开html文件. (2)远程访问 远程访问就是你用自己电脑在网上浏览一些网站 ...

  8. Netty4 学习笔记之三:粘包和拆包

    前言 在上一篇Netty 心跳 demo 中,了解了Netty中的客户端和服务端之间的心跳.这篇就来讲讲Netty中的粘包和拆包以及相应的处理. 名词解释 粘包: 会将消息粘粘起来发送.类似吃米饭,一 ...

  9. bzoj4974 字符串大师

    4974: 字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 310  Solved: 155[Submit][Status][Discuss] ...

  10. Java爬虫——模拟登录知乎

    登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...