Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
24619 | baka24 | 【S】T1 | C++ | 运行超时 | 72 | 1000 MS | 292 KB | 2332 | 2024-01-08 14:29:16 |
#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=4010,ie9=1000000000; int n,ans,tot;bool a[MAXN][MAXN<<1],sbk2=0; struct point{ int x,y,l; }p[MAXN]; struct node{ int l,x; bool operator < (const node&G)const{ if(x!=G.x)return x<G.x; else return x+l<G.x+G.l; } }s[MAXN]; int bg[MAXN],ed[MAXN],mx,mn=ie9; bool cmp(point x,point y){return (x.x!=y.x)?x.x<y.x:x.y<y.y;} void slv(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].l); mx=max(mx,p[i].x+p[i].l);mn=min(mn,p[i].x); if(p[i].x+p[i].l>4000||p[i].y+p[i].l>4000)sbk2=0; } if(sbk2){ for(int k=1;k<=n;k++){ int x=p[k].x,y=p[k].y,l=p[k].l; for(int i=x,j=2*y+l*2;i<x+l;i++,j-=2){ a[i][2*y+1]^=1;a[i][j]^=1; } } for(int i=0;i<=4000;i++){ for(int j=0;j<=8000;j++){ a[i][j]^=a[i][j-1]; ans+=a[i][j]; } } printf("%.1f",1.0*ans/2); return; } sort(p+1,p+n+1,cmp); int k=1; for(int i=mn;i<=mx;i++){ while(k<=n&&p[k].x<=i){ s[++tot]={k,2*p[k].y+1}; s[++tot]={k+n,2*p[k].y+p[k].l*2}; k++; } sort(s+1,s+tot+1); for(int j=1;j<=tot;j++){ if(s[j].l>n)ed[s[j].l-n]=j; else bg[s[j].l]=j; } int lst=0;bool tmp=0; for(int j=tot;j>=1;j--){ if(s[j].x==-1)continue; // cout<<i<<" "<<lst<<" "<<s[j].x<<" "<<tmp<<" "<<s[j].l<<" "<<ans<<endl; ans+=(lst-s[j].x)*tmp; lst=s[j].x;tmp^=1; if(s[j].l==-1){ // cout<<"del"<<s[j].x<<endl; s[j].x=-1; } if(s[j].l>n){ // cout<<j<<":"<<s[j].x<<endl; if(s[bg[s[j].l-n]].x>=s[j].x-2){ // cout<<"del"<<s[j].x<<endl; // cout<<"godel"<<s[bg[s[j].l-n]].x<<endl; s[bg[s[j].l-n]].l=-1; s[j].x=-1; } else s[j].x-=2; } } } printf("%.1f",1.0*ans/2); } signed main(){ slv(); return 0; }