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