為了測試小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。...