格子手绢

Description

久城送给维多利加一块苏格兰格子手绢,可是手绢不小心被咖啡弄脏了,久城不得不负起清洗的责任。
手绢的格子可以用二维坐标系来描述,手绢左下角坐标为 (0,0) ,右上角坐标为 (N,M) ,也就是说,手绢上一共有 N×M 个格子。咖啡在手绢上形成了一个圆形的污点,圆心位于整点 (X,Y) 处,半径为 R 。久城想知道,有多少个格子被完全污染了,多少个格子被部分污染了。
这里,某个格子被“完全污染”的意思为该格内被污点覆盖面积 1 ,被“部分污染”的意思为 0 该格内被污点覆盖面积 1

Input

一行 5 个整数 N,M,X,Y,R

Output

一行两个整数,由一个空格隔开,表示被完全污染的格子数量和被部分污染的格子数量。

Sample Input

2 2 0 0 2

Sample Output

1 3

数据范围

对于 100% 的数据, N,M1000000,0XN,0YM,R1000000 .

Solution

可意会不可言传

#include<bits/stdc++.h>
using namespace std;

#define N 1000001
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drp(i, a, b) for (int i = a; i >= b; i--)
#define fech(i, x) for (int i = 0; i < x.size(); i++)
#define ll long long

inline int read() {
    int x = 0, flag = 1; char ch = getchar(); while (!isdigit(ch)) { if (!(ch ^ '-')) flag = -1; ch = getchar(); }
    while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); return x * flag;
}

inline void write(int x) {
    if (!x) { puts("0"); return; } if (x < 0) putchar('-'), x = -x;
    char buf[30] = ""; int top = 0; while (x) buf[++top] = x % 10 + '0', x /= 10; while (top) putchar(buf[top--]);
}

ll n, m, X, Y, R, u, d, ans1, ans2;
double l[N], r[N];

int main() {
    scanf("%lld%lld%lld%lld%lld", &n, &m, &X, &Y, &R); u = min(m, Y + R), d = max(0ll, Y - R);
    rep(i, d, u) {
        l[i] = X - sqrt(R * R - (ll)(Y - i) * (Y - i));
        r[i] = min((double)n, (X << 1) - l[i]);
        if (l[i] < 0) l[i] = 0;
    }
    rep(i, d, Y - 1) {
        int l1 = ceil(l[i]), r1 = floor(r[i]); //全包含
        int l2 = floor(l[i + 1]), r2 = ceil(r[i + 1]);
        ans1 += r1 - l1;
        ans2 += l1 - l2 + r2 - r1;
    }
    rep(i, Y, u - 1) {
        int l1 = floor(l[i]), r1 = ceil(r[i]);
        int l2 = ceil(l[i + 1]), r2 = floor(r[i + 1]);
        ans1 += r2 - l2;
        ans2 += l2 - l1 + r1 - r2;
    }
    printf("%lld %lld", ans1, ans2);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值