[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)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...
随机推荐
- C++ 知识点总结复习
C++ 1.C++是静态类型语言,使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查. 2.面向对象程序设计 C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性: 封 ...
- ios 访问隐私信息 info.plist 中的字段
1.iOS10相册相机闪退bug: iOS10系统下调用系统相册,相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to acc ...
- 【USACO】玉米实验(单调队列)
Description 约翰决定培育新的玉米品种以提高奶牛的产奶效率.约翰所有的土地被分成 N ×N 块,其中第 r行第 c 列的玉米质量为 Ar,c.他打算找一块质量比较均匀的土地开始自己的实验.经 ...
- Linux 学习记录 二 (文件的打包压缩).
前言:本文参考<鸟哥的Linux 私房菜>,如有说的不对的地方,还请指正!谢谢! 环境:Centos 6.4 和window不同,在Linux压缩文件需要注意的是,压缩后的文件会 ...
- geoserver发布地图服务WMS
wms服务发布: 1.打开geoserver管理首页(网址为http://localhost:8080/geoserver/web/),并使用安装时设置的帐户名和密码登录(这里是admin/geose ...
- 基于 HTML5 WebGL 的 3D 场景中的灯光效果
构建 3D 的场景除了创建模型,对模型设置颜色和贴图外,还需要有灯光的效果才能更逼真的反映真实世界的场景.这个例子我觉得既美观又代表性很强,所以拿出来给大家分享一下. 本例地址:http://www. ...
- 虚拟机创建流程中neutron代码分析(一)
前言: 在openstack的学习当中有一说法就是网络占学习时间的百分之七十.这个说法或许有夸大的成分,但不可否认的是openstack中的 网络是及其重要的部分,并且难度也是相当大.试图通过nova ...
- nova创建虚拟机源码分析系列之四 nova代码模拟
在前面的三篇博文中,介绍了restful和SWGI的实现.结合restful和WSGI配置就能够简单的实现nova服务模型的最简单的操作. 如下的内容是借鉴网上博文,因为写的很巧妙,将nova管理虚拟 ...
- 从底层角度看ASP.NET-A low-level Look at the ASP.NET...
从更低的角度 这篇文章在一个底层的角度来关注一个web请求怎样到达asp.net框架,从web服务器,通过ISAPI.看看这些后面发生了什么,让我们停止对asp.net的黑箱猜想.ASP.NET是一个 ...
- [编织消息框架][JAVA核心技术]cglib动态代理
先在mavne项目里添加cglib库 maven仓库搜索cglib版本 maven地址:http://mvnrepository.com/ 点击最新的版本 3.2.5 复制到pom.xml depe ...