JZOJ 4823 小W學物理

2021-07-24 04:39:06 字數 1790 閱讀 4659

為了測試小w的物理水平,mr.x在二維座標系中放了n面鏡子(鏡子座標絕對值不超過m),鏡子均與座標軸成45°角,所以一共有兩種型別「/」和「\」。原點不會有鏡子,任意一點最多只有一面鏡子。

鏡子兩個面都能反光,而中間不透光,例如,對於乙個「/」型鏡子,下方向射入的光線會被反射到右方向,左方向射入的光線會被反射到上方向。

現在有一條光線從原點沿x軸正方向射出,求走過t路程後所在位置。

直接模擬光的走法。

複雜度:o(

t)得分:25

模擬光在鏡子之間的跳躍,暴力o(n)找出下乙個跳到的鏡子是哪個,再加上找迴圈節的優化,也就是記錄一下以不同的方向到每個鏡子的距離(從起點),每次到達乙個新的鏡子時,看看之前以這個角度到達過沒,有則可以直接省略這個迴圈,即用剩下的步數模走完迴圈的步數。

複雜度:o(

n2)

得分:35

直接模擬光的走法(跟解法1差不多),加上解法2的找迴圈節。

複雜度:o(

m2)

得分:60

我們發現解法2的找下乙個鏡子這個過程很慢,於是我們優化一下,發現只要用兩個陣列,乙個以x為第一關鍵字、y為第二關鍵字,乙個以y為第一關鍵字,x為第二關鍵字,這樣找上下左右四個方向的第乙個鏡子就直接在這兩個陣列裡+1或-1即可。

複雜度:o(

n)得分:100

注意:有可能光乙個鏡子也沒有到達。

#include 

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

typedef

long

long ll;

const

int n=100500;

int read(int &n)

int n,ans;

struct qqwwa[n];

int s[n],h[n];

ll m,x,y,k,ms;

ll f[n][4];

int tn[4][2]=,,,};

bool px(int q,int w)

sort(s+1,s+1+n,px);fo(i,1,n)a[s[i]].s=i;

sort(h+1,h+1+n,px1);fo(i,1,n)a[h[i]].h=i;

a[0].x=a[0].y=q+10;

for(q=1;q<=n;q++)if(a[h[q]].y==0&&a[h[q]].x>0)break;

if(q>n)

q=h[q];

y=0;m-=(x=min(m,a[q].x));f[q][1]=ms-m;k=tn[1][a[q].k];

while(m)

int t=min(m,abs(a[w].y-a[q].y));

m-=t;y+=k*t;

if(f[w][k])m%=(ms-m-f[w][k]);

else f[w][k]=ms-m;

k=tn[k][a[w].k];q=w;

}else

int t=min(m,abs(a[w].x-a[q].x));

m-=t;x+=k*t;

if(f[w][k])m%=(ms-m-f[w][k]);else f[w][k]=ms-m;

k=tn[k][a[w].k];q=w;}}

printf("%lld %lld\n",x,y);

return

0;}

JZOJ4823 小W學物理

為了測試小w的物理水平,mr.x在二維座標系中放了n面鏡子 鏡子座標絕對值不超過m 鏡子均與座標軸成45 角,所以一共有兩種型別 和 原點不會有鏡子,任意一點最多只有一面鏡子。鏡子兩個面都能反光,而中間不透光,例如,對於乙個 型鏡子,下方向射入的光線會被反射到右方向,左方向射入的光線會被反射到上方向...

JZOJ4823 小W學物理

給定乙個二維平面,平面上有 n 個鏡子,每個鏡子都成45 角擺放。現從 0,0 沿x軸正方向射出一道光線,求經過 t 路程後,終點的座標。data constraint n 100000,t 1018 先排個序,然後預處理出每個鏡子四個方向上的第乙個鏡子是哪個點。然後在模擬地做一遍即可。需要注意,有...

小W的數字

如果設step n 表示n減到0的最小操作次數,顯然step有單調性。我們設f mx,n 表示把n減到0的最小操作次數,mx表示的是比n最高位還高的那些位的最大值。現在我們可以固定最高位,把剩餘位減到0,也就是遞迴計算,返回二元組 cost,dp 表示操作次數為cost,最終還可以額外減掉乙個dp。...