CF1086F Forest Fires
有点意思的题目
直接统计每个格子的val是非常难办的。很难知道每秒新出来多少个格子
设$F[i]$表示,前i时刻覆盖的格子的数量
则,$ans=\sum_{i=1}^T i*(F[i]-F[i-1])=T*F[T]-\sum_{i=0}^{T-1} F[i]$
考虑$\sum_{i=0}^{T-1} F[i]$怎么求
$F[i]$可以是矩形面积并,但是不能暴力求,T太大
一起求?
麻烦的事情自然是两个点代表的正方形在某个时刻相交了
考虑相交之后的面积并的式子,是一个容斥的式子,涉及的都是矩形面积的加减,
所以是一个关于T的二次函数!
而一共有$N^2$次相交
所以F图像是分段二次函数!!
对于每一段,可以3次插值求出表达式,然后求和。
每次插值就是一次矩形面积并了。
O(n^3logn)
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
int sub(int x,int y){return ad(x,mod-y);}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
using namespace Modulo;
namespace Miracle{
const int N=;
int n,T;
int X[N],Y[N]; int tmp[N];
int z[N];
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
struct node{
int ct,val;
int sum;
}t[*N];
void pushup(int x){
if(t[x].ct) t[x].sum=t[x].val;
else t[x].sum=t[x<<].sum+t[x<<|].sum;
}
void build(int x,int l,int r){
if(l==r){
t[x].ct=;t[x].sum=;
t[x].val=z[l]-z[l-];
// cout<<" val "<<l<<" "<<r<<" : "<<t[x].val<<endl;
return;
}
t[x].ct=;t[x].sum=;
t[x].val=z[r]-z[l-];
build(ls,l,mid);
build(rs,mid+,r);
}
void upda(int x,int l,int r,int L,int R,int c){
if(L<=l&&r<=R){
t[x].ct+=c;pushup(x);
return;
}
if(L<=mid) upda(ls,l,mid,L,R,c);
if(mid<R) upda(rs,mid+,r,L,R,c);
pushup(x);
}
struct qs{
int p,c;
int u,d;
qs(){}
qs(int pp,int cc,int dd,int uu){
p=pp;c=cc;d=dd;u=uu;
}
bool friend operator <(qs a,qs b){
return a.p<b.p;
}
}h[N];
ll calc(int tim){
// cout<<" calc *******"<<tim<<endl;
int ch=,cl=,cz=;
for(reg i=;i<=n;++i){
h[++ch]=qs(X[i]-tim,,Y[i]-tim,Y[i]+tim);
h[++ch]=qs(X[i]+tim+,-,Y[i]-tim,Y[i]+tim);
tmp[++cl]=Y[i]+tim;
tmp[++cl]=Y[i]-tim;
}
sort(h+,h+ch+);
sort(tmp+,tmp+cl+);
cl=unique(tmp+,tmp+cl+)-tmp-;
z[]=tmp[]-;
for(reg i=;i<=cl;++i){
z[++cz]=tmp[i];
if(i!=cl&&tmp[i+]!=tmp[i]+){
z[++cz]=tmp[i+]-;
}
}
// cout<<" zz "<<endl;
// prt(z,1,cz); build(,,cz);
ll ret=;
for(reg i=;i<=ch;++i){
if(i!=){
ret+=(ll)t[].sum*(h[i].p-h[i-].p);
}
h[i].u=lower_bound(z+,z+cz+,h[i].u)-z;
h[i].d=lower_bound(z+,z+cz+,h[i].d)-z;
// cout<<" u "<<h[i].u<<" d "<<h[i].d<<endl;
upda(,,cz,h[i].d,h[i].u,h[i].c);
// cout<<"after "<<i<<" sum "<<t[1].sum<<endl;
}
// cout<<"RETETETE "<<ret<<endl;
return ret%mod;//warning!!! % mod
}
int nr[*],num;
ll px[],py[];
int ping(int n){
return mul(n,n+,*n+,qm());
}
int main(){
rd(n);rd(T);
for(reg i=;i<=n;++i){
rd(X[i]);rd(Y[i]);
}
nr[++num]=;
for(reg i=;i<=n;++i){
for(reg j=i+;j<=n;++j){
int yu=max((abs(X[i]-X[j])+)/,(abs(Y[i]-Y[j])+)/);
nr[++num]=yu;
}
}
nr[++num]=T;
sort(nr+,nr+num+);
num=unique(nr+,nr+num+)-nr-; int ans=mul(T,calc(T));
// cout<<" ans "<<ans<<endl;
for(reg i=;i<=num;++i){
if(nr[i]==T) break;
int tot=;
int ti=nr[i];
while(ti-nr[i]<&&ti!=nr[i+]){
px[++tot]=ti;
py[tot]=calc(ti);
++ti;
}
// cout<<"tot----------- "<<tot<<endl;
// prt(py,1,tot);
if(tot<=){
for(reg j=;j<=tot;++j){
inc(ans,mod-py[j]);
}
}else{
// cout<<" TriTri ";
int A=,B=,C=;
for(reg j=;j<=tot;++j){
int lp=py[j];
int ss=,sc=;
for(reg k=;k<=tot;++k){
if(k==j) continue;
lp=mul(lp,qm(ad(px[j],mod-px[k])));
inc(ss,px[k]);
inc2(sc,px[k]);
}
A=ad(A,lp);
B=ad(B,mod-mul(lp,ss));
C=ad(C,mul(lp,sc));
}
int st=nr[i],nd=nr[i+]-;
inc(ans,mod-ad(mul(A,sub(ping(nd),ping(st-))),mul(B,(nd-st+),(nd+st),qm()),mul(C,(nd-st+))));
}
}
ot(ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
i*cnt,i每次+1,很套路
题意转化为求$\sum_{i=0}^{T-1} F[i]$
发现,$F[i]$是一个分段二次函数,然后插值!
CF1086F Forest Fires的更多相关文章
- @codeforces - 1086F@ Forest Fires
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个无穷大的方格图,每个方格内都种了棵树. 一开始点燃了 n 棵 ...
- Python 爬取所有51VOA网站的Learn a words文本及mp3音频
Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...
- 数据可视化(一)-Matplotlib简易入门
本节的内容来源:https://www.dataquest.io/mission/10/plotting-basics 本节的数据来源:https://archive.ics.uci.edu/ml/d ...
- 机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集
机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集 选自Microsoft www.tz365.Cn 作者:Lee Scott 机器之心编译 参与:李亚洲.吴攀. ...
- 每日英语:A Buying Guide to Air-Pollution Masks
Blue skies were finally visible in the capital on Thursday after the region suffered fromseven strai ...
- NCE2
1.A private conversation Last week I went to the theatre. I had a very good seat. The play was very ...
- New Concept English Two 21 55
$课文53 触电的蛇 544. At last firemen have put out a big forest fire in California. 消防队员们终于扑灭了加利福尼亚的一场森林大 ...
- L123
My heart, the bird of the wilderness, has found its sky in your eyes. 我的心是旷野的鸟,在你的双眼中找到了天空.His main ...
- BEC translation exercise 2
Forest fires are a regular feature of Chile's hot, arid summers.智利夏天炙热.干燥,常发生森林火灾.A nearly decade-lo ...
随机推荐
- w - 显示已经登录的用户以及他们在做什么
总览 (SYNOPSIS) w - [husfV] [user] 描述 (DESCRIPTION) w 显示 系统中 当前用户 的 信息, 以及 他们 的 进程. 第一行 中 依次 显示 当前时间, ...
- linux 磁盘与文件系统管理 (鸟哥私房菜)
各种接口磁盘在Linux中的文件名分别为 /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash随身碟等接口的磁盘文件名 /dev/hd[a-d][1-63]:为IDE接口的磁 ...
- 【胡策篇】题解 (UOJ 192 + CF938G + SPOJ DIVCNT2)
和泉纱雾与烟花大会 题目来源: UOJ 192 最强跳蚤 (只改了数据范围) 官方题解: 在这里哦~(说的很详细了 我都没啥好说的了) 题目大意: 求树上各边权乘积是完全平方数的路径数量. 这种从\( ...
- python 打印出水仙花数
打印出三位水仙花数方法及解释 num = 100while num <= 999: #这里num 小于等于999 则运行 填1000也可以 a = num % 10 #num对10取余 b = ...
- sql 生成javabean实体
select a.name,c.name,b.name,'private String '+lower(c.name)+';' from sysobjects a, systypes b, sysco ...
- hash值的计算与转换 分类: ACM TYPE 2015-05-07 17:49 36人阅读 评论(0) 收藏
#include <bits/stdc++.h> using namespace std; const int MAXN = 100; const int X = 3; long long ...
- java进行微信h5支付开发
最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...
- jquery的attr获取表单checked 布尔值问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- <pygame> 打飞机(小游戏)
0.游戏的基本实现 ''' 游戏的基本实现 游戏的初始化:设置游戏窗口,绘制图像的初始位置,设定游戏时钟 游戏循环:设置刷新频率,检测用户交互,更新所有图像位置,更新屏幕显示 ''' 1.安装pyga ...
- 13-MySQL-Ubuntu-数据表的查询-条件查询(二)
条件查询 1,比较查询(>,<,>=,<=,=)注:SQL查询语句的等于号(=) (1)查询学生表中年龄大于18岁的学生姓名和性别信息 select name,gender f ...