**
**
#include <stdio.h>
#include <map>
#include <algorithm>
#define N 100100
#define mod 2147483648ll
typedef long long ll ;
using namespace std ;
struct node
{
int x ;
int y ;
};
node a[N] ;
int n , m , K;
int w , tot;
map <int , int> M ;
map <int , int> line ;
map <int , int> line_x ;
ll c[N][11] ;
int yy[N] ;
int f[N] ;
int u[N] ;
ll sum[N] ;
int d[N] ;
int lowbit(int x)
{
return x & (-x) ;
}
void update(int x , ll p)
{
while(x <= tot)
{
sum[x] = (sum[x] + p)% mod ;
x += lowbit(x) ;
}
}
ll getsum(int x)
{
ll ret = 0 ;
while(x)
{
ret = (ret + sum[x])%mod ;
x -= lowbit(x) ;
}
return ret ;
}
void init()
{
c[0][0] = 1 ;
for(int i = 1 ; i <= w ; i++)
{
c[i][0] = 1 ;
int tmp = min(i , K) ;
for(int j = 1 ; j <= tmp ; j++)
{
c[i][j] = (c[i-1][j] + c[i-1][j-1])%mod ;
}
}
}
bool cmp(node a , node b)
{
if(a.x == b.x) return a.y < b.y ;
return a.x < b.x ;
}
ll ans ;
int main()
{
scanf("%d%d" , &n , &m) ;
scanf("%d" , &w) ;
for(int i = 1 ; i <= w ; i++)
{
scanf("%d%d" , &a[i].x , &a[i].y) ;
yy[i] = a[i].y ;
line[a[i].y] ++ ;
line_x[a[i].x] ++ ;
}
scanf("%d" , &K) ;
init() ;
sort(a + 1 , a + w + 1 , cmp) ;
sort(yy + 1 , yy + w + 1) ;
yy[0] = -1 ;
for(int i = 1 ; i <= w ; i++)
{
if(yy[i] != yy[i-1])
{
M[yy[i]] = ++tot ;
f[tot] = yy[i] ;
}
}
for(int i = 1 ; i <= tot ; i++)
{
u[i] = line[f[i]] ;
d[i] = 0 ;
}
int tmp_line = -1 ;
int l , r ;
for(int i = 1 ; i <= w ; i++)
{
if(a[i].x != tmp_line)
{
tmp_line = a[i].x ;
l = 1 , r = line_x[a[i].x] - 1 ;
int ori = M[a[i].y] ;
update(ori , (c[u[ori]-1][K]*c[d[ori]+1][K]%mod-c[u[ori]][K]*c[d[ori]][K]%mod)%mod) ;
u[ori]-- ;
d[ori]++ ;
}else
{
ll S = getsum(M[a[i].y]-1) - getsum(M[a[i-1].y]) ;
if(S < 0) S += mod ;
ans = (ans + ((S*c[l][K])%mod * c[r][K])%mod)%mod ;
l ++ , r-- ;
int ori = M[a[i].y] ;
update(ori , (c[u[ori]-1][K]*c[d[ori]+1][K]%mod-c[u[ori]][K]*c[d[ori]][K]%mod)%mod) ;
u[ori] -- ;
d[ori]++ ;
}
}
printf("%lld\n" , ans) ;
}
BZOJ 1227 [SDOI2009] 虔诚的墓主人 离线+树状数组+离散化
原文地址:http://blog.csdn.net/wzq_qwq/article/details/45544095