题目链接:点击查看

题目大意:初始时有一个二维平面, 平面上给出 n 条蛇,现在可以选择 m 条不同的蛇进行捕杀,当选择了某条蛇,其所在的坐标可以覆盖到的半径为 r 的范围内的蛇都会被捕杀,更确切的说,选择了位置 ( x , y ) 的蛇,那么 ( x - r , y - r ) ~ ( x + r , y + r ) 这个矩形内的蛇都会被捕杀,每条蛇都有自己的价值,每次捕杀的价值是(所有被捕杀的蛇的价值和)的平方,问所有方案的价值和是多少

题目分析:比较巧妙的一道容斥题目,首先看到平方应该顺着去思考,而不是我行我素的去思考每条蛇单独的贡献

利用完全平方公式将平方和拆开:

如果增加变量的个数,不难看出实际上也是两层 for 循环可以表达出来的一个求和公式

所以我们不妨去考虑每一对蛇 ( i , j ) 的贡献,直接求交集是比较困难的,但是正难则反,可以思考求交集的补集,那么利用容斥推一下公式:

  • 同时包含蛇 i 和蛇 j 的方案 = 总方案 - ( 不同时包含蛇 i 和蛇 j 的方案 )
  • 不同时包含蛇 i 和蛇 j 的方案 = 不包含蛇 i 的方案 + 不包含蛇 j 的方案 - 不包含蛇 i 也不包含蛇 j 的方案
  • 不包含蛇 i 也不包含蛇 j 的方案 = 不包括 { ( 蛇 i 的捕杀矩形 ) 与 ( 蛇 j 的捕杀矩形 ) 的并集 } 的方案 = { 全集 - ( 蛇 i 的捕杀矩形 ) 与 ( 蛇 j 的捕杀矩形 ) 的并集 } 的方案
  • ( 蛇 i 的捕杀矩形 ) 与 ( 蛇 j 的捕杀矩形 ) 的并集 = 蛇 i 后的捕杀矩形 +蛇 j 后的捕杀矩形 - ( 蛇 i 的捕杀矩形 与 蛇 j 的捕杀矩形 的面积交集 )

不难发现一步步递推是可以间接求出我们所想要求出的答案的,关于最后的那个矩形面积,用二维前缀和求一下就好了,其余的用组合数学求解一下即可

补充一下关于矩形的交集,实质上是两条线段的交集,这个在纸上稍微画一下就明白了

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e3+100;const int mod=1e9+7;int x[N],y[N],maze[N][N];LL fac[N],inv[N],b[N];LL q_pow(LL a,LL b)
{LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}LL C(int n,int m)
{if(n<m)return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}int cal(int x1,int y1,int x2,int y2)
{if(x1>x2||y1>y2)return 0;x1=max(x1,1),y1=max(y1,1);x2=min(x2,1000),y2=min(y2,1000);return maze[x2][y2]-maze[x2][y1-1]-maze[x1-1][y2]+maze[x1-1][y1-1];
}void init()
{fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;inv[N-1]=q_pow(fac[N-1],mod-2);for(int i=N-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.ans.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int n,m,r;scanf("%d%d%d",&n,&m,&r);for(int i=1;i<=n;i++){scanf("%d%d%lld",x+i,y+i,b+i);maze[x[i]][y[i]]++;}for(int i=1;i<=1000;i++)for(int j=1;j<=1000;j++)maze[i][j]+=maze[i-1][j]+maze[i][j-1]-maze[i-1][j-1];LL ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){LL res=b[i]*b[j]%mod;LL cnt=C(n,m);LL noi=C(n-cal(x[i]-r,y[i]-r,x[i]+r,y[i]+r),m);LL noj=C(n-cal(x[j]-r,y[j]-r,x[j]+r,y[j]+r),m);LL noij=C(n-cal(x[i]-r,y[i]-r,x[i]+r,y[i]+r)-cal(x[j]-r,y[j]-r,x[j]+r,y[j]+r)+cal(max(x[i]-r,x[j]-r),max(y[i]-r,y[j]-r),min(x[i]+r,x[j]+r),min(y[i]+r,y[j]+r)),m);cnt=((cnt-noi-noj+noij)%mod+mod)%mod;res=cnt*res%mod;ans=(ans+res)%mod;}printf("%lld\n",ans);return 0;
}

CodeForces - 1425D Danger of Mad Snakes(容斥+组合数学)相关推荐

  1. CF1425D Danger of Mad Snakes题解

    CF1425D Danger of Mad Snakes 题意:有一个1000∗10001000*10001000∗1000的地图,上面有一些蛇,第i条蛇在(xi,yi)(x_i,y_i)(xi​,y ...

  2. codeforces B. Friends and Presents(二分+容斥)

    题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分+容斥,二分找到v的值 ...

  3. Codeforces 1342E Placing Rooks(容斥+组合数学)

    题目链接:E. Placing Rooks 题意:给定一个N*棋盘,要求摆放n个rooks(国际象棋里能横竖走的那啥),使得每个格子都能被rooks攻击到,并且正好有k对rooks能相互攻击到,求有多 ...

  4. CodeForces 997C-Sky Full of Stars〖容斥定理+组合计数〗

    网页链接:传送门 C. Sky Full of Stars time limit per test : 4 seconds memory limit per test : 256 megabytes ...

  5. 51nod1667-概率好题【容斥,组合数学】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1667 题目大意 两个人. 第一个人有k1k_1k1​个集合,第iii个包 ...

  6. 【洛谷 P4921】—情侣?给我烧了!(加强版)(容斥+组合数学)

    传送门 接着之前的思路继续推 瓶颈在于预处理f(n)f(n)f(n) 考虑化一下 f(n)=∑j=0n(−1)j1j!2j1(n−j)!2(2n−2j)!=1n!2∑j=0n(−1)jj!2j(nj) ...

  7. 牛客 - 小朋友你是否有很多问号(容斥+组合数学)

    题目链接:点击查看 题目大意:先抛出公质数的定义,若数 num 与 m 个数都互质,则称 num 为 m 个数的 m元公质数 ,现在给出 n 个数和 m ,需要求出任意 m 个数的所有 m 元公质数( ...

  8. Codeforces 100548F - Color (组合数+容斥)

    题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...

  9. CodeForces - 1486F Pairs of Paths(树上计数+容斥)

    题目链接:点击查看 题目大意:给出一棵 nnn 个点的树,再给出 mmm 条路径,现在问有多少个路径对 (x,y)(x,y)(x,y),满足第 xxx 条路径和第 yyy 条路径有且仅有一个交点 题目 ...

最新文章

  1. VVOL、VASA — 为什么如此重要
  2. 关于Python类属性与实例属性的讨论
  3. Linux备份压缩命令
  4. c语言数据结构学习心得——线性表
  5. Packet Tracer 5.0 建构 CCNA 实验攻略——路由器实现 Vlan 间通信
  6. 简单聊聊Python协程
  7. php中文件读写总结,PHP中文件读写操作
  8. Lifetime of Objects
  9. NTV Media Server G3流媒体服务器搭建经验
  10. ElasticSearch学习(一):Linux环境准备
  11. pip和requests模块的安装
  12. c语言程序设计第三版朱立华主编课后答案,C语言程序设计习题解析与实验指导...
  13. 全国OA系统下载 (转)
  14. Kali Linux-MSF远控局域网手机
  15. 计算机二级九月试题office,9月计算机二级office题库及答案
  16. Android 9 禁用按住电源键+音量加键进入工厂测试(recovery模式)功能
  17. 用python输出圣诞树_教你怎样用Python画了一棵圣诞树,赶紧来学习
  18. 977.有序数组的平方
  19. 柔性机械臂的振动测量和控制研究进展综述
  20. 数学推理相关的几个名词及LaTeX用法

热门文章

  1. pytorch:多项式回归
  2. exc读入到matlab,matlab外部程序接口-excel
  3. linux twiki 添加权限,Linux安装TWiki
  4. MySQL高级 全表扫描更快
  5. Ribbon-负载均衡原理
  6. MySQL通信类型:同步或者异步
  7. 数据采集提升性能篇-使用Mybatis的批量操作api导入数据
  8. maven工程的标准目录结构
  9. Hystrix Health Indicator及Metrics Stream支持
  10. 线性表及其逻辑和存储结构(二级)