1. 程式人生 > >【思維】Hzy's Rabbit Stick

【思維】Hzy's Rabbit Stick

題目描述

給兔兔們染完顏色後,Hzy把n只顏色不同的兔兔放在了一根長度為L=10n的木棍的不同位置(每隻兔兔的位置在[0,L]之間)上,讓她們做做運動。

在最開始的時候,Hzy會給每隻兔兔指定一個方向,所有的兔兔都會乖乖地按照Hzy給她們指定的方向走(速度為每秒一個單位長度)。而當兩隻兔兔相遇(到達相同的位置)時,它們會同時掉頭(掉頭的時間忽略不計),下一秒她們會朝著相反的方向走。如果某隻兔兔走到了木棍的邊緣(位置0或者位置L),則她也會掉頭,下一秒她會朝著相反的方向走。

現在,兔兔們想知道,T秒後她們分別在什麼位置。

輸入

第一行兩個整數n、T,分別表示兔兔的數量和運動的秒數。
之後的n行,每行兩個整數,依次表示從左到右每隻兔兔的位置和朝向(−1表示向左,1表示向右)。

輸出

輸出n行,依次表示每隻兔兔(與輸入中的順序對應)的位置。

樣例輸入

3 2
1 -1
5 1
9 -1

樣例輸出

1
7
7

提示

對於100%的資料,1≤n≤105,0≤T≤1018,兔兔的起始位置均為奇數。

【小結】:

看完題目,我第一感覺就認為這個題目好像在哪裡做過一樣。

這個題目有點神似,因為問題都是相遇之後折返走,然後poj 1852 .

這題的做法,直接就是把兩隻螞蟻折返走,看作兩隻螞蟻互相穿過去。

這題的答案就浮現出來了。

這是第一個想法,然後麻煩的問題又來了,它說要輸出小兔子最後所在的位置。

是按輸入的順序來輸出。

問題是:螞蟻這個題目,只能是看作穿過去罷了,但是兩隻螞蟻的身份明顯就交換了,

而且t給的很大,無法列舉跟蹤每隻螞蟻的行蹤。

所以,這時候引入第二個概念。

我初中做到一個期末考試的數學題。

我已經找不到原題給大家了,

然後這個題目的意思是,兩球相遇,然後一個球以勻速前進,然後另外一個球相遇後折返。

問:另外一個球移動的距離。

當時我真的不會做這個題,後來想想,也就那麼簡單,

大家思考一下,其實即使兩隻螞蟻身份改變了,但是相對來說,其實每一隻螞蟻都在自己所在的區域下運動。

所以肯定答案只要把所有位置求出,最後排序即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
typedef struct Node{
    int No,x,flag;
    /*bool operator < (const Node &p)const {
        return x<p.x;
    }*/
}Node;
Node a[N];
bool cmp(Node a,Node b){
    return a.x<b.x;
}
int main()
{
    int n,L,t;
    ll tt;
    //freopen("stick.in", "r", stdin); freopen("stick.out", "w", stdout);
    scanf("%d%lld",&n,&tt);
    L=10*n;
    t=(int)(tt%((ll)(2*L)));
    for(int i=0;i<n;i++){
        scanf("%d%d",&a[i].x,&a[i].flag);
        a[i].No=i;
    }
    for(int i=0;i<n;i++){
             
        if(a[i].flag==-1){
            if(a[i].x>=t){
                a[i].x=a[i].x-t;
            }else if(a[i].x<t&&t<a[i].x+L){
                a[i].x=t-a[i].x;
            }else{
                a[i].x=2*L-t+a[i].x;
            }
        }
        else if(a[i].flag==1){
            if(t+a[i].x<=L){
                a[i].x=t+a[i].x;
            }else if(L<t+a[i].x&&t+a[i].x<=2*L){
                a[i].x=2*L-t-a[i].x;
            }else if(t+a[i].x>2*L){
                a[i].x=(t+a[i].x)%(2*L);
            }
        }
    }
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        printf("%lld\n",a[i].x);
    }
    return 0;
}

相關推薦

思維Hzy's Rabbit Stick

題目描述 給兔兔們染完顏色後,Hzy把n只顏色不同的兔兔放在了一根長度為L=10n的木棍的不同位置(每隻兔兔的位置在[0,L]之間)上,讓她們做做運動。 在最開始的時候,Hzy會給每隻兔兔指定一個方向,所有的兔兔都會乖乖地按照Hzy給她們指定的方向走(速度為每秒一個單位長度

規律Hzy's Rabbit Play

題目描述 Hzy在和她的n只兔兔玩。 兔兔們站成一行,每次,Hzy可以選擇一個區間[l,r],然後抱抱區間裡的所有兔兔,並獲得等同於區間長度r−l+1的愉悅度。每個區間Hzy只能選擇一次,請問Hzy一共能獲得多少愉悅度? 因為這個數太大了,所以Hzy只需要你輸出這個數對10

AtCoder思維置換Rabbit Exercise

題意: 有n只兔子,i號兔子開始的時候在a[i]號位置。每一輪操作都將若干只兔子依次進行操作: 加入操作的是b[i]號兔子,就將b[i]號兔子移動到關於b[i]-1號兔子現在所在的位置對稱的地方,或者是關於b[i]+1號兔子現在所在的位置對稱的地方,兩者是等概率

思維Stacks of Flapjacks

def ostream wap tmp char highlight break strong return [UVa120] Stacks of Flapjacks 算法入門經典第8章8-1 (P236) 題目大意:有一個序列,可以翻轉[1,k],構造一種方案使得序列

BZOJ3470Freda’s Walk 概率與期望

space 現在 pre -c 我們 mil pop 小數 ble 【BZOJ3470】Freda’s Walk Description 雨後的Poetic Island空氣格外清新,於是Freda和Rainbow出來散步。 Poetic Island的

BZOJ4129Haruna’s Breakfast(樹上莫隊)

mex 端點 ble Go != gis odi down 分塊 【BZOJ4129】Haruna’s Breakfast(樹上莫隊) 題面 BZOJ Description Haruna每天都會給提督做早餐! 這天她發現早飯的食材被調皮的 Shimakaze放到了一棵 樹

轉載python %s %d %f

number %d html out 綜合 bar cli OS 結果 %s 字符串 [python] view plain copy print? string="hello" #%s打印時結果是hello print "stri

思維Codeforces Round #485 (Div. 2) B. High School: Become Human(對數)

space scanf CA ace ima AC bsp ont http 題目鏈接:http://codeforces.com/contest/987/problem/B 在運算的時候取對數就好了 1 #include <bits/stdc++

codeforces 1028C Rectangles思維

圖片 ring truct col rectangle tor 中一 amp 存在 題目:戳這裏 題意:有n個矩陣,求一個點(保證存在)至少在n-1個點內。 解題思路:因為矩陣與坐標軸平行,所以我們畫圖可以發現如果存在點滿足條件,則這些點中一定有一個是矩陣的頂點。我們可以把

LOJ2316. 「NOIP2017」逛公園DP最短路思維

LINK 思路 因為我想到的根本不是網上的普遍做法 所以常數出奇的大,而且做法極其暴力 可以形容是帶優化的大模擬 進入正題: 首先一個很顯然的思路是如果在合法的路徑網路裡面存在零環是有無陣列解的 然後這個直接對所有邊權是0的邊進行一次toposort看看有沒有點沒有被訪問到 然後剩下的dp怎麼

UOJ22. UR #1外星人DP思維

LINK 題目大意 給你一個序列和一個值x 問你用某種方式對序列安排順序之後一次對x取mod膜的最大值和方案數 首先發現一個性質 一個數之後所有比它大的數都沒有貢獻 考慮怎麼利用這個性質? 就可以從小到大插入每一個數 然後就開開心心的發現每次插入的數如果有貢獻一定是在第一個,否則

JZOJ5793S練跑步BFS

題目大意: 題目連結:https://jzoj.net/senior/#main/show/5793 題目圖片: http://wx1.sinaimg.cn/mw690/0060lm7Tly1fvx7ksrc55j30j20dw3z4.jpg http://wx3.sinaimg.c

Codeforces Round #508 (Div. 2) D. Slime思維

D. Slime time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are 

牛客練習賽26 C 城市規劃思維

城市規劃 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld 題目描述 小a的國家裡有n個城市,其中第i和第i - 1個城市之間有無向道路連線,特殊的,第1個城市僅

codeforces 1037D驗證bfs序思維

【連結】 【題意】 給你一棵樹以及一個bfs序,問是否存在這個bfs序 【思路】 從給定的bfs序入手考慮 【程式碼】 #include<bits./stdc++.h> #define ll long long using namespace st

2018icpc北京網路賽數學貪心思維條件極值

【連結】 【題意】 已知 :sigma | ai |=r 最小化:sigma ((bi-ai)^2) 求每個ai 【分析】 將中心點移動到原點。相當於:要ai-1,顯然是大的那個數-1比較小。然後想象一下,最後的ai一般來說都是,幾個數都是最大的數,其餘數不改

CodeForces思維DP1060E-Sergey and Subway

CodeForces 1060E Sergey and Subway 前言 感謝Tiw_Air_OAO dalao對我的提示,使我從迷茫走向AC。 題目大意 給定一張有NNN個節點的樹形圖GGG,若圖

思維GCDHDU 5512 Pagodas

【題意】兩個人往集合中放數,放的數是已經有的數其中兩個數的和或者差,放的數不能小於1或大於n,放下最後一個數的人獲勝,給出n和最初在集合中的2個數,問誰獲勝。 【思路】用兩個數反覆做和差,最後總會出現一個等差數列,也就是說這個遊戲並沒有策略,無論怎麼玩結果都會是既定的。

CF605CFreelancer's Dreams-凸包

測試地址:Freelancer’s Dreams 題目大意: 有nnn項工作,每項工作有兩項屬性ai,bia_i,b_iai​,bi​,表示做111單位時間可以獲得aia_iai​的經驗和bib_ibi​的錢,現在要攢夠ppp的經驗和qqq的錢,且任意一個時刻只

C++%c,%s分別代表什麼意思

1.  這是C語言的格式輸出,%c,%s這些代表你要輸出的資料的資料型別:%d 十進位制有符號整數 。 這兩個符號分別用在輸入或者輸出函式中。比如:char c='A'; printf("%C\n",c);則此時控制檯會輸出字元A。 再看如下表達式: char s[25]=