Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2)
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)的更多相关文章
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- 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 ...
- 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)\), 现 ...
- 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的矩阵中的左下角,放置一个车(车可以移动到同一行或同一列),放置一些墙,竖的占据 ...
- 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, ...
- Lyft Level 5 Challenge 2018 - Final Round Div. 1没翻车记
夜晚使人着迷.没有猝死非常感动. A:显然对于水平线段,只有横坐标的左端点为1的时候才可能对答案产生影响:对于竖直直线,如果要删一定是删去一段前缀.枚举竖直直线删到哪一条,记一下需要删几条水平线段就可 ...
- [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 ...
- Lyft Level 5 Challenge 2018 - Elimination Round
A. King Escape 签. #include <bits/stdc++.h> using namespace std; ], y[]; int f1(int X, int Y) { ...
- Lyft Level 5 Challenge 2018 - Elimination Round翻车记
打猝死场感觉非常作死. A:判一下起点和终点是否在其两侧即可. #include<iostream> #include<cstdio> #include<cmath> ...
随机推荐
- apache编译安装完成后的服务启动设置
Apache安装后可通过其安装路径的bin目录下的apachectl脚本控制服务的启动和停止.本例中apache安装在/usr/local/apache-2.2.6,服务控制脚本为: /usr/loc ...
- iOS-代码修改Info.plist文件
解决办法: 1.首先系统的Info.Plist文件是只读文件 并不能 写入.目前我个人是没有办法存入,官方属性 可以看到是readOnly 2.那么我们 就想代码修改Info.Plist文件怎么办呢, ...
- UVa 673 Parentheses Balance (stack)
题目描述 : 判断字符串是不是符合正确的表达式形式. 要点 : 考虑字符串为空的时候,用getline输入,每一次判断后如果为No则要清空栈.对称思想. 注意输入格式. 代码: #include &l ...
- hdu1024 Max Sum Plus Plus[降维优化好题(貌似以后可以不用单调队列了)]
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- C# 判断远程文件是否存在
/// <summary> /// 判断远程文件是否存在 /// </summary> /// <param name="url">url地址& ...
- {sharepoint} SetPermission
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
- Inflater与findViewById()区别
/** * Inflater英文意思是膨胀,在Android中应该是扩展的意思吧. LayoutInflater的作用类似于 * findViewById(),不同点是LayoutInflater是用 ...
- jquery点击事件失效原因和解决办法
在使用jQuery绑定点击事件的时候,有时候会遇到点击无效,这种情况大多出现在动态添加元素的时候 例如:给demo里添加li元素给li绑定点击事件 $("#demo").appen ...
- postgresql----LIKE和SIMILAR TO
LIKE和SIMILAR TO都支持模糊查询,另外SIMILAR TO还支持正则表达式查询.模糊查询中有两个重要的符号:下划线'_'匹配任意单个字符,百分号'%'匹配任意多个字符,可以是0个,如果想匹 ...
- poj3345 Bribing FIPA【树形DP】【背包】
Bribing FIPA Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5910 Accepted: 1850 Desc ...