bzoj1227
离散化+树状数组+排列组合
很久以前就看到过这道题,现在依然不会做。。。看完题解发现思路很简单,就是有点难写
我们先将坐标离散化,x和y最大是w,然后我们就有了一个暴力做法, 枚举每块墓地,统计,因为墓地上下左右没东西的话就不可能有贡献,这些坐标自然就被离散化了,所以墓地最多有w*w块
复杂度O(w*w),然后我们优化一下,发现不用枚举每个墓地,对于相邻两棵树,他们中间墓地左右的树的数量是相同的,这样的方案有C(l,k)*C(r,k),对于每个墓地,这样的虔诚度是C(l,k)*C(r,k)*C(up,k)*C(down,k),我们发现两棵树中间的墓地C(l,k)*C(r,k)是相同的,现在需要的就是统计sigma(C(up,k)*C(down,k)),我们可以用树状数组维护这个东西,先把墓地按行排序分类,然后每次对于每行枚举相邻的两棵树,计算之间的sigma,这样用树状数组统计,然后就是更新,有树的地方是需要更新的,就是把对应的y坐标离散化后的位置在树状数组里更新,减去原来的值,改成现在新的C(up,k)*C(down,k)
#include<bits/stdc++.h>
using namespace std;
const int N = ;
const long long mod = 2147483648ll;
int n, w, m, k;
int up[N], down[N];
long long c[N][], BIT[N], ans;
struct Tree {
int x, y, ux, uy, left, right, up, down;
bool friend operator < (Tree A, Tree B)
{
return A.ux == B.ux ? A.uy < B.uy : A.ux < B.ux;
}
} tree[N];
vector<Tree> line[N];
inline int lowbit(int i)
{
return i & (-i);
}
inline void update(int pos, int delta)
{
for(int i = pos; i <= w + ; i += lowbit(i)) BIT[i] = (BIT[i] + delta) % mod;
}
inline long long query(int pos)
{
long long ret = ;
for(int i = pos; i; i -= lowbit(i)) ret = (ret + BIT[i]) % mod;
return ret;
}
int main()
{
scanf("%d%d%d", &n, &m, &w);
vector<int> vx, vy;
for(int i = ; i <= w; ++i)
{
scanf("%d%d", &tree[i].x, &tree[i].y);
vx.push_back(tree[i].x);
vy.push_back(tree[i].y);
}
scanf("%d", &k);
c[][] = ;
for(int i = ; i <= w; ++i)
{
c[i][] = ;
for(int j = ; j <= min(k, i); ++j) c[i][j] = (c[i - ][j] + c[i - ][j - ]) % mod;
}
sort(vx.begin(), vx.end());
sort(vy.begin(), vy.end());
vx.erase(unique(vx.begin(), vx.end()), vx.end());
vy.erase(unique(vy.begin(), vy.end()), vy.end());
for(int i = ; i <= w; ++i)
{
tree[i].ux = lower_bound(vx.begin(), vx.end(), tree[i].x) - vx.begin() + ;
tree[i].uy = lower_bound(vy.begin(), vy.end(), tree[i].y) - vy.begin() + ;
// printf("ux=%d uy=%d\n", tree[i].ux, tree[i].uy);
}
sort(tree + , tree + w + );
for(int i = ; i <= w; ++i)
{
++up[tree[i].uy];
tree[i].up = up[tree[i].uy];
}
for(int i = w; i; --i)
{
tree[i].down = down[tree[i].uy];
++down[tree[i].uy];
}
for(int i = ; i <= w; ++i) line[tree[i].ux].push_back(tree[i]);
for(int i = ; i <= vx.size(); ++i)
{
sort(line[i].begin(), line[i].end());
for(int j = ; j < line[i].size(); ++j)
{
Tree &tmp = line[i][j];
tmp.left = j + ;
tmp.right = line[i].size() - j;
}
}
for(int i = ; i <= vx.size(); ++i)
{
for(int j = ; j < line[i].size(); ++j)
{
Tree tmp_l = line[i][j - ], tmp_r = line[i][j];
long long comb_left = c[tmp_l.left][k], comb_right = c[tmp_r.right][k], sigma = query(tmp_r.uy - ) - query(tmp_l.uy);
ans = (ans + comb_left % mod * comb_right % mod * sigma % mod) % mod;
}
for(int j = ; j < line[i].size(); ++j)
{
Tree tmp = line[i][j];
update(tmp.uy, c[tmp.up][k] % mod * c[tmp.down][k] % mod - query(tmp.uy) + query(tmp.uy - ));
}
}
printf("%lld\n", (ans % mod + mod) % mod);
return ;
}
bzoj1227的更多相关文章
- 【bzoj1227】 SDOI2009—虔诚的墓主人
http://www.lydsy.com/JudgeOnline/problem.php?id=1227 (题目链接) 题意 一个n*m的公墓,一个点上要么是墓地,要么是常青树,给出一个数K,并规定每 ...
- 【BZOJ1227】[SDOI2009]虔诚的墓主人(线段树)
[BZOJ1227][SDOI2009]虔诚的墓主人(线段树) 题面 BZOJ 洛谷 题解 显然发现答案就是对于每一个空位置,考虑上下左右各有多少棵树,然后就是这四个方向上树的数量中选\(K\)棵出来 ...
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
- BZOJ-1227 虔诚的墓主人 树状数组+离散化+组合数学
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MB Submit: 914 Solved: 431 [Submit][Statu ...
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 803 Solved: 372[Submit][Statu ...
- [bzoj1227] [SDOI2009]虔诚的墓主人
终于填上了这个万年巨坑....从初二的时候就听说过这题...然后一直不敢写QAQ 现在感觉也不是很烦(然而我还是写麻烦了 离散化一波,预处理出组合数什么的.. 要维护对于当前行,每列上方和下方节点凑出 ...
- bzoj1227 组合数学+bit
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1412 Solved: 664[Submit][Stat ...
- bzoj1227 P2154 [SDOI2009]虔诚的墓主人
P2154 [SDOI2009]虔诚的墓主人 组合数学+离散化+树状数组 先看题,结合样例分析,易得每个墓地的虔诚度=C(正左几棵,k)*C(正右几棵,k)*C(正上几棵,k)*C(正下几棵,k),如 ...
- BZOJ1227或洛谷2154 [SDOI2009]虔诚的墓主人
BZOJ原题链接 洛谷原题链接 又是扫描线,题解可看大佬的博客(太懒了不想打) #include<cstdio> #include<algorithm> using names ...
- [BZOJ1227][SDOI2009]虔诚的墓主人 组合数+树状数组
1227: [SDOI2009]虔诚的墓主人 Time Limit: 5 Sec Memory Limit: 259 MBSubmit: 1433 Solved: 672[Submit][Stat ...
随机推荐
- WebService接口数据传输加密
1.加密流程 客服端--->加密文本------>服务端接收到加密文本,通过固定加密密文进行解密,然后做相应处理------------>返回结果 2.固定密文创建 密文创建有很多种 ...
- Python 操作excel day5
一.Python操作excel python操作excel使用xlrd.xlwt和xlutils模块 1.xlrd模块是读取excel的: 2.xlwt模块是写excel的: 3.xlutils是用来 ...
- iOS多媒体框架介绍
媒体层 媒体层包含图形技术.音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易.您可以使用iOS的高级框架更快速地创建高级 ...
- Luogu P3802 小魔女帕琪
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 微信小程序官方指南手册,教你如何使用微信小程序!
2017年1月9日,小程序如约而至.程序员们都讨论的热火朝天,但是真正使用过微信小程序的又有几个呢?下面今天我们给大家介绍下微信小程序到底应该如何使用? 首先,你的微信必须是最新版本的,微信官方是从要 ...
- 【tips】xadmin - django第三方后台管理系统
Django 为大家提供了一个完善的后台管理系统—admin,但是这个后台管理系统总体来说不太适合国人的习惯,所以有大神就使用 bootstrap 和 jQuery,为我们开发了一个第三 方的 Dja ...
- BZOJ 1012 洛谷1198 最大数 maxnumber
用线段数维护即可 #include<cstdio> #include<algorithm> #define ls (cur<<1) #define rs (cur& ...
- QQ帐户的申请与登陆
QQ帐户的申请与登陆 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5,随后给出N行指令.每行指令的格式为 ...
- visioStudio常见问题
问题一: 在做项目时候,使用VisioStudio 2008,一不小心将设置恢复到了原始,一直找不到需要的东西. 比如生成方式“debug”和“Release”选择框没有.一些图标也没有. 经过不断的 ...
- [K/3Cloud]如何解决K3Cloud 2.0审批流提交时报“队列不存在,或您没有足够的权限执行该操……
按照图上的操作即可解决不可提交的问题,但如果应用服务器是部署在域环境下,应该不会出错,这是微软support上说的