博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2461 Rectangles#容斥原理
阅读量:4308 次
发布时间:2019-06-06

本文共 1598 字,大约阅读时间需要 5 分钟。

题目很简单,但是由于询问数M可以很大,所以容易超时,这道题学到了在结构体里面写函数的方法,这样子效率更高,否则的话,这道题就TLE了。

 

根据容斥原理,先把每个小长方形的面积加上,然后看有没有与该小长方形相交的,用dfs实现,当相交面积为0时,则不进行dfs,且同样遵循奇加偶减(但代码里因为是以第二个作为depth=1开始进行dfs的,所以是奇减偶加)。

 

AC代码:

#include
#include
#include
#include
using namespace std;struct Node{ int x1,x2,y1,y2; Node cross(Node &R) { Node tmp; tmp.x1=max(x1,R.x1); tmp.y1=max(y1,R.y1); tmp.x2=min(x2,R.x2); tmp.y2=min(y2,R.y2); return tmp; } int area() { if(x1>=x2||y1>=y2) return 0; return (x2-x1)*(y2-y1); }}node[25];int num,r[25],ans;void dfs(int depth,Node R,int index){ Node tmp; for(int i=index;i<=num;i++) { tmp=R.cross(node[r[i]]); if(tmp.area()) { if(depth&1) ans-=tmp.area(); else ans+=tmp.area(); dfs(depth+1,tmp,i+1); } }}int main(){ int n,m,cas=0; while(scanf("%d%d",&n,&m)&&n+m) { cas++; for(int i=1;i<=n;i++) scanf("%d%d%d%d",&node[i].x1,&node[i].y1,&node[i].x2,&node[i].y2); printf("Case %d:\n",cas); for(int i=1;i<=m;i++) { ans=0; scanf("%d",&num); for(int j=1;j<=num;j++) scanf("%d",&r[j]); for(int j=1;j<=num;j++) { ans+=node[r[j]].area(); dfs(1,node[r[j]],j+1); } printf("Query %d: %d\n",i,ans); } printf("\n"); } return 0;}

转载于:https://www.cnblogs.com/atmacmer/p/5293586.html

你可能感兴趣的文章
git add . git add -u git add -A区别
查看>>
apache下虚拟域名配置
查看>>
session和cookie区别与联系
查看>>
PHP 实现笛卡尔积
查看>>
Laravel中的$loop
查看>>
CentOS7 重置root密码
查看>>
Centos安装Python3
查看>>
PHP批量插入
查看>>
laravel连接sql server 2008
查看>>
Laravel 操作redis的各种数据类型
查看>>
Laravel框架学习笔记之任务调度(定时任务)
查看>>
laravel 定时任务秒级执行
查看>>
浅析 Laravel 官方文档推荐的 Nginx 配置
查看>>
Swagger在Laravel项目中的使用
查看>>
Laravel 的生命周期
查看>>
CentOS Docker 安装
查看>>
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Mysql出现Table 'performance_schema.session_status' doesn't exist
查看>>