【链接】h在这里写链接


【题意】


场上有 n
个点,它们分别向上与向右在不同时刻开始运动,相遇则改变移动方向,求最终这些点到达的坐标。

【题解】


先把每个点的坐标都往它本该移动的方向相反的方向退ti个单位。
这样,就相当于每个点都是同时开始运动的了。
想象一下,两个点同时碰撞的条件.
假设碰撞的点坐标为(x,y);
则初始的时候他们的坐标分别为(x-t,y)以及(x,y-t);
会发现,这两个点的x+y的值是一样的。
(这里的x,y是每个点都退ti个单位后的点x,y)
所以,能够发生碰撞的条件,就是x+y的值是一样的。
也即,他们同在一条直线y = -x + z上。
则我们把所有在同一条直线y = -x + z上的点都归为一组。
一组一组的处理。
(会发现,这组里面的点只会和组内部的点发生碰撞);
这些规律画图就很容易得到的。
然后,我们把这些点从左上到右下一个一个处理。
就能发现规律的。
会发现,左边,下边出来的点,都依照点的顺序投射到上,上右,右上,右下。
画图!别光看题解。


【错的次数】


0

【反思】


把每个点都往后移动。
抓住碰撞的条件是什么。
把点按照能碰撞的分为一组。
不难模拟出规律的。

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 1e5; int n, w, h, g[N + 10], p[N + 10], t[N + 10];
pair <int, int> ans[N + 10];
map <int, vector<int> > dic;
vector <int> vx, vy; void in() {
    cin >> n >> w >> h;     for (int i = 1; i <= n; i++) {
        cin >> g[i] >> p[i] >> t[i];
        dic[p[i] - t[i]].push_back(i);
    }
} bool cmp(int x, int y) {
    return p[x] < p[y];
} void get_ans() {
    for (pair <int, vector<int> > temp : dic) {
        int len = temp.second.size();         for (int i = 0; i <= len - 1; i++)
            if (g[temp.second[i]] == 1) {
                vx.push_back(temp.second[i]);
            }
            else {
                vy.push_back(temp.second[i]);
            }             sort(vx.begin(), vx.end(), cmp);
            sort(vy.begin(), vy.end(), cmp);             int k = (int)vy.size() - 1 - (int)vx.size() + 1;
            k = max(k, 0);
            for (int i = (int)vy.size() - 1; i >= k; i--) {
                int temp = (int)vy.size() - i - 1;
                ans[vy[i]].first = p[vx[temp]], ans[vy[i]].second = h;
            }             for (int i = k - 1; i >= 0; i--) {
                int temp = k - i;
                ans[vy[i]].first = w, ans[vy[i]].second = p[vy[(int)vy.size() - temp]];
            }             k = (int)vx.size() - 1 - (int)vy.size() + 1;
            k = max(k, 0);
            for (int i = (int)vx.size() - 1; i >= k; i--) {
                int temp = (int)vx.size() - i - 1;
                ans[vx[i]].first = w, ans[vx[i]].second = p[vy[temp]];
            }             for (int i = k - 1; i >= 0; i--) {
                int temp = k - i;
                ans[vx[i]].first = p[vx[(int)vx.size() - temp]], ans[vx[i]].second = h;
            }
            vx.clear(), vy.clear();
    }
} void out() {
    for (int i = 1; i <= n; i++)
        cout << ans[i].first << ' ' << ans[i].second << endl;
} int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    in();
    get_ans();
    out();
    return 0;
}

【Codeforces Round #431 (Div. 1) B】的更多相关文章

  1. 【Codeforces Round #431 (Div. 2) A】Odds and Ends

    [链接]点击打开链接 [题意] 让你把一个数组分成奇数个部分. 且每个部分的长度都是奇数. [题解] 很简单的脑洞题. 开头和结尾一定要为奇数,然后 n为奇数的话,就选整个数组咯. n为偶数的话,不能 ...

  2. 【Codeforces Round #431 (Div. 2) B】 Tell Your World

    [链接]点击打开链接 [题意] n个点,x从左到右严格递增的顺序给出 让你划两条平行的,且没有相同点的直线; 使得它们俩各自最少穿过一个点. 且它们俩穿过了所有的点. [题解] 枚举第一个点和哪个点组 ...

  3. 【Codeforces Round #431 (Div. 2) C】From Y to Y

    [链接]点击打开链接 [题意] 让你构造一个大小最多为10W的字符multiset. 你进行n-1次操作; 每次操作,从set中取出两个字符串,一开始单个字符被认为是字符串. 然后把它们连接在一起. ...

  4. 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers

    [链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...

  5. 【Codeforces Round 431 (Div. 2) A B C D E五个题】

    先给出比赛地址啦,感觉这场比赛思维考察非常灵活而美妙. A. Odds and Ends ·述大意:      输入n(n<=100)表示长度为n的序列,接下来输入这个序列.询问是否可以将序列划 ...

  6. 【Codeforces Round #431 (Div. 1) D.Shake It!】

    ·最小割和组合数放在了一起,产生了这道题目. 英文题,述大意:     一张初始化为仅有一个起点0,一个终点1和一条边的图.输入n,m表示n次操作(1<=n,m<=50),每次操作是任选一 ...

  7. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  8. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  9. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

随机推荐

  1. 【HDU】5249-KPI(线段树+离散化)

    好久没写线段树都不知道怎么写了... 很easy的线段树二分问题 #include<cstdio> #include<set> #include<queue> #i ...

  2. POJ 1325 &amp;&amp; ZOJ 1364--Machine Schedule【二分图 &amp;&amp; 最小点覆盖数】

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13071   Accepted: 5575 ...

  3. iOS使用push隐藏子页面底部bottom TabBar

    下面两种情况是我在开发过程中遇到的,一种是代码使用pushViewController,还有一种是storyboard直接使用push.之前也查阅了非常多关于隐藏底部tabbar的资料.可是要么使用起 ...

  4. java正則表達式总结

    近期用到的正則表達式 因为近期在做一个android的新闻client.多次用到了正則表達式.因此总结下. 1.使用正則表達式获取Rss资源内的文章内容的图片url 由于在每条新闻浏览的listVie ...

  5. Android图像处理之熔铸特效

    代码: package com.color; import android.content.Context; import android.graphics.Bitmap; import androi ...

  6. 智课雅思词汇---二、词根acu和acr

    智课雅思词汇---二.词根acu和acr 一.总结 一句话总结:acu和acr:sharp锋利的,敏捷的: acuteacutelyacuity sharp锋利的,敏捷的 1.词根acr表示什么意思? ...

  7. go 可以开发桌面应用

    go 可以开发桌面应用 go 可以开发桌面应用,但并不是很舒适.可以使用的GUI库有:1.goqt,LiteIDE作者出品,Go和QT的绑定,还未发布2.go.uik,纯Go实现的并发UI工具3.wa ...

  8. 二分图简单概念&&HDU 2063

    二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...

  9. 【MinGW】【C语言环境搭建】

    问题 安装MinGW配置环境变量后终端输入gcc -v出错 解决 Win10下环境变量最后不用加分号

  10. netstat -p 显示 -

    http://4735839.blog.51cto.com/4725839/1418945 https://yq.aliyun.com/articles/63060