题意:

给定三个矩形,选定三个点,答案加上第一个点出发经过第二个点在第三个点结束的方案数,只能往右或往下走。

折腾了我半个多下午的题。

设三个矩形为$A,B,C$
一个思路是枚举$B$的那个点$s(x,y)$,求出$s$到$A$中所有点的方案数的和乘上$x$到$B$中所有点的方案数的和,复杂度爆炸。

$s$到$A$中所有点的方案数的和等于$$\sum_{i=x1}^{x2}\sum_{j=y1}^{y2} C_{x-i+x-j}^{x-i}$$

用二维前缀和的方法容斥一下,变成了求(顺便化简)$$\sum_{i=0}^{a}\sum_{j=0}^{b} C_{i+j}^{i}=C_{a+b+1}^{a+1}-1$$
复杂度变成了$O(N^2)$
然后发现那个化简完的组合数其实相当于$s$到一个固定的点(不随$s$改变)的方案数,相当于固定了起点,可以用同样的方法固定终点。
现在每条起点到终点的路径都有一个权值,相当于经过的$B$中的点的个数,答案就是所有路径权值和。
再把$B$容斥一下,让矩形的左上角为起点,这样就可以枚举走出矩形后的第一个点求权值和了。
复杂度$O(N*64)$

#include<cstdio>
#include<iostream>
#define ll long long
#define N 2000010
using namespace std;
const int p = 1000000007;
int jie[N],ni[N];
const int inf = 2000005;
int c(int m,int n)
{
return 1LL*jie[n]*ni[m]%p*ni[n-m]%p;
}
ll ans;
int ss(int x1,int y1,int x2,int y2,int x3,int y3)
{
int as=0;
for(int i=y1;i<=y2;i++)
{
(as+=1LL*c(x3-x2-1,x3-x2-1+y3-i)*c(x2-x1,x2-x1+i-y1)%p*(x2-x1+1+i-y1)%p)%=p;
}
for(int i=x1;i<=x2;i++)
{
(as+=1LL*c(y3-y2-1,y3-y2-1+x3-i)*c(y2-y1,y2-y1+i-x1)%p*(y2-y1+1+i-x1)%p)%=p;
}
return as;
}
int x1,x2,x3,x4,x5,x6;
int y1,y2,y3,y4,y5,y6;
int calc(int a1,int b1,int a2,int b2)
{
int as=0;
as+=ss(a1,b1,x4,y4,a2,b2);
as+=ss(a1,b1,x3-1,y3-1,a2,b2);as%=p;
as-=ss(a1,b1,x3-1,y4,a2,b2);
as-=ss(a1,b1,x4,y3-1,a2,b2);
return (as%p+p)%p;
}
int solve(int x,int y)
{
int as=0;
as+=calc(x,y,x6+1,y6+1);as+=calc(x,y,x5,y5);as%=p;
as-=calc(x,y,x6+1,y5);as-=calc(x,y,x5,y6+1);
return (as%p+p)%p;
}
int main()
{
jie[0]=ni[0]=ni[1]=1;
for(int i=1;i<=inf;i++)jie[i]=1LL*jie[i-1]*i%p;
for(int i=2;i<=inf;i++)ni[i]=1LL*(p-p/i)*ni[p%i]%p;
for(int i=2;i<=inf;i++)ni[i]=1LL*ni[i-1]*ni[i]%p;
scanf("%d%d%d%d%d%d",&x1,&x2,&x3,&x4,&x5,&x6);
scanf("%d%d%d%d%d%d",&y1,&y2,&y3,&y4,&y5,&y6);
ans+=solve(x1-1,y1-1);
ans+=solve(x2,y2);
ans-=solve(x1-1,y2);
ans-=solve(x2,y1-1);
ans=(ans%p+p)%p;
printf("%lld\n",ans);
return 0;
}

  

AtCoder Grand Contest 018 E Sightseeing Plan的更多相关文章

  1. AtCoder Grand Contest 018 D - Tree and Hamilton Path

    题目传送门:https://agc018.contest.atcoder.jp/tasks/agc018_d 题目大意: 给定一棵\(N\)个点的带权树,求最长哈密顿路径(不重不漏经过每个点一次,两点 ...

  2. AtCoder Grand Contest 018 A

    A - Getting Difference Time limit時間制限 : 2sec / Memory limitメモリ制限 : 256MB 配点 : 300 点 問題文 箱に N 個のボールが入 ...

  3. 【贪心】【堆】AtCoder Grand Contest 018 C - Coins

    只有两维的时候,我们显然要按照Ai-Bi排序,然后贪心选取. 现在,也将人按照Ai-Bi从小到大排序,一定存在一个整数K,左侧的K个人中,一定有Y个人取银币,K-Y个人取铜币: 右侧的X+Y+Z-K个 ...

  4. 【贪心】AtCoder Grand Contest 018 B - Sports Festival

    假设我们一开始选取所有的运动项目,然后每一轮将当前选择人数最多的运动项目从我们当前的项目集合中删除,尝试更新答案.容易发现只有这样答案才可能变优,如果不动当前选取人数最多的项目,答案就不可能变优. 我 ...

  5. 【GCD】AtCoder Grand Contest 018 A - Getting Difference

    从大到小排序,相邻两项作差,求gcd,如果K是gcd的倍数并且K<=max{a(i)},必然有解,否则无解. 可以自己手画画证明. #include<cstdio> #include ...

  6. AtCoder Grand Contest 018 A - Getting Difference

    A - Getting Difference Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement ...

  7. AtCoder Grand Contest 018题解

    传送门 \(A\) 根据裴蜀定理显然要\(k|\gcd(a_1,...,a_n)\),顺便注意不能造出大于\(\max(a_1,...,a_n)\)的数 int n,g,k,x,mx; int mai ...

  8. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  9. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

随机推荐

  1. 配置Nginx反向代理WebSocket,以代理noVNC为例

    什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器. Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮 ...

  2. Echarts学习求教

    有没有人用过百度的Echarts?刚开始接触,下面这段代码怎么理解啊,新手求指教: myChart.showLoading();$.get('data/asset/data/les-miserable ...

  3. beta阶段性能指标测试

    性能指标概况 安装耗时 启动耗时 CPU占用 内存占用 电池温度 网络流量 平均值 5.48s 1.04s 1.61% 18.68MB 32.44℃ 93.78B 峰值 131.74s 5.13s 5 ...

  4. linux及安全第五周总结

    给MenuOS增加time和time-asm命令 中间过程已省略了,我们所做的只是将menu更新 具体命令如下 rm menu -rf 强制删除 git clone http://github.com ...

  5. win10装MySQL5.7

    越来越发现装MySQL很费劲啊,装了N次,都很懵逼,找对的解决方案很重要. Mysql5.7下载地址:http://xiazai.zol.com.cn/detail/4/33431.shtml 安装步 ...

  6. 微信开发-charles抓包

    在微信开发过程中有一块不能使用开发者工具进行调试,需要查看请求的返回,故使用了charles抓包工具. 环境配置 1.http://www.charlesproxy.com/getssl/ 下载cha ...

  7. 我的github地址 https://github.com/1010de/Test.git

    构建之法老师叫交下任务学习github,经过一段时间的学习和了解,看介绍.看视频.看博客.初步认识到github的方便与好处.     自己试着去注册和使用github,已经慢慢学会了一些基本操作. ...

  8. Python学习笔记 -- 第五章

    模块 使用模块可以提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块: ...

  9. 四则运算APP

    1)   N (Need 需求) 用户基本需求:随机生成四则运算,能自动判定对错,答错时能提示正确答案! 在这个基础上,我的创意: 多用户模式,能记录用户的答题情况(登陆功能) 分级挑战,按照不同的水 ...

  10. Golang的格式化输出fmt.Printf

    本文来源:Go by example. Golang的格式化输出 和 C语言的标准输出基本一样,但是增加了一些针对Golang语言的特有数据结构的格式化输出方式. 一下就是实例: package ma ...