链接:https://www.nowcoder.com/acm/contest/163/F
来源:牛客网
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it
时间限制:C/C++ 3秒,其他语言6秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
There is a matrix A that has N rows and M columns. Each grid (i,j)(0 ≤ i < N, 0 ≤ j < M) is painted in white at first.
Then we perform q operations:
For each operation, we are given (x c, y c) and r. We will paint all grids (i, j) that meets to black.
You need to calculate the number of white grids left in matrix A.
Then we perform q operations:
For each operation, we are given (x c, y c) and r. We will paint all grids (i, j) that meets to black.
You need to calculate the number of white grids left in matrix A.
输入描述:
The first line of the input is T(1≤ T ≤ 40), which stands for the number of test cases you need to solve.
The first line of each case contains three integers N, M and q (1 ≤ N, M ≤ 2 x 10
4; 1 ≤ q ≤ 200), as mentioned above.
The next q lines, each lines contains three integers x
c, y
cand r (0 ≤ x
c< N; 0 ≤ y
c< M; 0 ≤ r ≤ 10
5), as mentioned above.
输出描述:
For each test case, output one number.
示例1
输出
复制729
0
题意还是比较简单的,给你n和m的格子让你去画圆,如果这个点在圆内,就要被染色,问你还剩多少点没有被染色
这个题目可以直接暴力扫描线,也就成了维护线段的并
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
vector<pair<int,int> >V[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=0; i<N; i++)V[i].clear();
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int j=0,x,y,r; j<q; j++)
{
scanf("%d%d%d",&x,&y,&r);
for(int i=max(0,y-r),d; i<=min(m-1,y+r); i++)
d=(sqrt(r*r-(y-i)*(y-i)+1e-6)),V[i].push_back(make_pair(max(0,x-d),min(x+d,n-1)));
}
int s=n*m;
for(int i=0; i<m; i++)
{
int l=V[i].size();
if(l>0)
{
sort(V[i].begin(),V[i].end());
int r=-1;
for(auto X:V[i])
{
if(X.second<=r)continue;
if(X.first>r) s-=X.second-X.first+1;
else s-=X.second-r;
r=X.second;
}
}
}
cout<<s<<"\n";
}
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4328957/blog/3861884