Codeforces 724C [坐标][乱搞][模拟]
/*
不要低头,不要放弃,不要气馁,不要慌张
题意:
从(0,0)出发与x轴正方向呈45度角的射线,在给定的矩形区域内不断发射,直到射入矩形的某个角停止。
给出多个坐标,问光线最早经过某坐标的时间。
思路:
1.明确光线反射次数不会超过n+m次(好像是这样==没细想)
2.发现规律,光线要么是符合x+y=k,或者x-y=k的直线。而且每次反射都会变到不同类型的直线。
3.知道出发点,算出反射点。
4.把点放到直线的vector里边。每次到了某条直线把直线上的点扫一遍,然后删掉。 */ #include<bits/stdc++.h>
using namespace std;
struct point{
point(){}
point(long long xx,long long yy,int iid){
x=xx;y=yy;id=iid;
}
long long x,y,id;
};
bool operator <(const point &a,const point &b){
if(a.x!=b.x)return a.y<b.y;
return a.x<b.x;
}
set<point> ms1[],ms2[];
long long rel[];
int n,m,k;
point next(point a,int num){
if(num&){
long long w=a.x+a.y;
long long x=;
long long y=w-x;
if(y>=&&y<=m&&(x!=a.x||y!=a.y))return point(x,y,);
x=n;
y=w-x;
if(y>=&&y<=m&&(x!=a.x||y!=a.y))return point(x,y,);
y=;
x=w-y;
if(x>=&&x<=n&&(x!=a.x||y!=a.y))return point(x,y,);
y=m;
x=w-y;
if(x>=&&x<=n&&(x!=a.x||y!=a.y))return point(x,y,);
}
else{
long long w=a.x-a.y;
long long x=;
long long y=x-w;
if(y>=&&y<=m&&(x!=a.x||y!=a.y))return point(x,y,);
x=n;
y=x-w;
if(y>=&&y<=m&&(x!=a.x||y!=a.y))return point(x,y,);
y=;
x=y+w;
if(x>=&&x<=n&&(x!=a.x||y!=a.y))return point(x,y,);
y=m;
x=y+w;
if(x>=&&x<=n&&(x!=a.x||y!=a.y))return point(x,y,);
}
}
long long cal(point a,point b){
return max(a.x-b.x,b.x-a.x);
}
int main()
{
memset(rel,-,sizeof(rel));
long long x,y,bf=;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++){
scanf("%lld%lld",&x,&y);
ms1[x-y+].insert(point(x,y,i));
ms2[x+y].insert(point(x,y,i));
}
point st(,,);
int num=;
while(){
x=st.x;y=st.y;
if(num&){
while(!ms2[x+y].empty()){
long long xx=ms2[x+y].begin()->x;
long long yy=ms2[x+y].begin()->y;
int id=ms2[x+y].begin()->id;
if(rel[id]==-)
rel[id]=bf+cal(point(xx,yy,),st);
ms1[x-y+].erase(point(xx,yy,));
ms2[x+y].erase(point(xx,yy,));
}
}
else{
while(!ms1[x-y+].empty()){
long long xx=ms1[x-y+].begin()->x;
long long yy=ms1[x-y+].begin()->y;
int id=ms1[x-y+].begin()->id;
if(rel[id]==-)
rel[id]=bf+cal(point(xx,yy,),st);
ms1[x-y+].erase(point(xx,yy,));
ms2[x+y].erase(point(xx,yy,));
}
}
bf+=cal(st,next(st,num));
st=next(st,num);
num++;
if((st.x==&&st.y==)||(st.x==&&st.y==m)||(st.x==n&&st.y==)||(st.x==n&&st.y==m))break;
}
for(int i=;i<=k;i++){
printf("%lld\n",rel[i]);
}
}
Codeforces 724C [坐标][乱搞][模拟]的更多相关文章
- Codeforces 723c [贪心][乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张. 题意: 给一个n和m. 第二行给n个数. 每次操作可以把n个数中的任何一个数替代为别的数,问最少的操作次数使得1.2.3.4.5...m中的数出现的次数 ...
- codeforces 1041 c 乱搞
#include <bits/stdc++.h> using namespace std; struct po { int val; int id; }; po a[]; vector&l ...
- Codeforces 1186F - Vus the Cossack and a Graph 模拟乱搞/欧拉回路
题意:给你一张无向图,要求对这张图进行删边操作,要求删边之后的图的总边数 >= ceil((n + m) / 2), 每个点的度数 >= ceil(deg[i] / 2).(deg[i]是 ...
- Codeforces 538G - Berserk Robot(乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 一道很神的乱搞题 %%% 首先注意到如果直接去做,横纵坐标有关联,不好搞.这里有一个非常套路的技巧--坐标轴旋转,我们不妨将整个坐标系旋转 ...
- 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 ...
- Codeforces 1182D Complete Mirror 树的重心乱搞 / 树的直径 / 拓扑排序
题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可 ...
- Codeforces 306D - Polygon(随机化+乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 中考终于结束了--简单写道题恢复下状态罢. 首先这一类题目肯定没法用一般的方法解决,因此考虑用一些奇淫的乱搞做法解决这道题,不难发现,如果 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...
随机推荐
- IOS 核心动画之CAKeyframeAnimation - iBaby
- IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...
- 【代码】verilog之:电子钟
功能:显示时分秒,能够设置时间. 实现:两个按键,一个进入设置,一个加数字.显示用LCD5110 用状态机实现,总共四种状态 idle(正常运行)——s_hour(时设置状态)——s_min(分设置状 ...
- C#面向对象总结1
1.面向过程-----> 面向对象 面向过程:面向的是完成这件事的过程,强调的是完成这件事的动作. 面向对象:找个对象帮你做事. 意在写出一个通用的代码,屏蔽差异. 我们在代码中描述一个对象,一 ...
- candence 知识积累3
1. PCB板型: 1.新建PCB:PCB design ,新建的类型为board ,输入名称和保存位置,设置图纸参数.网格参数. 2.建立PCB板外框:菜单Add下选择相应的工具.在Option选项 ...
- jQuery.extend源码深层分析
在网站的开发中,经常会自己写一些jQuery插件来方便使用,其中自然少不了一个关键的方法->jQuery.extend(),使用这个方法来扩展jQuery对象. 那么今天就来讲讲这个函数的实现原 ...
- juqey.html(),text(),val()
.html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...
- C#实现右下角弹出窗口效果
/// <summary> /// 窗体动画函数 注意:要引用System.Runtime.InteropServices; /// </summary> /// <pa ...
- ACM感悟
声明:本文是写给弱校ACM新手的一点总结,受自身水平和眼界所限,难免会有一些个人主观色彩,希望大牛指正 感谢@Wackysoft .@哇晴天 . @ 一切皆有可能1 的指教,现根据这些建议,文章已进行 ...
- Caffe 源碼閱讀(二) SyncedMemory.hpp
1. to_cpu 數據由現存同步到內存 2. to_gpu 數據由內存同步到顯存 3. cpu_str_ 內存指針 4. gpu_str_ 顯存指針 5. size_ 數據大小 6. own_cpu ...
- Node.js高级编程读书笔记 - 2 文件和进程处理
Outline 3 文件.进程.流和网络 3.1 查询和读写文件 3.2 创建和控制外部进程 3.3 读写数据流 3 文件.进程.流和网络 3.1 查询和读写文件 path 从Node 0.8起,pa ...