题目链接:http://codeforces.com/problemset/problem/364/E
时间复杂度O(n*m*K * (lgn + lgm) ) (lgn +lgm)是分治的复杂度
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define N 2550
#define Mid(x,y) ((x+y)>>1)
using namespace std;
int n, m, K;
__int64 ans;
int s[N][N], up[8], down[8];
inline int sum(int x1, int x2, int y1, int y2){ //求出该矩阵的1个数
return s[x2][y2] - s[x2][y1] - s[x1][y2] + s[x1][y1];
}
void work(int x1, int x2, int y1, int y2, bool dir){ //横竖交替割 计算 满足条件 且在水平中线上的子矩阵个数
if(x1 == x2 || y1 == y2)return ;
if((x1+1 == x2) && (y1+1 == y2))
{ ans += sum(x1, x2, y1, y2) == K; return ;}
if(dir)//dir == true 表示划水平线
{
int mid = Mid(x1, x2);
work(x1, mid,