A. The King's Race

签.

 #include <bits/stdc++.h>
using namespace std; #define ll long long
ll n, x, y; ll f(ll a, ll b)
{
return max(abs(a - x), abs(b - y));
} int main()
{
while (scanf("%lld%lld%lld", &n, &x, &y) != EOF)
{
puts(f(, ) <= f(n, n) ? "White" : "Black");
}
return ;
}

B. Taxi drivers and Lyft

签.

 #include <bits/stdc++.h>
using namespace std; #define N 100010
int n, m;
struct node
{
int x, t, id, small, big, small_pos, big_pos;
}a[N << ];
int ans[N]; int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(ans, , sizeof ans);
for (int i = , x; i <= n + m; ++i)
{
scanf("%d", &x);
a[i].x = x;
}
for (int i = , tmp = , t; i <= n + m; ++i)
{
scanf("%d", &t);
a[i].t = t;
if (t == )
a[i].id = ++tmp;
}
int Max = -((int)1e9 + ), pos = -;
for (int i = ; i <= n + m; ++i)
{
if (a[i].t == )
{
Max = a[i].x;
pos = a[i].id;
}
else
{
a[i].small = Max;
a[i].small_pos = pos;
}
}
int Min = (int)2e9 + ; pos = -;
for (int i = n + m; i >= ; --i)
{
if (a[i].t == )
{
Min = a[i].x;
pos = a[i].id;
}
else
{
a[i].big = Min;
a[i].big_pos = pos;
}
}
for (int i = ; i <= n + m; ++i) if (a[i].t == )
{
int A = abs(a[i].x - a[i].small), B = abs(a[i].x - a[i].big);
if (A <= B) ++ans[a[i].small_pos];
else ++ans[a[i].big_pos];
}
for (int i = ; i <= m; ++i)
printf("%d%c", ans[i], " \n"[i == m]);
}
return ;
}

C. The Tower is Going Home

Solved.

题意:

要从$(1, 1) 走到(1e9, *)$

$有一些横着和竖着的栏杆挡着,每次只能移动到曼哈顿距离为1的格子$

$求最小的需要去掉的栏杆的数量,使得可以到达目的地$

思路:

考虑横着的栏杆,$如果左端点不是1,那么该栏杆没有用$

$那么考虑从左到右扫一遍,竖着的栏杆按顺序去掉后$

$右端点没有超过该竖着栏杆的横栏杆,该横栏杆也没有用$

更新答案即可

 #include <bits/stdc++.h>
using namespace std; #define N 100010
int n, m, q;
int a[N], b[N]; int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d", a + i);
sort(a + , a + + n);
q = ;
for (int i = , x1, x2, y; i <= m; ++i)
{
scanf("%d%d%d", &x1, &x2, &y);
if (x1 == ) b[++q] = x2;
}
sort(b + , b + + q);
int res = q;
int pos = ;
a[n + ] = (int)1e9;
for (int i = ; i <= n; ++i)
{
while (pos < q && b[pos + ] < a[i + ]) ++pos;
res = min(res, i + q - pos);
}
printf("%d\n", res);
}
return ;
}

D. Intersecting Subtrees

Upsolved.

题意:

有一棵树,$A选了一棵子树,B选了一棵子树$

$但是B对树的标号和A对树的标号不同$

$现在告诉你以A标号的树的形态$

$以及A, B各自选择的子树的标号$

$有5次询问机会,每次可以询问$

$A \; x\;\; 返回B对应的标号$

$B \; y \;\; 返回A对应的标号$

最后给出答案,$A, B选择的子树是否有交,有的话输出其中一个交点,否则输出-1$

思路:

随便选一个$B中的点,得到A中的点,如果刚好是A子树内的,直接输出$

$否则以这个点去找一个最近的点,再询问一次,如果是就输出,否则就是-1$

$因为找到的是最近的属于A选择子树内的点,说明这条路径上没有交,如果这个点不是交$

$那么说明那个点那头也不会有交$

$如果有交的话,这个点就会把B选择的子树分成两部分,就不是连通的,和题意想违背$

 #include <bits/stdc++.h>
using namespace std; #define N 1010
int t, n, k, st;
int visa[N], visb[N];
vector <int> G[N]; int fa[N];
void BFS(int S)
{
queue <int> q; q.push(S); fa[st] = S;
while (!q.empty())
{
int u = q.front(); q.pop();
if (visa[u])
{
st = u;
return;
}
for (auto v : G[u]) if (v != fa[u])
{
fa[v] = u;
q.push(v);
}
}
} int dfs(int num,int fa){
if(visa[num]){
return num;
}
for (auto v : G[num]) if (v != fa)
{
int temp=dfs(v,num);
if(temp!=-){
return temp;
}
}
return -;
} int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
for (int i = ; i <= n; ++i) G[i].clear();
memset(visa, , sizeof visa);
memset(visb, , sizeof visb);
for (int i = , u, v; i < n; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
scanf("%d", &k);
for (int i = , x; i <= k; ++i)
{
scanf("%d", &x);
visa[x] = ;
}
scanf("%d", &k);
for (int i = , x; i <= k; ++i)
{
scanf("%d", &x);
visb[x] = ;
st = x;
}
printf("B %d\n", st);
fflush(stdout);
st = -;
scanf("%d", &st);
if (visa[st])
{
printf("C %d\n", st);
fflush(stdout);
continue;
}
BFS(st);
//st = dfs(st, st);
int ed;
printf("A %d\n", st);
fflush(stdout);
scanf("%d", &ed);
if (visa[st] && visb[ed])
printf("C %d\n", st);
else
puts("C -1");
fflush(stdout);
}
return ;
}

E. Optimal Polygon Perimeter

Upsolved.

题意:

给出一个凸包,两点之间的距离为曼哈顿距离

定义$f(x) 为选择x个点构成一个凸包的最大周长$

输出$f(3), f(4) \cdots f(n)$

思路:

对于$n >= 4的答案,就是选择最大上界,最大下界,最大左界,最大右界,构成的矩形的周长$

$再考虑n == 3的时候$

$因为是一个三角形,那么肯定是某两个最构成的两个点,再加上一个点,那个点枚举求解即可$

 #include <bits/stdc++.h>
using namespace std; #define N 300010
int n;
int x[N], y[N]; int main()
{
while (scanf("%d", &n) != EOF)
{
int Max[], Min[];
Min[] = Min[] = (int)1e9;
Max[] = Max[] = -(int)1e9;
for (int i = ; i <= n; ++i)
{
scanf("%d%d", x + i, y + i);
Max[] = max(Max[], x[i]);
Min[] = min(Min[], x[i]);
Max[] = max(Max[], y[i]);
Min[] = min(Min[], y[i]);
}
if (n == )
printf("%d\n", * (Max[] + Max[] - Min[] - Min[]));
else
{
int res = ;
for (int i = ; i <= n; ++i)
res = max(res, max(abs(x[i] - Max[]), abs(x[i] - Min[])) + max(abs(y[i] - Max[]), abs(y[i] - Min[])));
res *= ;
printf("%d", res);
for (int i = ; i <= n; ++i)
printf(" %d", * (Max[] + Max[] - Min[] - Min[]));
puts("");
}
}
return ;
}

F. Deduction Queries

Upsolved.

题意:

两种操作

$1\;l\;r\;x 告知你[l, r]的异或和$

$2\;l\;r 询问[l,r]的异或和,如果不知道就输出-1$

思路:

我们考虑异或的性质,就是异或两次就相当于删除

对于每次给出的$l, r我们可以把l, r并在一起$

$这样对于每个连通块中的节点,我们维护的是当前点到根的异或和$

$这样连通块中任意两点都可以询问,答案就是两个到根的异或和再异或一下$

$我们再考虑合并$

$我们令a, b为给出的异或和, fa[a], fa[b]为其所在连通块的根$

$我们发现这两个连通块有这样一条路径$

$fa[a] -> a -> b -> fa[b]$

$我们期望将fa[a] -> fa[b] 连一条边$

$根据前面定义的性质 fa[a]要维护的权值就是[fa[a], fa[b]]的异或和$

$那么这个权值就是 [fa[a], a] \oplus [a, b] \oplus [b, fa[b]]$

为了方便操作,我们将右界$+1$

 #include <bits/stdc++.h>
using namespace std; #define N 200010
int q, t, l, r, x, last;
map <int, int> fa, Xor, Rank; int find(int x)
{
if (fa[x] == x) return x;
int root = find(fa[x]);
Xor[x] ^= Xor[fa[x]];
return fa[x] = root;
} int main()
{
while (scanf("%d", &q) != EOF)
{
fa.clear(); Xor.clear(); Rank.clear(); last = ;
while (q--)
{
scanf("%d%d%d", &t, &l, &r);
if (t == )
{
scanf("%d", &x);
l ^= last;
r ^= last;
x ^= last;
if (l > r) swap(l, r);
++r;
if (fa.find(l) == fa.end()) fa[l] = l, Xor[l] = ;
if (fa.find(r) == fa.end()) fa[r] = r, Xor[r] = ;
int fl = find(l), fr = find(r);
if (fl != fr)
{
if (Rank[fr] <= Rank[fl])
{
fa[fr] = fl;
Xor[fr] = Xor[l] ^ Xor[r] ^ x;
if (Rank[fl] == Rank[fr]) ++Rank[fl];
}
else
{
fa[fl] = fr;
Xor[fl] = Xor[l] ^ Xor[r] ^ x;
}
}
}
else
{
l ^= last;
r ^= last;
if (l > r) swap(l, r); ++r;
if (fa.find(l) == fa.end() || fa.find(r) == fa.end())
{
last = ;
puts("-1");
continue;
}
int fl = find(l), fr = find(r);
if (fl != fr)
{
last = ;
puts("-1");
}
else
{
last = Xor[l] ^ Xor[r];
printf("%d\n", last);
}
}
}
}
return ;
}

Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2)的更多相关文章

  1. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  2. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) B 1075B (思维)

    B. Taxi drivers and Lyft time limit per test 1 second memory limit per test 256 megabytes input stan ...

  3. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2)---ABC

    A---The King's Race http://codeforces.com/contest/1075/problem/A 题意: 一个人在\((1,1)\), 一个人在\((n,n)\), 现 ...

  4. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) C. The Tower is Going Home(思维+双指针)

    https://codeforces.com/contest/1075/problem/C 题意 一个宽为1e9*1e9的矩阵中的左下角,放置一个车(车可以移动到同一行或同一列),放置一些墙,竖的占据 ...

  5. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) A. The King's Race

    http://codeforces.com/contest/1075/problem/A On a chessboard with a width of nn and a height of nn, ...

  6. Lyft Level 5 Challenge 2018 - Final Round Div. 1没翻车记

    夜晚使人着迷.没有猝死非常感动. A:显然对于水平线段,只有横坐标的左端点为1的时候才可能对答案产生影响:对于竖直直线,如果要删一定是删去一段前缀.枚举竖直直线删到哪一条,记一下需要删几条水平线段就可 ...

  7. [Lyft Level 5 Challenge 2018 - Elimination Round][Codeforces 1033D. Divisors]

    题目链接:1033D - Divisors 题目大意:给定\(n\)个数\(a_i\),每个数的约数个数为3到5个,求\(\prod_{i=1}^{n}a_i\)的约数个数.其中\(1 \leq n ...

  8. Lyft Level 5 Challenge 2018 - Elimination Round

    A. King Escape 签. #include <bits/stdc++.h> using namespace std; ], y[]; int f1(int X, int Y) { ...

  9. Lyft Level 5 Challenge 2018 - Elimination Round翻车记

    打猝死场感觉非常作死. A:判一下起点和终点是否在其两侧即可. #include<iostream> #include<cstdio> #include<cmath> ...

随机推荐

  1. docker 配置文件:/etc/docker/daemon.json

    /etc/docker/daemon.json 是 docker 的配置文件,默认是没有的,需要我们手动创建,可配置项如下: [root@localhost ~]$ vim /etc/docker/d ...

  2. 进程防结束之PS_CROSS_THREAD_FLAGS_SYSTEM

    有人投到黑防去了,不过黑防不厚道,竟然没给完整的代码,自己整理一份备用吧,驱网.DebugMan.邪八的那群人直接飘过吧. 这种方法的关键在于给线程的ETHREAD.CrossThreadFlags设 ...

  3. poj_2752 kmp

    题目大意 给定字符串S,求出S的所有可能相同前后缀的长度.比如: "alala"的前缀分别为{"a", "al", "ala&qu ...

  4. Cookie的介绍及使用

    咱们不搞一开始就一大堆理论知识介绍,怕把人讲懵了...... 咱们换一个思维方式——"从现象看本质",先说说我们看到了什么,再从看到的现象中提出问题,最后深入寻找答案. 我们看到的 ...

  5. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

  6. 【Android】Android内存溢出问题---用自行开辟的空间进行对内存管理

    public static Bitmap readBitmap(String path) { BitmapFactory.Options options = new BitmapFactory.Opt ...

  7. jfinal关联查询给dto添加表结构以外的字段并返回的处理方式

    官网栗子: http://www.jfinal.com/doc/5-10 5.10 表关联操作 JFinal ActiveRecord 天然支持表关联操作,并不需要学习新的东西,此为无招胜有招.表关联 ...

  8. squid 高匿设置

    1.透明代理.匿名代理.混淆代理.高匿代理有什么区别 这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送请求时,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDE ...

  9. 三维凸包(两个没有公共点)经过旋转平移后使其重心相距最近(POJ3862)

    Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 481   Accepted: 152   Special ...

  10. 170718、springboot编程之发送邮件

    Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看如何在Spring Boot中使用Jav ...