JZOJ4823 小W學物理

2021-07-24 04:34:30 字數 1523 閱讀 6564

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

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

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

結論1:如果光線不形成環,那麼每面鏡子至多經過兩次。

結論2:如果光線形成環,那麼光線通過反射後一定重新經過原點。

那麼直接模擬光線走到哪即可。

注意特判一些情況。

資料水,不判環可以過。

#include

#include

#include

#include

#define fo(i,j,k) for(int i=j;i<=k;i++)

#define fd(i,j,k) for(int i=j;i>=k;i--)

#define n 100001

#define ll long long

using namespace std;

struct nodea[n],zx[n],zy[n];

int cx[n],cy[n];

ll bz[n][2][2];

bool cmpx(node x,node y)

bool cmpy(node x,node y)

ll abss(ll x)

node pp;

int main()

sort(a+1,a+n+1,cmpx);

fo(i,1,n) a[i].c=i;

sort(a+1,a+n+1,cmpy);

fo(i,1,n) cx[a[i].c]=i,a[i].c=i;

sort(a+1,a+n+1,cmpx);

fo(i,1,n) cy[a[i].c]=i;

sort(zx+1,zx+n+1,cmpx);

sort(zy+1,zy+n+1,cmpy);

int p=0,q=0;

fo(i,1,n)

if(zy[i].y==0 && zy[i].x>0)

ll s=zx[p].x,ss;

if(s>=t || !p)

int z=zx[p].z,fx=1;

bz[p][fx][1]=s;

while(s

s; if(fx==1)

s+=abss(zx[p].y-zx[q].y);

if(s>=t)

fx=0;

}else

s+=abss(zx[p].x-zx[q].x);

if(s>=t)

fx=1;

}int zz=z;

if(zz==-1) zz++;

if(bz[p][fx][zz])

bz[p][fx][zz]=s;

z*=zx[p].z;

}}

JZOJ 4823 小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。...