Defense Construction bzoj 2300, bzoj2300
Defense Construction (1 s 512 MB) defense
[Problem description]
Recently, conflicts between country A and country B have intensified. In order to prevent unexpected events, Country A is preparing to build A long line of defense. Of course, if A line of defense is built, the city to be protected must be built inside the line of defense. However, the upper layer of country A is still hesitant. Which cities should be used as protection targets? Due to the limited funding of country A, I hope you can help with the following tasks:
1. Give the coordinates of all your country A Cities
2. After discussion on the upper layer of country A, considering the economic issue, the company decided to cancel the protection for city I, that is, city I does not need to be protected by the defense line.
3. Ask the upper layer of country A about the minimum total cost of building defense lines for the remaining cities to be protected.
You need to answer each query. Note that the defense cost per unit 1 is 1.
The terrain of country A is like this. The X axis is A river, which is equivalent to A natural line of defense. You do not need to build it again.
Country A always has two cities by the river. One is (0, 0) and the other is (n, 0). the abscissa of all other points is greater than 0 and less than n, the ordinate values are greater than 0. A is not in the capital of (0, 0) and (n, 0.
The three cities (0, 0), (n, 0) and capital must be protected.
In, A, B, C, D, E point for the city of A, and currently all want to protect, then the construction of the line of defense will be A-B-C-D, the cost is the length of the Line AB + the length of the Line BC + the length of the line CD
If point B's protection is revoked at this time, the defense will become
[Input format]
In the first row, the three integers n, x, and y indicate the riverside cities and capitals (0, 0), (n, 0), (x, y) respectively ).
The second row is an integer m.
In the next m row, each row has two integers, a and B, indicating that the coordinates of A non-capital non-riverside city in country a are (a, B ).
The next integer q represents the total number of modifications and inquiries.
Next, each row in the q row is either 1 I or 2, indicating that the protection and inquiry of the I city are revoked.
[Output format]
One row is output for each query. A real number v indicates the cost of building the defense line. two decimal places are reserved.
[Example input]
4 2 1
2
1 2
3 2
5
2
1 1
2
1 2
2
[Sample output]
6.47
5.84
4.47
[Data Scope]
30% of Data m <= 1000, q <= 1000
100% of Data m <= 100000, q <= 200000, n> 1
The coordinates of all vertices are within 10000, and the data guarantee has no focus.
Question:
Main algorithms: Set; calculation ry; fast sorting;
The question is to support deleting points to maintain an upper Convex Shell.
Because only the delete point operation is supported
In this case, the offline reverse processing becomes a bit operation.
If you want to add a point in a convex hull, You can discard it ······
If this point is outside the convex hull
Consider the points on the left and right sides respectively.
Maintain convex hull in two directions
This process is implemented using set.
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<cmath> 7 #include<set> 8 using namespace std; 9 inline int Get() 10 { 11 int x = 0; 12 char c = getchar(); 13 while('0' > c || c > '9') c = getchar(); 14 while('0' <= c && c <= '9') 15 { 16 x = (x << 3) + (x << 1) + c - '0'; 17 c = getchar(); 18 } 19 return x; 20 } 21 const int me = 200233; 22 int n, m, x, y, e; 23 int nu; 24 double sum; 25 struct dot 26 { 27 int x, y; 28 inline bool operator < (const dot &z) const 29 { 30 if(x != z.x) return x < z.x; 31 return y < z.y; 32 } 33 }; 34 dot o; 35 dot a[me]; 36 int flag[me]; 37 bool vis[me]; 38 int num[me]; 39 double ans[me]; 40 multiset<dot> c; 41 inline double Dis(const int &ax, const int &ay, const int &bx, const int &by) 42 { 43 return sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by)); 44 } 45 inline int Cross(const int &ax, const int &ay, const int &bx, const int &by) 46 { 47 return ax * by - bx * ay; 48 } 49 inline void Add(dot v) 50 { 51 multiset<dot>::iterator l = c.upper_bound(v), r = l; 52 --l; 53 if(Cross((r -> x) - (l -> x), (r -> y) - (l -> y), v.x - (l -> x), v.y - (l -> y)) <= 0) return; 54 sum -= Dis((l -> x), (l -> y), (r -> x), (r -> y)); 55 multiset<dot>::iterator now; 56 while(l != c.begin()) 57 { 58 now = l; 59 --l; 60 if(Cross(v.x - (l -> x), v.y - (l -> y), (now -> x) - (l -> x), (now -> y) - (l -> y)) >= 0) 61 { 62 ++l; 63 break; 64 } 65 sum -= Dis((now -> x), (now -> y), (l -> x), (l -> y)); 66 c.erase(now); 67 } 68 while(true) 69 { 70 now = r; 71 ++r; 72 if(r == c.end()) 73 { 74 --r; 75 break; 76 } 77 if(Cross(v.x - (r -> x), v.y - (r -> y), (now -> x) - (r -> x), (now -> y) - (r -> y)) <= 0) 78 { 79 --r; 80 break; 81 } 82 sum -= Dis((now -> x), (now -> y), (r -> x), (r -> y)); 83 c.erase(now); 84 } 85 c.insert(v); 86 sum += Dis((l -> x), (l -> y), v.x, v.y) + Dis(v.x, v.y, (r -> x), (r -> y)); 87 } 88 int main() 89 { 90 o.x = o.y = 0; 91 c.insert(o); 92 o.x = n = Get(); 93 c.insert(o); 94 o.x = x = Get(); 95 o.y = y = Get(); 96 c.insert(o); 97 m = Get(); 98 sum = Dis(0, 0, x, y) + Dis(x, y, n, 0); 99 for(int i = 1; i <= m; ++i)100 {101 a[i].x = Get();102 a[i].y = Get();103 }104 e = Get();105 for(int i = 1; i <= e; ++i)106 {107 flag[i] = Get();108 if(flag[i] == 1)109 {110 num[i] = Get();111 vis[num[i]] = true;112 }113 }114 for(int i = 1; i <= m; ++i)115 if(!vis[i])116 Add(a[i]);117 for(int i = e; i >= 1; --i)118 {119 if(flag[i] == 1) Add(a[num[i]]);120 else ans[++nu] = sum;121 }122 for(int i = nu; i >= 1; --i)123 printf("%.2lf\n", ans[i]);124 }