【CodeForces - 144B 】Meeting (暴力枚举,水题,计算几何)
題干:
The Super Duper Secret Meeting of the Super Duper Secret Military Squad takes place in a Super Duper Secret Place. The place is an infinite plane with introduced Cartesian coordinate system. The meeting table is represented as a rectangle whose sides are parallel to the coordinate axes and whose vertexes are located at the integer points of the plane. At each integer point which belongs to the table perimeter there is a chair in which a general sits.
Some points on the plane contain radiators for the generals not to freeze in winter. Each radiator is characterized by the number?ri?— the radius of the area this radiator can heat. That is, if the distance between some general and the given radiator is less than or equal to?ri, than the general feels comfortable and warm. Here distance is defined as Euclidean distance, so the distance between points?(x1,?y1)?and?(x2,?y2)?is?
Each general who is located outside the radiators' heating area can get sick. Thus, you should bring him a warm blanket. Your task is to count the number of warm blankets you should bring to the Super Duper Secret Place.
The generals who are already comfortable do not need a blanket. Also the generals never overheat, ever if they are located in the heating area of several radiators. The radiators can be located at any integer points on the plane, even inside the rectangle (under the table) or on the perimeter (directly under some general). Even in this case their radius does not change.
Input
The first input line contains coordinates of two opposite table corners?xa,?ya,?xb,?yb?(xa?≠?xb,?ya?≠?yb). The second line contains integer?n?— the number of radiators (1?≤?n?≤?103). Then?n?lines contain the heaters' coordinates as "xi?yi?ri", the numbers are separated by spaces. All input data numbers are integers. The absolute value of all coordinates does not exceed?1000,?1?≤?ri?≤?1000. Several radiators can be located at the same point.
Output
Print the only number — the number of blankets you should bring.
Examples
Input
2 5 4 2 3 3 1 2 5 3 1 1 3 2Output
4Input
5 2 6 3 2 6 2 2 6 5 3Output
0Note
In the first sample the generals are sitting at points:?(2,?2),?(2,?3),?(2,?4),?(2,?5),?(3,?2),?(3,?5),?(4,?2),?(4,?3),?(4,?4),?(4,?5). Among them, 4 generals are located outside the heating range. They are the generals at points:?(2,?5),?(3,?5),?(4,?4),?(4,?5).
In the second sample the generals are sitting at points:?(5,?2),?(5,?3),?(6,?2),?(6,?3). All of them are located inside the heating range.
題目大意:
? ? 一張長方形桌子的四個頂點全部在整數點位置,桌子的四條邊上每個整數點(x,y) (x,y都是整數)位置有一把椅子,代表有一個人,當使用加熱器在桌子周圍加熱時,問有幾個人不在加熱范圍之內。
? ? 輸入時每組數據首先給出兩個點的坐標,代表一張桌子的對角線的端點,桌子的邊與坐標軸平行,然后輸入一個n,代表有n個加熱器,接下來n行每行輸入三個數x,y,r,代表這個加熱器的坐標和加熱半徑。
解題報告:
剛開始還以為是在整個矩形內部都有點,但是看了樣例發現是在矩陣的邊上、、、所以要結合樣例理解題目啊
? ? 一個加熱器可以確定一個圓,判斷每個人是否在圓內或圓上;輸出不在圓內或圓上的人的個數即可。遍歷這個矩形的邊長跑一邊就好了,時間復雜度O(4*n^2)大概。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int x1,x2,y1,y2; int n,ans; int x[1005],y[1005],r[1005]; int main() {cin>>x1>>y1>>x2>>y2;//x1,y1,左下 cin>>n;for(int i = 1; i<=n; i++) {scanf("%d%d%d",x+i,y+i,r+i);}if(x1 > x2) swap(x1,x2);if(y1 > y2) swap(y1,y2);int j=y1;for(int i = x1; i<=x2; i++) {for(int k = 1; k<=n; k++) {if((i-x[k])*(i-x[k]) + (j-y[k])*(j-y[k]) <= r[k]*r[k]) {ans++;break;}}}j=y2;for(int i = x1; i<=x2; i++) {for(int k = 1; k<=n; k++) {if((i-x[k])*(i-x[k]) + (j-y[k])*(j-y[k]) <= r[k]*r[k]) {ans++;break;}}} j = x1;for(int i = y1 + 1; i<=y2-1; i++) {for(int k = 1; k<=n; k++) {if((i-y[k])*(i-y[k]) + (j-x[k])*(j-x[k]) <= r[k]*r[k]) {ans++;break;}}}j = x2;for(int i = y1 + 1; i<=y2-1; i++) {for(int k = 1; k<=n; k++) {if((i-y[k])*(i-y[k]) + (j-x[k])*(j-x[k]) <= r[k]*r[k]) {ans++;break;}}} // cout << ans << endl;printf("%d\n", (x2-x1+1)*2 + (y2-y1-1)*2 - ans);return 0 ; }?
總結
以上是生活随笔為你收集整理的【CodeForces - 144B 】Meeting (暴力枚举,水题,计算几何)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《原神》开发商米哈游拿着50亿买理财被割
- 下一篇: 舒适度超埃尔法 华为、小康打造的问界M7