zoukankan      html  css  js  c++  java
  • 【LOJ】 #2025. 「JLOI / SHOI2016」方

    题解

    有什么LNOI啊,最后都是JLOI罢了
    一道非常……懵逼的统计题
    当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个点坏掉的正方形
    总共的方案就是
    (sum_{i}^{min(n,m)}i * (n - i + 1) * (m - i + 1))
    至少有一个点坏掉的怎么统计,我们考虑这个点在底边,左边有l个坐标右边有r个坐标,上面有h个坐标
    (z = min(l + r,h))
    如果高度大于左右两边,那么总共的是(frac{z(z + 1)}{2} + z)
    如果有超出的部分,即(z > l),或(z > r)设差值为n,则多出去的就是(frac{n(n + 1)}{2})
    然后两两枚举点对,最后统计出来的3个点要除3,统计出来4个点的要除6

    代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <iostream>
    #include <map>
    #define MAXN 100005
    #define pii pair<int,int>
    #define fi first
    #define se second
    //#define ivorysi
    using namespace std;
    typedef long long int64;
    int N,M,K;
    pii P[2005];
    map<pii,bool> mmm;
    const int MOD = 100000007;
    int64 ans,cnt2,cnt3,cnt4;
    void sub(int l,int r,int h) {
        int z = min(l + r,h);
        ans -= 1LL * z * (z + 3) / 2;
        if(z > l) ans += 1LL * (z - l) * (z - l + 1) / 2;
        if(z > r) ans += 1LL * (z - r) * (z - r + 1) / 2;
        ans = (ans % MOD + MOD) % MOD;
    }
    bool in_range(int x,int l,int r) {
        if(x >= l && x <= r) return 1;
        return 0;
    }
    void check(pii A,pii B) {
        if(!in_range(A.fi,0,N) || !in_range(A.se,0,M) || !in_range(B.fi,0,N) || !in_range(B.se,0,M)) return;
        ++cnt2;
        int t = mmm.count(A) + mmm.count(B);
        if(t >= 1) ++cnt3;
        if(t >= 2) ++cnt4,++cnt3;
    }
    void Solve() {
        scanf("%d%d%d",&N,&M,&K);
        for(int i = 1 ; i <= K ; ++i) {
            scanf("%d%d",&P[i].fi,&P[i].se); 
            mmm[P[i]] = 1;
        }
    
        for(int i = 1 ; i <= min(N,M) ; ++i) {
            ans += 1LL * i * (N - i + 1) % MOD * (M - i + 1) % MOD;
            ans %= MOD;
        }
        for(int i = 1 ; i <= K ; ++i) {
            sub(P[i].fi,N - P[i].fi,P[i].se);
            sub(P[i].fi,N - P[i].fi,M - P[i].se);
            sub(P[i].se,M - P[i].se,P[i].fi);
            sub(P[i].se,M - P[i].se,N - P[i].fi);
            ans += min(P[i].fi,P[i].se);
            ans += min(P[i].fi,M - P[i].se);
            ans += min(N - P[i].fi,P[i].se);
            ans += min(N - P[i].fi,M - P[i].se);
            ans %= MOD;
        }
        for(int i = 1 ; i <= K ; ++i) {
            for(int j = i + 1 ; j <= K ; ++j) {
                int dx = P[i].fi - P[j].fi,dy = P[i].se - P[j].se;
                check(make_pair(P[i].fi - dy,P[i].se + dx),make_pair(P[j].fi - dy,P[j].se + dx));
                check(make_pair(P[i].fi + dy,P[i].se - dx),make_pair(P[j].fi + dy,P[j].se - dx));
    	    if(abs(dx) + abs(dy) & 1) continue;
    	    int x = (dx - dy) >> 1,y = (dx + dy) >> 1;
    	    check(make_pair(P[i].fi - x,P[i].se - y),make_pair(P[j].fi + x,P[j].se + y));
            }
        }
        ans += cnt2 - cnt3 / 3 + cnt4 / 6;
        ans = (ans % MOD + MOD) % MOD;
        printf("%lld
    ",ans);
    }
    int main() {
    #ifdef ivorysi
        freopen("f1.in","r",stdin);
    #endif
        Solve();
    }
    
  • 相关阅读:
    进度条加载后显示页面
    解决跨域问题
    js下IE和FF的一些兼容写法总结
    linux
    linux 批量替换文件内容
    DVWA-1.9之fileupload
    python库安装失败的解决方法
    python程序打包
    CF 1133C Balanced Team
    CF 1133B Preparation for International Women's Day
  • 原文地址:https://www.cnblogs.com/ivorysi/p/9187159.html
Copyright © 2011-2022 走看看