拆分-洛谷P2745 [USACO5.3]窗体面积Window Area
来源:互联网 发布:wine下载 ubuntu 编辑:程序博客网 时间:2024/06/14 04:05
https://www.luogu.org/problem/show?pid=2745
本来因为会WA的,结果AC了,啊哈哈哈哈哈哈哈哈哈
因为题目要求我们要把一个个平面有先后关系,那么我们就搞一个队列嘛,每次询问时,不断把平面上升就好了;
但是一个平面被另一个平面挡住一部分,剩下的可以简单得理解为4个部分:
上下左右
111122
111122
440022
440022
443333
443333
如图,大矩形被小矩形(以0表示),可以分为1 2 3 4 个部分;
我给大家一个正确的程序
表示矩形A左上角(x1,y1)右下角(x2,y2)被矩形B(xy同理)遮挡后的面积;
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define Ll long longusing namespace std;int ans,x1,y1,x2,y2,x3,y3,x4,y4,xx,yy,xxx,yyy;void pd(int x,int y,int xx,int yy){ if(x==xx||y==yy)return; ans+=(xx-x)*(yy-y);}int main(){ cin>>x1>>y1>>x2>>y2; cin>>x3>>y3>>x4>>y4; if(x3>=x2||y3>=y2||x4<=x1||y4<=y1){ ans+=(x2-x1)*(y2-y1); }else if(x1>=x3&&x2<=x4&&y1>=y3&&y2<=y4){ ans=0; }else{ pd(x1,y1,max(x3,x1),min(y4,y2)); pd(x1,min(y2,y4),min(x2,x4),y2); pd(min(x2,x4),max(y1,y3),x2,y2); pd(max(x3,x1),y1,x2,max(y1,y3)); } cout<<ans;}
AC代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<map>#define Ll long longusing namespace std;map<char,int>F;int a[1000][4];string s;char c;int ll,k,lll,ans;void dfs(int x1,int y1,int x2,int y2,int k){ //printf("%d %d %d %d %d\n",x1,y1,x2,y2,k); if(x1==x2||y1==y2)return; if(k>ll){ ans+=(x2-x1)*(y2-y1);return; } int x3=a[k][0],y3=a[k][1],x4=a[k][2],y4=a[k][3]; if(x3>=x2||y3>=y2||x4<=x1||y4<=y1){ dfs(x1,y1,x2,y2,k+1);return; } if(x1>=x3&&x2<=x4&&y1>=y3&&y2<=y4)return; dfs(x1,y1,max(x3,x1),min(y4,y2),k+1); dfs(x1,min(y2,y4),min(x2,x4),y2,k+1); dfs(min(x2,x4),max(y1,y3),x2,y2,k+1); dfs(max(x3,x1),y1,x2,max(y1,y3),k+1);}int main(){ ll=100; lll=101; while(cin>>s){ c=s[2]; if(s[0]=='w'){ ll++; F[c]=ll; k=4; for(int i=0;i<=3;i++){ while(isdigit(s[k])){ a[ll][i]=a[ll][i]*10+s[k]-48;k++; } k++; } int x=a[ll][0],y=a[ll][1],xx=a[ll][2],yy=a[ll][3]; a[ll][0]=min(x,xx);a[ll][1]=min(y,yy); a[ll][2]=max(x,xx);a[ll][3]=max(y,yy); }else if(s[0]=='t'){ k=F[c]; ll++; for(int i=0;i<=3;i++)a[ll][i]=a[k][i],a[k][i]=1e8; F[c]=ll; }else if(s[0]=='b'){ k=F[c]; lll--; for(int i=0;i<=3;i++)a[lll][i]=a[k][i],a[k][i]=1e8; F[c]=lll; }else if(s[0]=='d'){ k=F[c]; for(int i=0;i<=3;i++)a[k][i]=1e8; F[c]=0; }else{ ans=0; k=F[c]; dfs(a[k][0],a[k][1],a[k][2],a[k][3],k+1); k=(a[k][2]-a[k][0])*(a[k][3]-a[k][1]); double kill=double(ans)/double(k); kill*=double(100); printf("%.3lf\n",kill); } }}
1 0
- 拆分-洛谷P2745 [USACO5.3]窗体面积Window Area
- usaco5.3.2 Window Area
- USACO5.3.2 Window Area (window)
- USACO5.3.2 Window Area(window)
- [USACO5.3.2] 窗体面积 - 矩形切割
- Window Area
- Area(poj1654多边形面积)
- The area面积计算
- 【平面面积】HDU1071The area
- [USACO5.3]校园网
- poj 1654 Area 多边形面积
- POJ 1654 Area 多边形面积
- POJ 1654 Area 多边形面积
- POJ 1654 Area (多边形面积)
- POJ 1654 Area(多边形面积)
- poj1654--Area(几何求面积)
- POJ 1654 Area [多边形面积]
- POJ1654-Area(多边形面积)
- JAVA--I/O流实现文件的复制
- MySQL Group Replication 介绍
- 关于“QQ安全组件异常”的解决办法
- 程序设计-控制台对战版五子棋
- 1.24
- 拆分-洛谷P2745 [USACO5.3]窗体面积Window Area
- 初识springIOC
- 在Java中调用存储过程(详细)
- CSS之换行
- elasticsearch bulk操作
- 运行Maven项目:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- 开始安卓死丢丢自学的第一天
- Linux系统unzip解压后中文名乱码解决方法
- 大数据知识总结