按照第一篇题解思路写的,结果根本没法判断重复情况,样例都没过。。。
代码:
#include<bits/stdc++.h>
#define N 2005
using namespace std;
int n,cnt;
struct Triangle{
int x,y,m;
friend bool operator<(const Triangle a,const Triangle b){
return a.x<b.x;
}
} ts[N];
bool cmpy(Triangle a,Triangle b){
return a.y<b.y;
}
vector<Triangle> vec;
struct Line{
int x,k;
friend bool operator<(const Line a,const Line b){
return a.x<b.x;
}
};
vector<Line> ls;
vector<int> yy;
int qsum(){
int sum=0,last=0,s=0;
for(int i=0;i<ls.size();i++){
if(!s) last=i;
if(!(s+ls[i].k)) sum+=ls[i].x-ls[last].x;
s+=ls[i].k;
}
return sum;
}
void put(int k){
ls.clear();
for(int i=0;i<vec.size();){
int x1=vec[i].x,x2=vec[i].x+vec[i].m-(yy[k]-yy[vec[i].y]);
ls.push_back({x1,1});ls.push_back({x2,-1});
if(x1==x2) vec.erase(vec.begin()+i);
else i++;
}
}
void add(int k){
while(ts[cnt].y==k){
vec.push_back(ts[cnt]);
int x1=ts[cnt].x,x2=ts[cnt].x+ts[cnt].m;
ls.push_back({x1,1});ls.push_back({x2,-1});
cnt++;
}
}
double ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d",&ts[i].x,&ts[i].y,&ts[i].m);
for(int i=1;i<=n;i++){
yy.push_back(ts[i].y);
yy.push_back(ts[i].y+ts[i].m);
}
sort(ts+1,ts+n+1);
for(int i=1;i<=n;i++){
Triangle p={ts[i].x+ts[i].m,0,0};
int t1=lower_bound(ts+1,ts+n+1,ts[i])-ts,t2=lower_bound(ts+1,ts+n+1,p)-ts;
for(int j=t1;j<=t2;j++){
int ny=ts[i].y+(ts[i].x+ts[i].m-ts[j].x);
if(ts[j].x>ts[i].x&&ts[j].x<ts[i].x+ts[i].m&&ny>ts[j].y&&ny<ts[j].y+ts[j].m) yy.push_back(ny);
}
}
sort(ts+1,ts+n+1,cmpy);
sort(yy.begin(),yy.end());
yy.resize(unique(yy.begin(),yy.end())-yy.begin());
for(int i=1;i<=n;i++) ts[i].y=lower_bound(yy.begin(),yy.end(),ts[i].y)-yy.begin();
int up=0,down=0;
for(int i=0;i<yy.size();i++){
put(i);
sort(ls.begin(),ls.end());
up=qsum();
if(i) ans+=(up+down)*(yy[i]-yy[i-1])/2.0;
add(i);
sort(ls.begin(),ls.end());
down=qsum();
}
printf("%.1lf",ans);
return 0;
}
@everyone