bzoj 2727: [HNOI2012]双十字
Description
在C 部落,双十字是非常重要的一个部落标志。所谓双十字,如下面两个例子,由两条水平的和一条竖直的“1”线段组成,要求满足以下几个限制:
我们可以找到 5 个满足条件的双十字,分别如下:
注意最终的结果可能很大,只要求输出双十字的个数 mod 1,000,000,009 的值
Input
Output
Sample Input
6 8
12
1 2
1 3
1 4
1 6
2 2
3 2
3 3
3 4
3 7
6 4
6 6
4 8
Sample Output
HINT
Source
跟这个题断断续续鏖战了几天了,首先在考场上想了一个n^3的暴力,然后智障的枚举的是每一列。。。
然后变成了三维偏序(j>top)并且那个东西(top不一样)还不好用树状数组维护,然后傻逼压常,结果vector葬送前程。。。
其实枚举一个个连续的纵轴会好做很多,枚举每一个纵轴的话,在一个纵轴上top都是一样的,然后就是二维偏序,树状数组维护即可。。。
具体做法:
对于每个点求出heng[i],down[i],up[i],即横着扩展的长度,往下扩展的长度,往上扩展的长度。。。(我是个sb第一个数组是用二分+前缀和找的)
然后考虑暴力的枚举两个十字的中心,然后分情况讨论一下上下的长度能有多少个组合是合法的,然后再乘以上下多余的长度。。。
设上面的heng为l1,下面的heng为l2,上面往上扩展的长度为s,下面往下扩展的长度为x。。。
题解链接:http://blog.csdn.net/thy_asdf/article/details/50450561(实在是不想用公式编辑器写了)
然后计算的话就是一堆等差数列求和,记得把每一项都展开(即把只和j有关的放在一起维护,一定要细心),然后用树状数组维护一下,贼恶心。。。
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<map>
#include<vector>
#define RG register
#define int long long
using namespace std;
typedef long long ll;
const int N=3000050;
const int rhl=1000000009;
vector<int> Map[30000],id[30000];
int R,C,n;
int heng[N],down[N],up[N],tt,sum[200000];
ll ans,inv[10],tr[50050][5],T=40000,xu=10000,q[N],res;
inline void pre(int g){
memset(sum,0,sizeof(sum));
for(RG int i=1;i<=C;i++) sum[i]=sum[i-1]+Map[g][i];
}
inline int query_left(int i){
RG int l=1,r=i,ret=i;
while(l<=r){
int mid=(l+r)>>1;
if(sum[i]-sum[mid-1]==(i-mid+1)) r=mid-1,ret=mid;
else l=mid+1;
}
return i-ret;
}
inline int query_right(int i){
RG int l=i,r=C,ret=i;
while(l<=r){
int mid=(l+r)>>1;
if(sum[mid]-sum[i-1]==(mid-i+1)) ret=mid,l=mid+1;
else r=mid-1;
}
return ret-i;
}
inline void work_heng(int g){
for(int i=1;i<=C;i++){
if(Map[g][i]){
int l1=query_left(i),l2=query_right(i);
heng[id[g][i]]=min(l1,l2);
}
}
}
inline void work_down(int g){
for(RG int i=R-1;i>=1;i--){
if(Map[i][g]){
if(Map[i+1][g]) down[id[i][g]]=down[id[i+1][g]]+1;
}
}
}
inline void work_up(int g){
for(RG int i=2;i<=R;i++){
if(Map[i][g]){
if(Map[i-1][g]) up[id[i][g]]=up[id[i-1][g]]+1;
}
}
}
inline int calc(ll sx,ll mx){return (sx+mx)*(mx-sx+1)%rhl*inv[2]%rhl;}
inline ll qpow(ll a,ll b){ll ans=1; while (b){ if (b&1) (ans*=a)%=rhl; (a*=a)%=rhl,b>>=1; } return ans; }
inline void update(int x,int val,int type){
x+=xu;
for(int i=x;i<=T;i+=i&-i) tr[i][type]+=val;
}
inline int query(int x,int type){
int ret=0;x+=xu;
for(int i=x;i;i-=i&-i) ret+=tr[i][type];
return ret;
}
inline void work(int i,int g,int top,int type){
int L=heng[id[i-1][g]];
update(L,(i-1-top)*type,1);
update(L,L*(i-1-top)*type,2);
update(L,L*L*(i-1-top)*type,3);
update(L,calc(1,L-1)*(i-1-top)*type,4);
}
inline void solve(int g){
int top=1,la=1+down[id[1][g]];
while(1){
if(la>R) break;
for(int i=top;i<=la;i++){
ll l=heng[id[i][g]],x=down[id[i][g]];
(ans+=(query(C,1)-query(l,1))%rhl*calc(1,l-1)*x%rhl)%=rhl;
ans+=(l*query(l,2)-query(l,3)+query(l,4))*x;
if(i>top){
q[++res]=i;work(i,g,top,1);
}
}
for(int i=1;i<=res;i++) work(q[i],g,top,-1);
top=la+1;res=0;
while(top<=R&&Map[top][g]==0) top++;
la=top+down[id[top][g]];
}
}
main(){
scanf("%lld%lld%lld",&R,&C,&n);
inv[2]=qpow(2,rhl-2);
for(RG int i=1;i<=R;i++) Map[i].push_back(0),id[i].push_back(0);
for(RG int i=1;i<=R;i++)
for(RG int j=1;j<=C;j++)
++tt,Map[i].push_back(1),id[i].push_back(tt);
for(int i=1;i<=C;i++) Map[R+1].push_back(0),id[R+1].push_back(0);
for(RG int i=1;i<=n;i++){
int x,y;scanf("%lld%lld",&x,&y);Map[x][y]=0;
}
for(RG int i=1;i<=R;i++) pre(i),work_heng(i);
for(RG int i=1;i<=C;i++) work_down(i);
for(RG int i=1;i<=C;i++) work_up(i);
for(RG int i=1;i<=C;i++) solve(i);
printf("%lld\n",ans);
return 0;
}
bzoj 2727: [HNOI2012]双十字的更多相关文章
- BZOJ 2727 双十字(树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2727 题意: 思路:思路来自这里.首先对于每个位置(i,j)用C[i][j]表示该位置同 ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2734: [HNOI2012]集合选数 状压DP
2734: [HNOI2012]集合选数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 560 Solved: 321[Submit][Status ...
- bzoj 2733: [HNOI2012]永无乡 离线+主席树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1167 Solved: 607[Submit][Status ...
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...
- BZOJ 2730: [HNOI2012]矿场搭建( tarjan )
先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- [HNOI2012]双十字
题目描述 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的”1“线段组成,要求满足以下几个限制: ![] 我们可以找到 5 个满足条件的双十字,分别如下 ...
随机推荐
- java如何声明一个数组用来存储随机生成的字母并且保证不重复
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px ...
- ionic3中 ion-datetime 全屏可点击问题解决方案
废话不多说,能进来的都应该知道是个什么情况.我也是在网上找了一段时间,才在git上ionic官方团队的Issues中找到了问题解决方法. 第一,给外围包上一层ion-item,但是这有个问题,就是会让 ...
- caioj 1237: 【最近公共祖先】树上任意两点的距离 在线倍增ST
caioj 1237: [最近公共祖先]树上任意两点的距离 倍增ST 题目链接:http://caioj.cn/problem.php?id=1237 思路: 针对询问次数多的时候,采取倍增求取LCA ...
- Python创建二维数组(关于list的一个小坑)
0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...
- select联动遇到的问题
今天写了个select下拉联动,记录下过程中遇到的问题. dom部分 // 拿到选中项的索引 myselect.selectedIndex // 拿到选中项的text/value myselect.o ...
- maven的安装配置以及在IDEA中配置
一.下载maven: 1.maven官网:http://maven.apache.org/download.cgi 二.安装配置 1.下载后解压到本地目录,如图 2.配置环境变量:我的电脑右键-> ...
- Linux 开启echo等服务
第一步: 需要安装xinetd服务(其实daytime就包含在xinetd服务中),安装就直接在"新立得软件管理器"里搜索,安装. sudo apt-get install xin ...
- java内存模型个人理解总结
现阶段线程之间的通讯主要有两种:内存共享和消息传递,而且在java中是采用的内存共享.简单说下内存共享: 假设现在有a线程和b线程,在a和b线程之间的通讯是依靠a线程将相关数据刷新到共享内存,然后b线 ...
- 我这样减少了26.5M Java内存!
WeTest 导读 历时五天的内存优化已经结束,这里总结一下这几天都做了什么,有哪些收获.优化了,或可以优化的地方都有哪些.(因为很多事还没做,有些结论需要一定样本量才能断定,所以叫一期)一期优化减少 ...
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...