【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人
题解:hzw大神的博客说的很清楚嘛
朴素的做法就是每个点如果它不是墓地那么就可形成十字架的数量就是这个c(点左边的树的数量,k)*c(点右边的树的数量,k)*c(点上边的树的数量,k)*c(点下边的树的数量,k)。这样的话要枚举每个点,复杂度很明显爆表。
再仔细分析一下,其实完全可以不用枚举每个点,只需要枚举那些树的位置就可以,(下面的点指的都是树而非点??蒟蒻语言不好)在同一列的两棵相邻的树之间的点的c(点左边的树的数量,k)*c(点右边的树的数量,k)是一样的,但是还是需要Σc(点上边的树的数量,k)*c(点下边的树的数量,k)(乘法分配率,自己yy一下),朴素枚举这些还是要复杂度爆表,于是问题就是如果在logn时间内搞定这个东西,于是想到如果维护“Σc(点上边的树的数量,k)*c(点下边的树的数量,k)”的信息(询问区间和,想到树状数组或者线段树),(有点类似于那个悬梁法)就是这个点的上一个点和这个点之间的“c(点上边的树的数量,k)*c(点下边的树的数量,k)”是有一点联系的,yy一下就是这个点在下一行中是作为下面的点上面的树的数量……于是修改量就是c(原来上边的树的数量+1,k)*c(原来下边的树(其实包括了这个点也就是这棵树)的数量-1,k)- c(原来上边的树的数量,k)*c(原来下边的树(其实包括了这个点也就是这棵树)的数量,k)。
然后只需要在一开始离散化一下树,再给树排个序,就差不多了,还用到了前缀和小小的搞一下。
type
arr=record
x,y:longint;
end; const
mm=; var
i,j,kk,l,n,m,w,now,tot:longint;
a:array[..]of arr;
bit:array[..]of int64;
b,d,totx,toty,hash:array[..]of longint;
c:array[..,..]of int64;
ans,ans1,ans2,ans3:int64; procedure swap(var x,y:longint);
var
i:longint;
begin
i:=x;
x:=y;
y:=i
end; function min(x,y:longint):longint;
begin
if x>y then exit(y);
exit(x)
end; function lowbit(x:longint):longint;
begin
exit(x and (-x))
end; function find(x:longint):longint;
var
l,r,mid:longint;
begin
l:=;r:=tot;
while l<=r do begin
mid:=(l+r) >> ;
if hash[mid]<x then l:=mid+
else
if hash[mid]>x then r:=mid-
else exit(mid);
end
end; procedure work;
var
i,j:longint;
begin
c[][]:=;
for i:= to w do begin
c[i,]:=;
for j:= to min(kk,i) do
c[i,j]:=(c[i-,j]+c[i-,j-]) mod mm;
end
end; procedure qsort1(l,r:longint);
var
i,j,k,mid:longint;
begin
i:=l;
j:=r;
mid:=b[(l+r) >>];
repeat
while b[i]<mid do inc(i);
while b[j]>mid do dec(j);
if i<=j then begin
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort1(l,j);
if i<r then qsort1(i,r)
end; procedure qsort2(l,r:longint);
var
i,j,k,mid1,mid2:longint;
begin
i:=l;
j:=r;
mid1:=a[(l+r) >>].y;
mid2:=a[(l+r) >>].x;
repeat
while (a[i].y<mid1) or (a[i].y=mid1) and (a[i].x<mid2) do inc(i);
while (a[j].y>mid1) or (a[j].y=mid1) and (a[j].x>mid2) do dec(j);
if i<=j then begin
swap(a[i].x,a[j].x);
swap(a[i].y,a[j].y);
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort2(l,j);
if i<r then qsort2(i,r)
end; procedure add(x:longint;y:int64);
begin
while x<=tot do begin
bit[x]:=(bit[x]+y) mod mm;
inc(x,lowbit(x));
end
end; function ask(x:longint):int64;
var
sum:int64;
begin
sum:=;
while x> do begin
sum:=(sum+bit[x]) mod mm;
dec(x,lowbit(x));
end;
exit(sum)
end; begin
readln(n,m);
readln(w);
fillchar(totx,sizeof(totx),);
fillchar(toty,sizeof(toty),);
fillchar(d,sizeof(d),);
fillchar(bit,sizeof(bit),);
fillchar(c,sizeof(c),);
fillchar(hash,sizeof(hash),);
for i:= to w do begin
read(a[i].x,a[i].y);
b[*i-]:=a[i].x;
b[*i]:=a[i].y;
end;
qsort1(,*w);
hash[]:=b[];
tot:=;
for i:= to *w do
if b[i]<>b[i-] then begin
inc(tot);
hash[tot]:=b[i];
end;
read(kk);
work;
for i:= to w do begin
inc(totx[find(a[i].y)]);
inc(toty[find(a[i].x)]);
end;
qsort2(,w);
now:=;
ans:=;
for i:= to w do begin
j:=find(a[i].x);
if (i>) and (a[i].y=a[i-].y) then begin
inc(now);
ans1:=ask(j-)-ask(find(a[i-].x)) mod mm;
ans2:=c[now,kk]*c[totx[find(a[i].y)]-now,kk] mod mm;
ans:=(ans+ans1*ans2) mod mm;
end else now:=;
inc(d[j]);
ans3:=(c[d[j],kk]*c[toty[j]-d[j],kk]-c[d[j]-,kk]*c[toty[j]-d[j]+,kk])mod mm;
if ans3<> then add(j,ans3);
end;
if ans< then ans:=ans+mm;
writeln(ans);
end.
【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人的更多相关文章
- BZOJ 1227: [SDOI2009]虔诚的墓主人
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1078 Solved: 510[Submit][Stat ...
- Bzoj 1227: [SDOI2009]虔诚的墓主人 树状数组,离散化,组合数学
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 895 Solved: 422[Submit][Statu ...
- BZOJ 1227 [SDOI2009]虔诚的墓主人 - 扫描线
Solution 离散化 扫描线, 并用 $rest[i]$ 和 $cnt[i]$ 记录 第$i$列 总共有 $cnt[i]$棵常青树, 还有$rest[i]$ 没有被扫描到. 那么 第$i$ 列的方 ...
- 1227: [SDOI2009]虔诚的墓主人
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1083 Solved: 514[Submit][Stat ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1433 Solved: 672[Submit][Stat ...
- 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)
[BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
随机推荐
- iOS 中的正则表达式符号
最近重新看了一遍 iOS 的正则文档,简单翻译下文档中涉及到的符号 1.正则表达式元字符 符号 说明 \a 响铃, \u0007 \A 匹配输入的开始,只匹配第一行,也就是忽略多行选项 \b 不在[] ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比
第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好H ...
- 使用navicat连接Mysql8.0出现2059错误
一. 进入MySQL,打开要用navicat连接的数据库 二.打开运行以下代码: ALTER USER 'root'@'localhost' IDENTIFIED BY '你的mysql密码' PAS ...
- 无法嵌入互操作类型“ADOX.CatalogClass”。请改用适用的接口。
编译环境:vs2013 系统报错:无法嵌入互操作类型"ADOX.CatalogClass".请改用适用的接口. 解决方法:选中项目中引入的dll(本例中为Microsoft ADO ...
- go通过第三方库 mahonia gbk 转utf8
go get github.com/axgle/mahonia dec := mahonia.NewDecoder("GBK")ret:=dec.ConvertString(res ...
- [JSON].remove( keyPath )
语法:[JSON].remove( keyPath ) 返回:无 说明:移除指定路径的键 示例: Set jsonObj = toJson("{div:{'#text-1': 'is tex ...
- hexo部署失败如何解决
- Maven编译Java项目
Spring在线参考文档: http://spring.io/guides/gs/maven/ 下载安装 Downloadand unzip the source repository for thi ...
- kubernetes相关
1.获取client , api-server 加token 或in-cluster方式 2.所有对象均有list update get 等方法 3.对象属性源码追踪,yaml与源码一一对应 4.一些 ...
- LeetCode - 389. Find the Difference - 三种不同解法 - ( C++ ) - 解题报告
1.题目大意 Given two strings s and t which consist of only lowercase letters. String t is generated by r ...