題面傳送門
這道題到現在為止還只有我乙個人做出來,還是蠻高興的\(qwq\)
算了不說了,再說\(90\)分的\(zj\)會把我用唾沫星子淹死我的
想法\(1\):暴力列舉:列舉四個點,求這四個點之間的歐幾里得距離,看是否相等,相等即構成乙個正方形。大概\(30\)分。
想法\(2\):構造:列舉三個點,構造出第四個點,看是否存在,用\(map\)約50分,用\(hash\)約\(60\)分。
想法3:高階構造:列舉兩個點,構造出三四個點,用\(hash\)判斷是否存在。
那麼問題來了,怎麼構造第三第四個點?我們列舉的是對角線。這樣可以減少重複列舉。
如果有兩個點,\(midx\),\(midy\)為兩點連成的線的中點,即為正方形中點。
正方形中點到任意乙個頂點長度一樣,那麼過\(midx\),\(midy\)作\(y\)軸的垂線,將這個三角形旋轉,得到左邊的點的公式:\(midx-midy+y1\),\(midy+midx-x1\)
同理,得到右邊的點的公式:\(midx+midy-y1,midy-midx+x1\)
分類討論\(x1,\(x1>x2\),\(x1=x2\),\(y1,\(y1>y2\),\(y1=y2\),組合一下,得到了\(9\)種情況。
我們發現\(x1=x2\)和\(y1=y2\)可以合併到各類項中,於是我們得到另外一種討論:\(x1\leq x2\),\(x1\geq x2\),\(y1\leq y2\),\(y1\geq y2\),只有四種情況
於是我們很愉快的得到了四種情況的解(以下\(mid\)用\(m\)代替):
\(x_i\leq xj\),\(yi\leq yj\):
\(((mx-my+y_i),(my+mx-x_i)),((mx+my-y_i),(my-mx+x_i))\)
\(x_i\geq x_j\),\(y_i\geq y_j\):
\(((mx-my+y_j),(my+mx-x_j)),((mx+my-y_j),(my-mx+x_j))\)
\(x_i\leq x_j\),\(y_i\geq y_j\):
\(((mx-my+y_j),(my-mx+x_i)),((mx+my-y_j),(my+mx-x_i))\)
\(x_i\geq x_j\),\(y_i\leq y_j\):
\(((mx-my+y_i),(my-mx+x_j)),((mx+my-y_i,(my+mx-x_j))\)
但\(mx-my\)必須是整數,所以我們要特判一下。
**實現:
#include#includeusing namespace std;
int head,n,m,x[1039],y[1039],t,flag,h[100039];
double mx,my,nowx,nowy;
struct yyy f[100039];
inline int find(int x,int y)
if(tmp==-1) return 0;
else return 1;
}inline void get(int x,int y) ;
h[ans]=head;
}int main()
for(i=1;i<=n;i++)}}
if(x[j]>=x[i]&&y[j]>=y[i])}}
if(x[j]<=x[i]&&y[j]>=y[i])}}
if(x[j]>=x[i]&&y[j]=}}}
if(flag) break;
}printf("%d\n",flag);
}}
qzezoj 1568 反覆求和
題面傳送門 這道題首先要有乙個思維的轉換 對於選擇滿足0 i n0 leq i n 0 i n 的任意下標i ii 並讓a aa陣列裡下標為i ii處的值變為sum sumsu m。把賦值的思維轉化成選擇乙個下標,把除了這個下標的所有值加到它身上 這道題正著想很難想,俗話說得好,正難則反,所以我們不...
qzezoj 1540 糖果峽谷
題面傳送門 三十分 於是我只能重新想思路。然後就只得了35 3535 分。考試結束後老師叫我們自己去網上找題解,然而我發現,居然沒有任何一篇luo gu luogu luog u題解是正解。於是我準備發一篇題解來k kk掉luo gu luogu luog u所有題解。正解 我們先把這個峽谷想象成乙...
qzezoj 1543 最快路線
題面傳送門 看到這道題,想到spf aspfa spfa 但這道題好像故意的,偏偏又路牌被拆的道路 在衢州的話負責那一段路的交警就該 了 所以我們不能只以d id i di 為tim etime time 的唯一標準。想象一下 如果下一條路是沒有路牌的,而這時過來一條路,tim etime time...