用单调栈的话不严格的O(n^3)可以轻松艹过去,统计的时候要差分。

  可以发现,对于一个单调栈里的元素,从它进栈到出栈都会重复类似的计算。。再差分一波后就可以只在出栈的时候计算一下了。

  具体的话看代码吧。。

O(n^3):

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define ui unsigned int
#define ull unsigned long long
using namespace std;
const int maxn=;
char s[maxn];
int h[maxn],st[maxn],l[maxn];
int an[maxn][maxn];
int i,j,k,n,m; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
}
inline void add(int y1,int x2,int y2){
// printf("add:1,%d %d,%d\n",y1,x2,y2);
an[x2][y2]++,an[x2][y1-]--;
}
inline void addall(int len,int st2,int h){
for(register int i=;i<=len;i++)an[h][i+st2]++,an[h][i-]--;
// add(i,h,i+st2);
// an[h][1+st2]++,an[h][len+st2+1]--,
// an[h][0]--,an[h][len]++;
} char ss[];int len;
inline void outx(int x){
if(!x){putchar('');return;}
while(x)ss[len++]=x%,x/=;
while(len)putchar(ss[--len]+);
}
int main(){
n=read(),m=read();//register int k;
for(i=;i<=n;i++){
scanf("%s",s+);
int top=;
for(j=;j<=m+;j++){
h[j]=s[j]==''?h[j]+:;
while(top&&h[st[top]]>=h[j])addall(j-st[top],st[top]-l[top],h[st[top]]),top--;
st[++top]=j,l[top]=st[top-]+;
//for(k=1;k<=top;k++)add(j-st[k]+1,h[st[k]],j-l[k]+1);
}
}
// for(i=1;i<=n;i++)for(j=1;j<=m;j++)an[i][j]+=an[i][j-1];
// for(i=1;i<=n;printf("%d\n",an[i][m]),i++)for(j=1;j<m;j++)printf("%d ",an[i][j]);
for(i=n;i;i--)for(j=m;j;j--)an[i][j]+=an[i+][j]+an[i][j+]-an[i+][j+];
for(i=;i<=n;outx(an[i][m]),putchar('\n'),i++)for(j=;j<m;j++)outx(an[i][j]),putchar(' ');
}

O(n^2):

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define ui unsigned int
#define ull unsigned long long
using namespace std;
const int maxn=;
char s[maxn];
int h[maxn],st[maxn],l[maxn];
int an[maxn][maxn];
int i,j,k,n,m; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
} inline void addall(int len,int st2,int h){
an[h][+st2]++,an[h][len+st2+]--,
an[h][]--,an[h][len]++;
} char ss[];int len;
inline void outx(int x){
if(!x){putchar('');return;}
while(x)ss[len++]=x%,x/=;
while(len)putchar(ss[--len]+);
}
int main(){
n=read(),m=read();register int i,j;
for(i=;i<=n;i++){
scanf("%s",s+);
int top=;
for(j=;j<=m+;j++){
h[j]=s[j]==''?h[j]+:;
while(top&&h[st[top]]>=h[j])addall(j-st[top],st[top]-l[top],h[st[top]]),top--;
st[++top]=j,l[top]=st[top-]+;
}
}
for(i=;i<=n;i++)for(j=;j<=m;j++)an[i][j]+=an[i][j-];
for(i=;i<=n;i++)an[i][m+]=;for(i=;i<=m;i++)an[n+][i]=;
for(i=n;i;i--)for(j=m;j;j--)an[i][j]+=an[i+][j]+an[i][j+]-an[i+][j+];
for(i=;i<=n;outx(an[i][m]),putchar('\n'),i++)for(j=;j<m;j++)outx(an[i][j]),putchar(' ');
}

[51nod1291]Farmer的更多相关文章

  1. Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解

    A. Help Farmer 题目连接: http://www.codeforces.com/contest/142/problem/A Description Once upon a time in ...

  2. HDU 4380 Farmer Greedy 计算几何+bitset

    枚举直线,对于直线的某个点在直线的左端还是右端,能够状压出一个数.用bitset记录. 然后三角形就是3个bitset&一下 #include <cstdio> #include ...

  3. CodeForces 143C Help Farmer

    暴力枚举. 枚举最小的那个数字,不会超过$1000$,剩下的两个数字根号的效率枚举一下即可. #include<bits/stdc++.h> using namespace std; lo ...

  4. A Code Farmer‘s Entertainment

    My guitar playing and singing 码农的自娱自乐 https://v.youku.com/v_show/id_XNDM4NTY1MTEwNA==.html?spm=a2hzp ...

  5. HDU 4380 Farmer Greedy(叉积和三角形知识的综合应用)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/A 题目意思大致为由n个点(n小于100)和m个金矿 ...

  6. bzoj1584--DP

    题目大意:有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若 ...

  7. Qt5 开发 iOS 应用之访问 SQLite 数据库

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1   源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...

  8. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  9. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

随机推荐

  1. 【Zookeeper】源码分析之服务器(五)之ObserverZooKeeperServer

    一.前言 前面分析了FollowerZooKeeperServer,接着分析ObserverZooKeeperServer. 二.ObserverZooKeeperServer源码分析 2.1 类的继 ...

  2. StreamCQL编写jstorm拓扑任务入门

    一,什么是 StreamCQL StreamCQL(Stream Continuous Query Language)是一个类似SQL的声明式语言, 目的是在流计算平台(目前也就是jstrom)的基础 ...

  3. CentOS7.4 chrony时间同步服务器部署(替代NTPD)

    Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成:chronyd和chronyc. chronyd是一个后台运行的守护进程,用于调整内核 ...

  4. CKEditor 集成CKFinder集成

    lCKEditor原名FckEditor,著名的HTML编辑器,可以在线编辑HTML内容,演示一下.打开.自己人用CKEditor,网友用UBBEditor. l配置参考文档,主要将ckeditor中 ...

  5. ArcGIS API for Javascript 加载天地图(墨卡托投影)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Q:java中serialVersionUID的作用

    @转载自:http://www.cnblogs.com/guanghuiqq/archive/2012/07/18/2597036.html   简单来说,Java的序列化机制是通过在运行时判断类的s ...

  7. 例子:js超级玛丽小游戏

    韩顺平_轻松搞定网页设计(html+css+javascript)_第34讲_js超级玛丽小游戏_学习笔记_源代码图解_PPT文档整理 采用面向对象思想设计超级马里奥游戏人物(示意图) 怎么用通过按键 ...

  8. JavaScript 内存相关知识

    一.内存基本概念 1.1.生命周期 不管什么程序语言,内存生命周期基本是一致的: 分配你所需要的内存 var n = 123; // 给数值变量分配内存 var s = "azerty&qu ...

  9. [js高手之路]html5 canvas动画教程 - 重力、摩擦力、加速、抛物线运动

    上节,我们讲了匀速运动,本节分享的运动就更有意思了: 加速运动 重力加速度 抛物线运动 摩擦力 加速运动: <head> <meta charset='utf-8' /> &l ...

  10. H5 + 开发App(分享功能)

    我们开发App有一个不可少的功能,就是分享功能.让用户将app分享到他的社交圈.比如微信 QQ 微博等等. 准备工作:我们要先去申请相关的权限, 这是传送门http://ask.dcloud.net. ...