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

news/2024/7/3 2:00:26

传送门

 

首先,对于每一块墓地,如果上下左右各有$a,b,c,d$棵树,那么总的虔诚度就是$C_k^a*C_k^b*C_k^c*C_k^d$

那么我们先把所有的点都给离散,然后按$x$为第一关键字,$y$为第二关键字,那么同一横坐标的一定在连续的一段且纵坐标递增

那么对于同一横坐标的两棵常青树,在他们中间的所有空地都有可能满足条件,因为上面的常青树和下面的常青树数量是固定的,所以$C_k^a*C_k^b$的值也是固定的

那么我们就是需要快速求出一段区间里的$C_k^c*C_k^d$,那么我们可以考虑用树状数组来维护。这部分细节可以参考代码

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define int long long
 6 using namespace std;
 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 8 char buf[1<<21],*p1=buf,*p2=buf;
 9 inline int read(){
10     #define num ch-'0'
11     char ch;bool flag=0;int res;
12     while(!isdigit(ch=getc()))
13     (ch=='-')&&(flag=true);
14     for(res=num;isdigit(ch=getc());res=res*10+num);
15     (flag)&&(res=-res);
16     #undef num
17     return res;
18 }
19 const int N=100005,mod=2147483648;
20 int n,m,k,C[N][15],tt=0,ans,tmp[N],c[N],col,tot[N],cnt[N],r[N],h[N];
21 struct node{int x,y;}a[N];
22 inline bool cmp(const node &a,const node &b)
23 {return a.x!=b.x?a.x<b.x:a.y<b.y;}
24 inline bool cmp2(const node &a,const node &b)
25 {return a.y!=b.y?a.y<b.y:a.x<b.x;}
26 inline void add(int x,int y){
27     for(;x<=col;x+=x&-x) (c[x]+=y)%=mod;
28 }
29 inline int query(int x){
30     int res=0;
31     for(;x;x-=x&-x) (res+=c[x])%=mod;
32     return res;
33 }
34 signed main(){
35     //freopen("testdata.in","r",stdin);
36     read();read();n=read();
37     for(int i=1;i<=n;++i) a[i].x=read(),a[i].y=read();
38     k=read();
39     for(int i=0;i<=n;++i) C[i][0]=1;
40     for(int i=1;i<=n;++i)
41     for(int j=1;j<=min(i,k);++j)
42     C[i][j]=C[i-1][j]+C[i-1][j-1];
43     sort(a+1,a+1+n,cmp2);
44     for(int i=1;i<=n;++i)
45     tmp[i]=(i==1||a[i].y!=a[i-1].y)?++tt:tt;
46     for(int i=1;i<=n;++i) cnt[a[i].y=tmp[i]]++;col=a[n].y;
47     sort(a+1,a+1+n,cmp);
48     for(int i=1;i<=n;++i)
49     tmp[i]=(i==1||a[i].x!=a[i-1].x)?++tt:tt;
50     for(int i=1;i<=n;++i) tot[a[i].x=tmp[i]]++;
51     for(int i=1;i<=n;++i){
52         if(i==1||a[i].x!=a[i-1].x) tt=0;
53         int dy=a[i].y,v=(++h[dy])>=k&&cnt[dy]-h[dy]>=k?
54         1ll*C[h[dy]][k]*C[cnt[dy]-h[dy]][k]%mod:0;++tt;
55         add(dy,v-r[dy]),r[dy]=v;
56         if(i==n||a[i].x!=a[i+1].x||a[i+1].y-a[i].y<=1
57         ||tt<k||tot[a[i].x]-tt<k) continue;
58         (ans+=1ll*C[tt][k]*C[tot[a[i].x]-tt][k]%mod
59         *(query(a[i+1].y-1)-query(a[i].y)))%=mod;
60     }
61     printf("%d\n",(ans>=0?ans:ans+mod)%mod);
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9598137.html


http://lihuaxi.xjx100.cn/news/236293.html

相关文章

linux 源码安装浏览器,vps+linux+安装浏览器

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情什么是弹性…

End Credits

我不知道怎么把他删掉... 今晚WC文艺汇演wwww(等待唱歌.jpg 要是能截到屏一定发上来qwqqqqq 话说这首曲子是新发现的QAQ(Xeuphoria的还是那么好听qwqqq 今天学了快读qvq 还有...dpwww P2015 二叉苹果树 有一棵苹果树&#xff0c;如果树枝有分叉&#xff0c;一定是分2叉&#xf…

python爬取电影和美食数据实战

本文使用的是requests正则来匹配网页内容&#xff0c;对于数据量较多的采用了多线程抓取的方法&#xff0c;共3个案例&#xff0c;分别是抓取猫眼电影TOP100榜单和淘票票正在热映的电影信息、以及美团的美食数据。这几个案例采用的方法大同小异。1、首先选择想要爬取的网站2、确…

大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc

昆明理工大学大一C语言大作业题目综合性实践排序求平均值(包括将数拆散求最大最小值)。函数ReadDat()随机产生100个存放到数组aa中00个jsSort()函数的功能是&#xff1a;进行降序排列。最后调用函数WriteDat()函数函数ReadDat()00个四位数存入数组a中&#xff0c;函数jsValue()…

NAT环境无法访问云端的深层次分析

这是一次我维护runningdoctor时候遇到的问题现象&#xff1a;1.用户无法打开web.runningdoctor.cn 2.监控状态无异常、无报警 3.tracert结果无异常、丢包率正常 4.用户无法访问的时候&#xff0c;我们能打开网站 5.多地代理访问网站&#xff0c;结果正常 6.有打开网站特别慢的时…

[附源码]Python计算机毕业设计SSM-乐室预约小程序(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

并发任务的可视化

一、任务要求&#xff1a;在linux系统中设计一个父进程&#xff0c;三个子进程(A,B,C)。子进程A,B同时被父进程启动来计算&#xff08;不实现具体的计算任务&#xff0c;先用CPU空跑来代替&#xff09;。进程A计算5分钟&#xff0c;而进程B计算8分钟。当进程A,B都计算完成后才能…

用devcpp如何编码c语言,Dev C++的使用

我们在使用之前先准备一段C语言代码。#include int main(){printf("欢迎进入C语言网&#xff01;");return 0;}1. 新建文件初步使用这款软件&#xff0c;我们先选择源文件进行创建&#xff0c;打开软件后点击左上角的File->New->Source File,也可以使用快捷键C…