Codeforces 题目传送门 & 洛谷题目传送门

一道很神的乱搞题 %%%

首先注意到如果直接去做,横纵坐标有关联,不好搞。这里有一个非常套路的技巧——坐标轴旋转,我们不妨将整个坐标系旋转 \(\dfrac{\pi}{4}\),即对于原来坐标系中的一个点 \(x,y\),映射到新坐标系上的坐标为 \((x+y,y-x)\),经过这样的转化,原来坐标系中的上 \((0,1)\) 下 \((0,-1)\) 左 \((-1,0)\) 右 \((1,0)\) 就变为了 \((1,1),(-1,-1),(-1,1),(1,-1)\),我们发现每一个向量的横/纵坐标都是 \(\pm 1\),也就可以横纵坐标分开来考虑了。

但这样值域是 \(\{1,-1\}\),还是不太方便,我们考虑再将其变为 \(\{1,0\}\),也就是说我们给 \(t\) 时刻所有点的横纵坐标都加上 \(t\) 再除以二,即每一个对三元组 \((t,x,y)\) 就变为了 \((t,\dfrac{x+y+t}{2},\dfrac{y-x+t}{2})\),有人可能会担心这里有小数,事实上,若 \(x+y\) 与 \(t\) 奇偶性不同,那显然是不合法的,因此 \(\dfrac{x+y+t}{2},\dfrac{y-x+t}{2}\) 都是整数,这样一来上下左右又变为了 \((1,1),(0,0),(0,1),(1,0)\)。

将横纵坐标分开来考虑,这样就变为了求解两次如下的问题:有一个呈周期分别的序列 \(a\) 满足 \(a_i=a_{i-n}(i\ge n),a_i\in\{0,1\}\),给定 \(m\) 个二元组 \((t_i,x_i)\) 表示 \(\sum\limits_{j=1}^{t_i}a_j=x_i\),问是否存在这样的序列 \(a\)。

我们考虑记 \(s_i=\sum\limits_{j=1}^ia_j\),由于 \(a_i\) 呈周期分布,必然对于 \(p>n\),有 \(s_p=\lfloor\dfrac{p}{n}\rfloor s_n+s_{p\bmod n}\),我们记 \(p_i=\lfloor\dfrac{t_i}{n}\rfloor,q_i=t_i\bmod n\),那么每个二元组等价于 \(p_is_n+s_{q_i}=x_i\)。

我们将所有二元组按 \(q_i\) 从小到大排序,方便起见我们再引入两条新的信息 \(p_{n+1}=0,q_{n+1}=0,x_{n+1}=0\) 以及 \(p_{n+2}=-1,q_{n+2}=n,x_{n+2}=0\)。

考虑对于两条信息 \((p_i,q_i,x_i)\) 以及 \((p_{i+1},q_{i+1},x_{i+1})\),我们有 \(p_is_n+s_{q_i}=x_i\) 及 \(p_{i+1}s_n+s_{q_{i+1}}=x_{i+1}\),拿后一个等式减去前一个等式可得 \((p_{i+1}-p_i)s_n+s_{q_{i+1}}-s_{q_i}=x_{i+1}-x_i\),而 \(s_{q_{i+1}}-s_{q_i}=\sum\limits_{j=q_i+1}^{q_{i+1}}a_j\in[0,q_{i+1}-q_i]\),故 \((p_{i+1}-p_i)s_n+s_{q_{i+1}}-s_{q_i}\in[(p_{i+1}-p_i)s_n,(p_{i+1}-p_i)s_n+q_{i+1}-q_i]\),因此 \((p_{i+1}-p_i)s_n\in[(x_{i+1}-x_i)-(q_{i+1}-q_i),x_{i+1}-x_i]\),分三种情况,可得出 \(s_n\) 的范围:

  • \(p_{i+1}-p_i=0\),那么若 \(0\notin[(x_{i+1}-x_i)-(q_{i+1}-q_i),x_{i+1}-x_i]\) 则直接输出 NO,否则可直接忽略该条件。
  • \(p_{i+1}-p_i>0\),那么 \(s_n\in[\lceil\dfrac{(x_{i+1}-x_i)-(q_{i+1}-q_i)}{p_{i+1}-p_i}\rceil,\lfloor\dfrac{x_{i+1}-x_i}{p_{i+1}-p_i}\rfloor]\)
  • \(p_{i+1}-p_i<0\),那么 \(s_n\in[\lceil\dfrac{x_{i}-x_{i+1}}{p_{i}-p_{i+1}}\rceil,\lfloor\dfrac{(x_{i}-x_{i+1})-(q_{i}-q_{i+1})}{p_{i}-p_{i+1}}\rfloor]\)

维护两个变量 \(L,R\) 表示 \(s_n\in[L,R]\),一边扫描一边更新即可,如果最终 \(L>R\) 则输出 NO,否则不妨设 \(s_n=L\) 并可得到若干个形如 \(s_{q_{i+1}}-s_{q_i}=r_i\) 的式子,显然根据之前的限制有 \(r_i\le s_{q_{i+1}}-s_{q_i}\),我们就令 \(a_{q_{i}+1},a_{q_i+2},\cdots,a_{q_i+r_i}\) 为 \(1\),\(a_{q_i+r_i+1},a_{q_i+r_i+2},\cdots,a_{q_{i+1}}\) 为 \(0\) 即可。

复杂度 \(n\log n\)。

const int MAXN=2e5;
const ll INF=0x3f3f3f3f3f3f3f3fll;
int n,l;
struct data{
ll t,x,y,p,q;
bool operator <(const data &rhs){
return q<rhs.q;
}
} a[MAXN+5];
int main(){
scanf("%d%d",&n,&l);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&a[i].t,&a[i].x,&a[i].y);
if((a[i].t+a[i].x+a[i].y)&1ll) return puts("NO"),0;
a[i].p=a[i].t/l;a[i].q=a[i].t%l;
ll tmpx=a[i].x,tmpy=a[i].y;
a[i].x=(tmpx+tmpy+a[i].t)>>1;
a[i].y=(tmpy-tmpx+a[i].t)>>1;
} a[++n].p=-1;a[n].q=l;sort(a+1,a+n+1);
ll xd=0,xu=INF,yd=0,yu=INF;
for(int i=1;i<=n;i++){
ll difp=a[i].p-a[i-1].p,difq=a[i].q-a[i-1].q;
if(difp==0){
if(a[i].x-a[i-1].x<0||a[i].x-a[i-1].x-difq>0) return puts("NO"),0;
if(a[i].y-a[i-1].y<0||a[i].y-a[i-1].y-difq>0) return puts("NO"),0;
} else if(difp>0){
chkmax(xd,(ll)ceil(1.0l*(a[i].x-a[i-1].x-difq)/difp));
chkmin(xu,(ll)floor(1.0l*(a[i].x-a[i-1].x)/difp));
chkmax(yd,(ll)ceil(1.0l*(a[i].y-a[i-1].y-difq)/difp));
chkmin(yu,(ll)floor(1.0l*(a[i].y-a[i-1].y)/difp));
} else{
difp=-difp;
chkmax(xd,(ll)ceil(1.0l*(a[i-1].x-a[i].x)/difp));
chkmin(xu,(ll)floor(1.0l*(a[i-1].x-a[i].x+difq)/difp));
chkmax(yd,(ll)ceil(1.0l*(a[i-1].y-a[i].y)/difp));
chkmin(yu,(ll)floor(1.0l*(a[i-1].y-a[i].y+difq)/difp));
}
} if(xd>xu||yd>yu) return puts("NO"),0;
ll vx=xd,vy=yd;
for(int i=1;i<=n;i++){
ll stpx=(a[i].x-a[i].p*vx)-(a[i-1].x-a[i-1].p*vx);
ll stpy=(a[i].y-a[i].p*vy)-(a[i-1].y-a[i-1].p*vy);
int curx=0,cury=0,stp=a[i].q-a[i-1].q;
while(stp--){
if(curx<stpx){
++curx;
if(cury<stpy) ++cury,putchar('U');
else putchar('R');
} else {
if(cury<stpy) ++cury,putchar('L');
else putchar('D');
}
}
} putchar('\n');
return 0;
}

Codeforces 538G - Berserk Robot(乱搞)的更多相关文章

  1. Codeforces 732e [贪心][stl乱搞]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...

  2. Codeforces 1077E (二分乱搞或者dp)

    题意:给你一个数组,可以从中选区若干种元素,但每种元素选区的个数前一种必须是后一种的2倍,选区的任意2种元素不能相同,问可以选取最多的元素个数是多少? 思路1(乱搞):记录一下每种元素的个数,然后暴力 ...

  3. codeforces 664B B. Rebus(乱搞题)

    题目链接: B. Rebus time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)

    A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  5. Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序

    题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可 ...

  6. Codeforces 306D - Polygon(随机化+乱搞)

    Codeforces 题目传送门 & 洛谷题目传送门 中考终于结束了--简单写道题恢复下状态罢. 首先这一类题目肯定没法用一般的方法解决,因此考虑用一些奇淫的乱搞做法解决这道题,不难发现,如果 ...

  7. codeforces 653C C. Bear and Up-Down(乱搞题)

    题目链接: C. Bear and Up-Down time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  8. codeforces 665C C. Simple Strings(乱搞)

    题目链接: C. Simple Strings time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  9. CodeForces - 1228D (暴力+思维+乱搞)

    题意 https://vjudge.net/problem/CodeForces-1228D 有一个n个顶点m条边的无向图,在一对顶点中最多有一条边. 设v1,v2是两个不相交的非空子集,当满足以下条 ...

随机推荐

  1. AtCoder Beginner Contest 224

    AtCoder Beginner Contest 224 A - Tires 思路分析: 判断最后一个字符即可. 代码如下: #include <bits/stdc++.h> using ...

  2. 热身 for computer industry

    项目 内容 作业属于 班级博客 作业要求 作业要求 个人课程目标 掌握软件工程基础知识 具体有助方面 个人认知与规划 其他参考文献 博客Ⅰ 博客 Ⅱ 选择计算机 你为什么选择计算机专业?你认为你的条件 ...

  3. flutter页面间跳转和传参-Navigator的使用

    flutter页面间跳转和传参-Navigator的使用 概述 flutter中的默认导航分成两种,一种是命名的路由,一种是构建路由. 命名路由 这种路由需要一开始现在创建App的时候定义 new M ...

  4. elasticsearch的bulk(批量)操作

    在es中我们可能会有这么一种需求,即有时需要批量向es中插入或更新或删除数据,如果一条一条数据的操作,那么速度必然很慢,那么es的bulk api就可以派上用场. delete 删除操作,只需要写一个 ...

  5. 《HelloGitHub》第 67 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweihan/HelloGitHu ...

  6. MVC之三个单选按钮的切换选择

    实现需求: 1.三个多选按钮中:只能同时选择限时抢购和分享金或者拼团特惠和分享金,其中限时抢购和拼团特惠不能同时选择.并且点击后显示,再次点击赢隐藏. 1 @*活动信息*@ 2 <div> ...

  7. AtCoder Beginner Contest 210题解

    A B 过水,略... C 统计长度为k的区间的最多本质不同的数.用尺取法维护下左右指针就可以了.调了许久的原因是更新答案时出现了问题. 当我移动指针时,我们应该移动一个就更新一个,而不是将移动与更新 ...

  8. Manacher算法 求 最长回文子串

    1 概述(扯淡) 在了解Manacher算法之前,我们得先知道什么是回文串和子串. 回文串,就是正着看反着看都一样的字符串.比如说"abba"就是一个回文串,"abbc& ...

  9. hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)

    题意: X坐标上有n个数.JOHN想知道有多少对数满足:x[a]-x[b]<=k(题意给)[a<b] 思路: 额,,,直接看代码吧,,,, 代码: int T,n,k; int x[100 ...

  10. python语法与pycharm的基本使用

    内容概要 pycharm基本使用 python注释语法 变量与常量 垃圾回收机制 数据类型 1. pycharm基本使用 pycharm安装完成后首次打开要注意: 文件路径(不要选择C盘) pytho ...