题意:

在一个nxm的矩形里给出一些w个点,这些是常青树的坐标;

求所有空地上下左右能组成的长度为k的十字架的总数;

1<=n,m<=10^9,1<=w<=100000,1<=k<=10

题解:

这道题思路很简单,就是代码不太好写;

首先如果是上下左右都没有树的点是必然没有虔诚度的,所以我们可以肆无忌惮的离散化一下;

然后对于一块墓地,它的答案就是C ( l , k ) *C ( r , k ) *C ( u , k ) *C ( d , k );

(这里的l,r,u,d分别指某个点左右上下的常青树个数)

显然枚举每一块墓地是超时的,那么就考虑一次计算多个墓地;

对于在同一行两棵树之间的墓地来说,它们的 C ( l , k ) *C ( r , k )是相同的;

答案就是C ( l , k ) *C ( r , k ) * ∑C( u[i] , k )*C( d[i] , k );

求和的维护自然是树状数组,那么整道题的思路也就有了;

把所有树按行来排序,然后遍历维护出每棵树的l,r,u,d;

维护树状数组然后处理答案,时间复杂度是常数巨大的O(nlogn);

(代码写的非常非常烂。。。3900+ms我都不太好意思贴。。。

更新:                                15/07/21

今天考试碰上原题。。。

怒切之后发现有点黑科技可以用;

mod的数恰好是1<<31所以让int自然溢出就好;

最后输出答案就是&(1<<31-1)就是答案;

这样搞之后时间就是1864 ms啦;

代码:

15/07/21版:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110000
#define mod 2147483647
using namespace std;
struct node
{int x,y,tx,l,r,u,d;bool is;
}a[N];
int C[N][15];
int dis[N],tree[N],hash[N],last[N];
int cmp(node a,node b)
{if(a.y==b.y)return a.x<b.x;return a.y<b.y;
}
int lowbit(int x)
{return x&(-x);
}
void init()
{for(int i=0;i<N;i++){C[i][0]=1;for(int j=1;j<=min(i,10);j++)C[i][j]=C[i-1][j]+C[i-1][j-1];}
}
void add(int x,int val)
{while(x<N){tree[x]+=val;x+=lowbit(x);}
}
int query(int x)
{int ret=0;while(x){ret+=tree[x];x-=lowbit(x);}return ret;
}
int main()
{freopen("cross.in","r",stdin);freopen("cross.out","w",stdout);int n,m,i,j,k,K,x,y,w,len,ans;init();scanf("%d%d%d",&n,&m,&w);for(i=1;i<=w;i++){scanf("%d%d",&a[i].x,&a[i].y);dis[i]=a[i].x;}scanf("%d",&K);sort(dis+1,dis+w+1);len=unique(dis+1,dis+w+1)-dis-1;sort(a+1,a+w+1,cmp);for(i=1,y=-1,k=0;i<=w;i++){if(a[i].y!=y)y=a[i].y,k=0;a[i].l=k;k++;a[i].tx=lower_bound(dis+1,dis+len+1,a[i].x)-dis;a[i].d=hash[a[i].tx];hash[a[i].tx]++;if(a[last[a[i].tx]].y+1==a[i].y)a[last[a[i].tx]].is=1;last[a[i].tx]=i;}for(i=w,y=-1,k=0;i>=1;i--){if(a[i].y!=y)y=a[i].y,k=0;a[i].r=k;k++;a[i].u=hash[a[i].tx]-a[i].d-1;}for(i=1,y=-1,ans=0;i<=w;i++){if(a[i].is!=1)add(a[i].tx,C[a[i].u][K]*C[a[i].d+1][K]-(query(a[i].tx)-query(a[i].tx-1)));if(a[i].y==a[i+1].y)ans+=C[a[i].l+1][K]*C[a[i+1].r+1][K]*(query(a[i+1].tx-1)-query(a[i].tx));}printf("%d",(ans)&mod);return 0;
}

旧版:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110000
#define mod 2147483648ll
using namespace std;
typedef long long ll;
struct node
{ll dx,dy,x,y,l,r,u,d;bool is;
}a[N];
ll disx[N],disy[N];
ll tempx[N],tempy[N];
ll C[N][20],q[N];
ll tree[N];
int cmpll(ll a,ll b)
{return a<b;
}
int cmpnode(node a,node b)
{if(a.y==b.y)return a.x<b.x;return a.y<b.y;
}
ll mul(ll x,ll y)
{ll ret=0;while(y){if(y&1)ret=(ret+x)%mod;x=(x+x)%mod;y>>=1;}return ret;
}
ll lowbit(ll k)
{return k&(-k);
}
void update(ll k,ll val)
{while(k<=100000){tree[k]=(tree[k]+val)%mod;k+=lowbit(k);}
}
ll query(ll k)
{ll ret=0;while(k){ret=(ret+tree[k])%mod;k-=lowbit(k);}return ret;
}
int main()
{ll n,m,w,i,j,k,x,y,cnt,lenx,leny,ans,st,en;scanf("%lld%lld%lld",&n,&m,&w);for(i=1;i<=w;i++){scanf("%lld%lld",disx+i,disy+i);a[i].x=disx[i],a[i].y=disy[i];}scanf("%lld",&k);sort(disx+1,disx+1+w,cmpll);sort(disy+1,disy+1+w,cmpll);lenx=unique(disx+1,disx+1+w)-disx-1;leny=unique(disy+1,disy+1+w)-disy-1;sort(a+1,a+w+1,cmpnode);for(i=1,y=1,cnt=0;i<=w;i++){a[i].dx=lower_bound(disx+1,disx+1+lenx,a[i].x)-disx;a[i].dy=lower_bound(disy+1,disy+1+leny,a[i].y)-disy;if(a[i].dy==y)a[i].l=cnt++;elsetempy[y]=cnt,a[i].l=0,cnt=1,y=a[i].dy;a[i].d=tempx[a[i].dx];tempx[a[i].dx]++;}tempy[a[w].dy]=cnt;for(i=1;i<=w;i++){a[i].u=tempx[a[i].dx]-a[i].d-1;a[i].r=tempy[a[i].dy]-a[i].l-1;}st=1,en=0;for(i=w,y=leny,x=w;i>0;i--){if(a[i].dy!=y){while(st<=en)  st++;for(j=x;j>i;j--)q[++en]=a[j].dx;x=i;y=a[i].dy;}while(q[st]>a[i].dx&&st<=en)  st++;if(q[st]==a[i].dx) a[i].is=1;}for(i=0;i<=w;i++){C[i][0]=1;for(j=1;j<=min(i,k);j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}y=a[1].dy,x=1;for(i=1,ans=0;i<=w;i++){if(a[i].l+1>=k&&a[i].r>=k&&a[i+1].dx-1>a[i].dx){ans=(ans+(((query(a[i+1].dx-1)-query(a[i].dx))%mod+mod)%mod)*(C[a[i].l+1][k]*C[a[i].r][k]%mod))%mod;}if(a[i].is)update(a[i].dx,((C[a[i].u-1][k]*C[a[i].d+1][k]%mod)-((query(a[i].dx)-query(a[i].dx-1))%mod+mod)%mod+mod)%mod);elseupdate(a[i].dx,((C[a[i].u][k]*C[a[i].d+1][k]%mod)-((query(a[i].dx)-query(a[i].dx-1))%mod+mod)%mod+mod)%mod);}printf("%lld",ans%mod);return 0;
}

bzoj-1227 虔诚的墓主人相关推荐

  1. 1227: [SDOI2009]虔诚的墓主人

    1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec  Memory Limit: 259 MB Submit: 1083  Solved: 514 [Submit][St ...

  2. 虔诚的墓主人(bzoj 1227)

    Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己 ...

  3. bzoj 1227 [SDOI2009]虔诚的墓主人

    疯狂re 换了一种写法才过... 思路:将x轴离散化,处理出来每个点上下左右一个有多少个点, 对于同一行的两个点来说,他们之间的 这些空的点都是可以一起算的,我们用树状数组按y轴从小到大维护 每一列的 ...

  4. BZOJ1227 [SDOI2009]虔诚的墓主人 【树状数组】

    题目 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地.为 ...

  5. 【SDOI2009】【BZOJ1227】虔诚的墓主人

    Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.当地的居民都是非常虔诚的基督徒,他们愿意提前为自己 ...

  6. bzoj1227: [SDOI2009]虔诚的墓主人(树状数组,组合数)

    传送门 首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$ 那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y ...

  7. 2017.9.24 虔诚的墓主人 思考记录

    这个题是纯信息处理题. 首先要明白,对墓地进行枚举是会T的,需要对常青树进行枚举 所以枚举的顺序也要注意:一定要按某种顺序 然后要明白,每一个常青树会对列和行都造成影响,对答案有贡献的点只会在两个点之 ...

  8. [SDOI2009]虔诚的墓主人

    这个题是今天上午模拟赛做的,考场上代码最后时间紧写得巨丑,所以改完以后还是巨丑 80分做法 这是考场上写的,然而数学实在太渣,不知道在模数下不能做除法,组合数部分写ci了 组合数预处理 首先都知道组合 ...

  9. linux单机到单机adg环境,Oracle 11.2.0.4 DataGuard 环境打PSU,OJVM PSU补丁快速参考

    环境:RHEL6.5 + Oracle 11.2.0.4 DataGuard physical standby 主库和备库都是单节点. 需求:主备库同时应用160719的PSU和OJVM PSU补丁. ...

最新文章

  1. python单片机自动浇花_[MicroPython]TPYBoardv102自动浇花系统
  2. 电脑机时,电脑死机时,为啥会忍不住扇它一巴掌?
  3. WINDOWS SERVER 2003 组策略应用
  4. CentOS6.0搭建DNS
  5. Linux编程之定制带级别的log
  6. linux中以A开头的函数使用方式历程及详解
  7. 1251 括号(递归小练)
  8. 如何生成全局唯一标识
  9. html弹性盒子自适应比例,CCS弹性盒子中间自适应怎么设置
  10. 从事人工智能要学计算机什么专业,人工智能专业需要什么学历
  11. 中国大学MOOC“Python程序设计基础”第4次开课
  12. application使用@符合问题:‘@‘ that cannot start any token
  13. JavaScript模拟实现“实例成员”和“静态成员”
  14. java实现语音播放功能
  15. iai控制器服务器ON信号,IAI电缸产品控制方法的知识.pdf
  16. android自动秒杀脚本,京东自动秒杀脚本手机版-京东自动秒杀脚本安卓版下载v7.0.4 - 7230手游网...
  17. 未来大数据还有就业机会吗?
  18. python中index什么意思_Python中index()和seek()的用法(详解)
  19. nRF53832开发环境搭建
  20. Hacker基础之Linux篇——基础Linux命令二

热门文章

  1. 解密回声消除技术--转
  2. 值得信赖的数据同步备份软件 -Allway Sync 安全又可靠,简单又易用!
  3. 天池竞赛:Docker 基本操作
  4. kindle长期未使用,界面显示电池感叹号
  5. 服务器可以装win7或win10系统吗,win10改win7用legacy还是uefi?_网站服务器运行维护,window...
  6. GitHub入门操作(详细)
  7. JavaFx(OpenJFX)安装教程详细版
  8. 双馈风机并网simulink模型
  9. Python+Appium实现京东双十一自动领金币
  10. 手机软件开发入门 [转]