sdutoj-4219 Four-tuples 容斥原理(山东省省赛F题)

题意:

给定四个数,a,b,c,d;分别给定他们的区间,问满足 a != b && b != c && c != d && d != a 的情况数有多少

思路:

一眼容斥题,当时场上写错了,

一直觉得循环不等的关系之间会产生特殊的情况,就在纸上手推了一遍

发现就是按照普通的容斥 奇加偶减 就ok了,

令事件A = (a != b) , B =  (b != c), C = (c!=d), D = (d!=a);

那么 ans = (A&B&C&D) = sum - (A|B|C|D);

而容斥一下 t = (A|B|C|D),即:

t = ( A + B + C + D ) -  (A&B + A&C + A&D + B&C + B&D + C&D ) + (A&B&C + A&B&D + A&C&D + B&C&D) -  (A&B&C&B)

最后两个式子可以合并;

#include<cstdio>
#include<time.h>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;
typedef long long LL;
const LL mod = 1e9+7;

LL l1, r1, l2, r2, l3, r3, l4, r4;

LL d(LL l1, LL r1, LL l2, LL r2) {
  if(l2 > r1 || r2 < l1) return 0;
  if(l1 > l2) { swap(l1,l2); swap(r1,r2); }
  return max(0LL,(min(r1,r2)-l2+1));
}
LL d1(LL l1, LL r1, LL l2, LL r2, LL l3, LL r3) {
  if(l2 > r1 || r2 < l1) return 0;
  if(l1 > l2) { swap(l1,l2); swap(r1,r2); }
  l1 = l2; r1 = min(r1,r2);
  if(l3 > r1 || r3 < l1) return 0;
  if(l1 > l3) { swap(l1,l3); swap(r1,r3); }
  return max(0LL,(min(r1,r3)-l3)+1);
}

LL d2(LL l1, LL r1, LL l2, LL r2, LL l3, LL r3, LL l4, LL r4) {
  if(l2 > r1 || r2 < l1) return 0;
  if(l1 > l2) { swap(l1,l2); swap(r1,r2); }
  l1 = l2; r1 = min(r1,r2);
  if(l3 > r1 || r3 < l1) return 0;
  if(l1 > l3) { swap(l1,l3); swap(r1,r3); }
  l1 = l3, r1 = min(r1,r3);
  if(l4 > r1 || r4 < l1) return 0;
  if(l1 > l4) { swap(l1,l4); swap(r1,r4); }
  l1 = l4, r1 = min(r1,r4);
  return max(0LL,(min(r1,r4)-l4+1));
}

int main() {
  int T; scanf("%d", &T);
  while(T--) {
    scanf("%lld%lld%lld%lld%lld%lld%lld%lld", &l1, &r1, &l2, &r2, &l3, &r3, &l4, &r4);
    LL ans = (d(l1,r1,l1,r1)*d(l2,r2,l2,r2)%mod*d(l3,r3,l3,r3)%mod*d(l4,r4,l4,r4)%mod);

    ans = (ans - (d(l1,r1,l2,r2)*d(l3,r3,l3,r3)%mod*d(l4,r4,l4,r4)%mod) + mod) % mod;
    ans = (ans - (d(l2,r2,l3,r3)*d(l1,r1,l1,r1)%mod*d(l4,r4,l4,r4)%mod) + mod) % mod;
    ans = (ans - (d(l3,r3,l4,r4)*d(l1,r1,l1,r1)%mod*d(l2,r2,l2,r2)%mod) + mod) % mod;
    ans = (ans - (d(l4,r4,l1,r1)*d(l2,r2,l2,r2)%mod*d(l3,r3,l3,r3)%mod) + mod) % mod;

    ans = (ans +  d1(l1,r1,l2,r2,l3,r3)*d(l4,r4,l4,r4)%mod) % mod;
    ans = (ans +  d1(l1,r1,l2,r2,l4,r4)*d(l3,r3,l3,r3)%mod) % mod;
    ans = (ans +  d1(l1,r1,l4,r4,l3,r3)*d(l2,r2,l2,r2)%mod) % mod;
    ans = (ans +  d1(l4,r4,l2,r2,l3,r3)*d(l1,r1,l1,r1)%mod) % mod;
    ans = (ans + d(l1,r1,l2,r2)*d(l3,r3,l4,r4)) % mod;
    ans = (ans + d(l2,r2,l3,r3)*d(l4,r4,l1,r1)) % mod;

    ans = (ans - 3*d2(l1,r1,l2,r2,l3,r3,l4,r4)%mod + mod) % mod;
    printf("%lld\n", ans);
  }

  return 0;
}

猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/81635062