BZOJ 2731: [HNOI2012]三角形覆盖问题

来源:互联网 发布:联想数据恢复中心电话 编辑:程序博客网 时间:2024/06/07 05:20

VFK大爷太神辣%%%%%%%%

神犇就是厉害,从小就会暴力过题

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=10000+5;struct tri{int x,y,d,l,r;bool operator < (const tri &rhs)const{return y<rhs.y;}}t[N];int pre[N],next[N];void del(int x){pre[next[x]]=pre[x];next[pre[x]]=next[x];}void ins(int x,int y){pre[next[x]]=y;next[y]=next[x];pre[y]=x;next[x]=y;}int head,tail,nowh;bool ins(int x){if(!t[x].d)return false;for(int i=next[head];i!=tail;i=next[i])if(t[i].x<=t[x].x&&t[x].x+t[x].d-1<=t[i].x+t[i].d-1-(t[i].d-nowh))return false;ins(head,x);return true;}int cover[N*100];int main(){//freopen("a.in","r",stdin);int n;scanf("%d",&n);int mx=0;for(int i=1;i<=n;i++){scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].d);mx=max(mx,t[i].y+t[i].d);t[i].l=t[i].x;t[i].r=t[i].x+t[i].d-1;}sort(t+1,t+1+n);int ans=0;head=0;tail=n+1;pre[next[head]=tail]=head;int last=0,j=1;for(int i=t[1].y;i<=mx;i++){int now=last;for(int k=next[head];k!=tail;k=next[k]){cover[t[k].r]--;if(!cover[t[k].r])now--;t[k].r--;if(t[k].r<t[k].l)del(k);}ans+=now+last;while(j<=n&&t[j].y==i){if(ins(j)){for(int k=t[j].x;k<t[j].x+t[j].d;k++){if(!cover[k])now++;cover[k]++;}}j++;}last=now;}printf("%.1lf\n",double(ans)/2.0);return 0;}


0 0
原创粉丝点击