[2018.10.20 T2] 面包
暂无链接
面包
【问题描述】
小 X 有一块N∗MN*MN∗M的巨大面包,上面有KKK个葡萄干,第iii个葡萄干的位置在第AiA_iAi行BiB_iBi列,任意两个葡萄干都不在同一位置。
现在小 X 的朋友小 C 来了,小 X 要从这块面包上切下呈矩形的一块给小 C。但是如果切下来的面包上一个葡萄干都没有,小 X 会很没面子,于是小 X 的一个合法的切割方案要满足切下的部分是含有至少一个葡萄干的矩形。现在小 X 想知道:所有合法的切割方案切下的部分包含葡萄干的个数的方差是多少?为了方便,请输出答案对998,244,353998,244,353998,244,353取模的结果,保证数据是在一定范围内随机生成的。
【输入格式】
第一行,三个正整数N,MN,MN,M和KKK 。
接下来KKK行,每行两个整数AiA_iAi和BiB_iBi 。
【输出格式】
一行,包含一个非负整数,表示答案对998,244,353998,244,353998,244,353取模的结果。
注意,你的答案应该在[0,998,244,353)[0,998,244,353)[0,998,244,353)的范围内。
【输入输出样例 1】
bread. in
1 2 2
1 1
1 2
bread.out
887328314
【输入输出样例说明 1】
有三种合法方案,其中两种方案包含一个葡萄干,一种方案包含两个葡萄干,所以方差为92\frac{9}{2}29,对998244353998244353998244353取模得到887328314887328314887328314
【输入输出样例 2】
见下发文件中的bread2.in/bread2.outbread2.in/bread2.outbread2.in/bread2.out。
【输入输出样例 3】
见下发文件中的bread3.in/bread3.outbread3.in/bread3.outbread3.in/bread3.out。
【数据范围与约定】
对于所有的数据,1≤N,M≤1091≤N,M≤10^91≤N,M≤109;1≤K≤min(N∗M,2000)1≤K≤min(N*M,2000)1≤K≤min(N∗M,2000);1≤Ai≤N1≤A_i≤N1≤Ai≤N;1≤Bi≤M1≤B_i≤M1≤Bi≤M。
对于每个子任务的特殊限制:
Subtask1(20pts): N,M≤10N,M≤10N,M≤10;
Subtask2(25pts): N,M≤100N,M≤100N,M≤100;
Subtask3(15pts): K≤3K≤3K≤3;
Subtask4(40pts): 无特殊限制。
题解
按照我不知道的一个套路,我们先化简一波方差的式子,设xix_ixi为第iii个合法矩形中的点数,nnn为合法的矩形个数:
∑(xi−x‾)2n=∑(xi2−2xix‾+x‾2)n=∑xi2n−2∑xix‾n+∑x‾2n=∑xi2n−2nx‾2n+nx‾2n=∑xi2n−x‾2\begin{aligned} &\frac{\sum(x_i-\overline x)^2}{n}\\ =&\frac{\sum(x_i^2-2x_i\overline x+\overline x^2)}{n}\\ =&\frac{\sum x_i^2}{n}-\frac{2\sum x_i\overline x}{n}+\frac{\sum\overline x^2}{n}\\ =&\frac{\sum x_i^2}{n}-\frac{2n\overline x^2}{n}+\frac{n\overline x^2}{n}\\ =&\frac{\sum x_i^2}{n}-\overline x^2\\ \end{aligned} ====n∑(xi−x)2n∑(xi2−2xix+x2)n∑xi2−n2∑xix+n∑x2n∑xi2−n2nx2+nnx2n∑xi2−x2
第二个东西非常好求,我们直接枚举每个点,看它对几个矩形有贡献,就求到了∑xi\sum x_i∑xi;第一个东西又要用到一个套路,xi2x_i^2xi2相当于一个矩形里的点对数(包括自己跟自己),我们只需要O(k2)O(k^2)O(k2)枚举点对,看它们对几个矩形产生了贡献,就能统计出∑xi2\sum x_i^2∑xi2。
那么问题来了,nnn怎么求?
我们可以先枚举右下角的行数,在那一行上从左到右加入在右下角上面的点,维护一个左上角坐标范围的单调栈,就能统计出有多少个矩形包含了至少一个点,大致如下图:
单调栈维护之后:
愉快地统计出nnn之后当然要愉快的ACACAC啦。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=2005,mod=998244353;
struct sd{int x,y;}ptx[M],pty[M],sta[M];
int sum[M],tot,top,sum1,sum2,n,m,k;
bool cmpy(sd a,sd b){return a.y==b.y?a.x>b.x:a.y<b.y;}
bool cmpx(sd a,sd b){return a.x<b.x;}
ll power(ll x,ll p){ll r=1;for(;p;p>>=1,x=x*x%mod)if(p&1)r=r*x%mod;return r;}
void in(){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=k;++i)scanf("%d%d",&ptx[i].x,&ptx[i].y),pty[i]=ptx[i];}
void ac()
{for(int i=1;i<=k;++i)(sum1+=1ll*ptx[i].x*(n-ptx[i].x+1)%mod*ptx[i].y%mod*(m-ptx[i].y+1)%mod)%=mod;for(int i=1;i<=k;++i)for(int j=1;j<=k;++j)(sum2+=1ll*min(ptx[i].x,ptx[j].x)*(n-max(ptx[i].x,ptx[j].x)+1)%mod*min(ptx[i].y,ptx[j].y)%mod*(m-max(ptx[i].y,ptx[j].y)+1)%mod)%=mod;sort(ptx+1,ptx+1+k,cmpx);sort(pty+1,pty+1+k,cmpy);ptx[k+1].x=n+1;for(int i=k,j,tmp;i>=1;--i)if(ptx[i].x!=ptx[i+1].x){for(top=0,tmp=0,j=1;j<=k;++j){if(pty[j].x>ptx[i].x)continue;(tmp+=1ll*sum[top]*(pty[j].y-sta[top].y)%mod)%=mod;for(;pty[j].x>sta[top].x&⊤--top);sta[++top]=pty[j];sum[top]=(sum[top-1]+1ll*pty[j].x*(pty[j].y-sta[top-1].y)%mod)%mod;}(tot+=1ll*(tmp+1ll*sum[top]*(m-sta[top].y+1)%mod)*(ptx[i+1].x-ptx[i].x)%mod)%=mod;}tot=power(tot,mod-2);printf("%lld",(1ll*sum2*tot%mod-1ll*sum1*tot%mod*sum1%mod*tot%mod+mod)%mod);
}
int main(){in(),ac();}
[2018.10.20 T2] 面包相关推荐
- c语言哥德巴赫数学猜想,哥德巴赫数学猜想“1+1”是怎么回事,你知道吗?丨2018/10/20...
每天写一篇日记,雷打不动 2018年10月20日星期六,上午晴下午阴 [目 录] 何雷西奥日记 今天有点小确幸,在不经意中让我遇见了著名的哥德巴赫猜想. 然后,又让我搞明白了这个数学猜想的基本内容 ...
- ROS_Kinetic_01 在 Ubuntu 16.04 安装ROS Kinetic 全教程附资料和镜像 2018.10.20更新
Exbot易科机器人实验室新站点(测试中):http://server.blackant.org:23452/ 2018 ROS Melodic的迷失与救赎::https://blog.csdn.ne ...
- 【联考第一场2018.10.20】
前言 今天虽然题目难度不大,但是我打爆了. 虽然一开始都想到正解,但后来都没打出来,不敢浪,就先打了个暴力,就第一题直接打的正解. 但是翻车了...第一题只有5分,原因是期望算的最大概率,cmp排序用 ...
- ssl提高组周六备考赛【2018.10.20】
前言 er-竟然卡读入输出还不给快读qwq 成绩 有些dalao被老师拉去USACO了,所以没有 HJW应该去jzoj做题了 RankRankRank PersonPersonPerson Score ...
- AI前导课-第一课AI概览(2018/10/20)
AI概览 一.人工智能技术的过去 1.人工智能发展简史 2.符号主义 (1) • 符号主义(逻辑主义.心理学派.计算机学派) – 原理:物理符号系统假设和有限合理性原理. – 起源:源于数理逻辑. – ...
- 【2018.10.20】noip模拟赛Day3 二阶和
今年BJ省选某题的弱化版-- 这看起来就没那么难了,有几种方法维护,这里提两种. 第一种(傻逼的我写的) 维护 一维&二维前缀和. 对于一个长度为$m$的序列$b_1,b_2,...,b_m$ ...
- 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码 转载于: ...
- 《惢客创业日记》2018.10.20(周六) 作为主播给喜马拉雅FM的三个建议(上)
今天,大部分时间都用来处理<惢客创业日记>的音频修改和校验工作,既然想好好做,就尽量不要去投机,还是老老实实的把自己的创业日记写好吧. 另外,今天的工作计划中还有一项任务是对喜马拉雅FM的 ...
- 【NOIP2018模拟赛2018.10.20】蒲公英的约定
题目 题解 –这一看就是数论题...个鬼呀 发现最后要使异或值为0,那lastans必须要等于c 然后又因为lastans^ c=b <=> lastans=b ^ c 所以我们倒着异或, ...
- 「COCI 2018.10.20」Teoretičar
题目链接 如果知道 X X X 可能有一些网络流的做法,但是在此题中网络流也显得不够高效.设最大度数为 D D D,可以构造找到一个 X = 2 ⌈ log 2 D ⌉ X=2^{\lceil \ ...
最新文章
- Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
- CynosDB技术详解——存储集群管理【文末有福利】
- hdu4302 set或者线段树
- python编程神器下载_Python编程神器 -程序员必备开发手册
- JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法
- 作业1#python用列表实现多用户登录,并有三次机会
- linux 在文件中增加空行,linux – 在不同组的行之间添加空行
- 谷歌浏览器设置默认Flash
- python 请在微信客户端打开_(未解决)jmeter报错之“请在微信客户端打开链接”
- 小学C++编程入门书籍及相关资料介绍(一)
- 什么是MTTF,MTBF,MTRF?
- NGS数据分析实践:06. 数据预处理 - 序列比对+PCR重复标记+Indel区域重比对+碱基质量重校正
- OSPF —— 多区域部署 + ABR + ASBR + 路由重分发
- 跨境追踪(ReID)多粒度网络(MGN)详解及代码实现(1)
- 虚拟机配置网络(Linux)
- 数据库查询所有表及实现拼接清表sql
- 创造天赋:达·芬奇的7种天才特质
- 解析授人以渔的创新steam教学模式
- Dou学网-影视号起号视频教程
- java中汉字究竟占几个字节?