[51nod1291]Farmer
用单调栈的话不严格的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的更多相关文章
- 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 ... 
- HDU 4380 Farmer Greedy 计算几何+bitset
		枚举直线,对于直线的某个点在直线的左端还是右端,能够状压出一个数.用bitset记录. 然后三角形就是3个bitset&一下 #include <cstdio> #include ... 
- CodeForces 143C Help Farmer
		暴力枚举. 枚举最小的那个数字,不会超过$1000$,剩下的两个数字根号的效率枚举一下即可. #include<bits/stdc++.h> using namespace std; lo ... 
- A Code Farmer‘s Entertainment
		My guitar playing and singing 码农的自娱自乐 https://v.youku.com/v_show/id_XNDM4NTY1MTEwNA==.html?spm=a2hzp ... 
- HDU 4380 Farmer Greedy(叉积和三角形知识的综合应用)
		题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/A 题目意思大致为由n个点(n小于100)和m个金矿 ... 
- bzoj1584--DP
		题目大意:有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若 ... 
- Qt5 开发 iOS 应用之访问 SQLite 数据库
		开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1 源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ... 
- POJ 3254. Corn Fields 状态压缩DP (入门级)
		Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ... 
- hdu2848 Visible Trees (容斥原理)
		题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ... 
随机推荐
- jsp上的九个隐含对象
			首先说一说件jsp的原理.jsp被认为最经典的解释是 “嵌入了java 代码的html”. 在网上查了一些资料,和我本身对jsp的认识,总结如下: jsp本质上是一个servlet,继承自 当第一次 ... 
- mysql-5.7.17.msi安装
			mysql-5.7.17.msi安装,跟着截图摩擦,一步一步是爪牙,是魔鬼的步伐 开始: 可以创建其他用户 我自己改了日志名 
- mysql5.7-Group Replication
			什么是Group Replication 基于组的复制(Group-based Replication)是一种被使用在容错系统中的技术.Replication-group(复制组)是由能够相互通信的多 ... 
- PHP判断手机号运营商(详细介绍附代码)
			道理很简单,知道手机号规则 进行正则判断就可以 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.15 ... 
- ElasticSearch 学习记录之父子结构的查询
			父子结构 父亲type属性查询子type 的类型 父子结构的查询,可以通过父亲类型的字段,查询出子类型的索引信息 POST /product/_search { "query": ... 
- 使用 Kafka 和 ELK 搭建测试日志系统(1)
			本文仅供自己学习,不合适转载. 这是两篇文章的第一部分. 1. 安装 ELK 1.1 安装 ElasticSearch 在海航云上创建一个 Ubutu 16.4 虚机,2核4GB内存. (1)执行以下 ... 
- JMeter 插件 Json Path 解析HTTP响应JSON数据
			一.基本简介 JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为JSON数据格式.JSON 简介,JSON 教程. JSON 已经成为数 ... 
- 5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)
			据说 Google 的数据中心里运行着超过 20 亿个容器,而且 Google 十年前就开始使用容器技术. 最初,Google 开发了一个叫 Borg 的系统(现在命令为 Omega)来调度如此庞大数 ... 
- shiro中 UnknownAccountException
			一 shiro的session.request和response与服务端容器自身的这三个对象的关系 在web.xml中配置了一个Filter,拦截/*,所有的uri.在拦截器中还会调用ShiroFil ... 
- MySQL查询(进阶)(每个标点都是重点)
			MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存. 你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫. 这篇和上一篇都是干货,我也是第一次学. ... 
