求助×2!
  • 板块P1222 三角形
  • 楼主STUDENT00
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/12/12 20:00
  • 上次更新2023/10/24 07:51:52
查看原帖
求助×2!
658786
STUDENT00楼主2022/12/12 20:00

按照第一篇题解思路写的,结果根本没法判断重复情况,样例都没过。。。

代码:

#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

2022/12/12 20:00
加载中...