欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

codeforces C. Count Triangles

程序员文章站 2022-07-15 16:09:31
...

codeforces C. Count Triangles

题目

题意:

给你A,B,C,DA,B,C,D,并且有AxByCzDA\leq x\leq B\leq y\leq C\leq z \leq D,问有多少个x+y>zx+y>z

思路:

对于x+y>zx+y>z,如果遍历的话x,yx,y的话,肯定就会超时了,因为对于每一个xx,如果加上yy全部yy的话,那么对应的区间就是[x+B,x+C][x+B,x+C],我们就可以用一个前缀和维护求出最后的x+yx+y的所有区间,然后我们要知道有多少x+y>zx+y>z那么我们遍历一下zz,然后求出再算一个前缀和代表着在ii前有多少个x+yix+y\leq i,那么iizz代替,那么我们求出x+y>zx+y>z那么是不是就是amaxn1aza_{maxn-1}-a_z

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <deque>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
template <class T>
inline void read(T &ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return ;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1:1;
    ret = (c == '-') ? 0:(c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return ;
}
inline void out(ll x) {
    if (x > 9) out(x / 10);
    putchar(x % 10 + '0');
}
const int maxn = 1e6 + 10;
ll cnt[maxn] = {0};
int main() {
    int A, B, C, D;
    read(A), read(B), read(C), read(D);
    for (int i = A; i <= B; i++) {
        cnt[i + B]++;
        cnt[i + C + 1]--;
    }
    for (int i = 0; i < maxn; i++) cnt[i] += cnt[i - 1];
    for (int i = 0; i < maxn; i++) cnt[i] += cnt[i - 1];
    ll ans = 0;
    for (int i = C; i <= D; i++) {
        ans += 1ll * (cnt[maxn - 1] - cnt[i]);
    }
    out(ans);
    return 0;
}

相关标签: codeforces