HDU 2461 Rectangles#容斥原理

http://acm.hdu.edu.cn/showproblem.php?pid=2461

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

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

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
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;
}
时间: 2024-08-02 07:00:18

HDU 2461 Rectangles#容斥原理的相关文章

[容斥原理] hdu 2461 Rectangles

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2461 Rectangles Time Limit: 5000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1268    Accepted Submission(s): 665 Problem Description You are developing a soft

GCD HDU - 1695 (容斥原理)

GCD HDU - 1695 题意:给你5个数a,b,c,d,k.x属于[a,b]y属于[c,d]. 问你有多少对(x,y)的公约数为k.  注意(x,y)和 (y,x)视为同一对,a和c为1. 通过b/k,d/k,等价于把区间除以k,那么就变成了求有多少对(x,y)互素. 欧拉函数+容斥原理. 注意k可能为0. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=1

HDU - 4135 Co-prime(容斥原理)

Question 参考 题意找出[a,b]中与n互质的数的个数分析通常我们求1-n中与n互质的数的个数都是用欧拉函数.但如果n比较大或者是求1-m中与n互质的数的个数等等问题,要想时间效率高的话还是用容斥原理.先对n分解质因数,分别记录每个质因数, 那么所求区间内与某个质因数不互质的个数就是 m/r(i),假设r(i)是r的某个质因子 假设只有三个质因子, 总的不互质的个数应该为p1+p2+p3-p1*p2-p1*p3-p2*p3+p1*p2*p3. pi代表m/r(i),即与某个质因子不互质的

HDU 2056 Rectangles(计算相交面积)

Rectangles Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 20183    Accepted Submission(s): 6537 Problem Description Given two rectangles and the coordinates of two points on the diagonals of e

hdu 5072 计数+容斥原理

/* 题意: 给出n个数(n<100000), 每个数都不大于100000,数字不会有重复.现在随意抽出3个,问三个彼此互质 或者 三个彼此不互质的数目有多少. 思路: 这道题的原型是同色三角形, 可能现场很多队伍都知道这个模型, 所以这道题当时过的队伍还是挺多的. 这道题反着想,就是三个数中只有一对互质 或者只有两对互质的个数. 研究后发现 对于每个数字求出与其不互质的个数k 那么 sum ( k*(n-1-k) )/2 就是相反的数目, 所以最终的答案就是 C(n,3) - sum ( k*

HDU 1695 GCD (容斥原理+质因数分解)

先进行预处理,对每一个数分解质因数. 然后将因为若gcd(x,y)==z,那么gcd(x/z,y/z)==1,又因为不是z的倍数的肯定不是,所以不是z的倍数的可以直接去掉,所以只要将b和d除以k,然后就转化成了求两个范围中互质的对数了.这时候可以枚举1~b,然后用容斥原理找1~d范围内的与枚举数互质的数的个数,为了避免重复,只要再限定下大小关系就可以了,具体见代码. 代码如下: #include <iostream> #include <string.h> #include <

hdu 5212(容斥原理)

Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 77    Accepted Submission(s): 27 Problem Description WLD likes playing with codes.One day he is writing a function.Howerver,his computer bre

Hdu 5514 Frogs (容斥原理)

题目链接: Hdu 5514 Frogs 题目描述: 有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 解题思路: 第一反应就是容斥,也是没谁了.但是重现赛的时候并没有做出来,自己写了一个容斥然后挂掉了,今天看到大神的方法,感觉这种处理方法有点神!(还是见的题目太少,太弱了) 第i只青蛙只能走到gcd(ai, m)的位置,我们就可以把m的因子提取出来,然后对青蛙能走到的因子位置打标记.青蛙能走到vis[i]因子位置就把vis[i]标记为

HDU 4135 Co-prime (容斥原理+质因数分解)

这题只要知道质因数的性质就很容易做了.任意一个正整数(除了1)都可以分解成有限个质数因子的乘积. 那么假如两个数互质,那么这两个数肯定至少各有一个对方没有的质因子.所以若一个数跟n不互质,那么这个的数的质因子肯定也都属于n的质因子,那么就用容斥原理求出所有跟n不互质的所有数的个数.然后再用总的减去即可. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue&g