洛谷 P3400 仓鼠窝
卡常
#pragma GCC optimize(2)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef pair<int,int> pi;
int n,m,a[][];
int xx[][];
int t1[],lst[],r;
int ta,sz[];LL ans;
int f1[],dd[],nxt[],mem,sz1[];
inline void read(int &x)
{
x=; int f=; char ch=getchar();
while( (ch<'' || ch>'') && ch!='-') ch=getchar(); if(ch=='-') {f=-; ch=getchar();}
while(ch>='' && ch <='') x=x*+ch-'',ch=getchar();
x*=f;
}
int main()
{
int i,j,k,t,p;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
read(a[i][j]);
a[i][j]^=;
if(a[i][j]==)
{
for(k=i;k>=;k--)
{
if(xx[k][j]) break;
xx[k][j]=i;
}
}
}
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
if(xx[i][j]==)
xx[i][j]=n+;
xx[i][j]-=i;
}
// for(i=1;i<=n;i++)
// {
// for(j=1;j<=m;j++)
// printf("%lld ",xx[i][j]);
// puts("");
// }
// return 0;
for(i=;i<=n;i++)
{
r=;
for(j=m;j>=;j--)
{
while(r&&xx[i][t1[r]]>xx[i][j]) lst[t1[r]]=j,r--;
t1[++r]=j;
}
while(r) lst[t1[r]]=,r--;
mem=;
for(j=;j<=m;j++) sz1[j]=,f1[j]=;
for(j=;j<=m;j++)
if(lst[j]!=)
dd[++mem]=j,nxt[mem]=f1[lst[j]],f1[lst[j]]=mem,sz1[lst[j]]++;
for(j=;j<=m;j++) sz[j]=;
for(j=m;j>=;j--) sz[j]+=sz1[j],sz[lst[j]]+=sz[j];
//for(j=1;j<=m;j++) printf("%lld ",lst[j]);
//puts("");
ta=;t=0x3f3f3f3f;
for(j=;j<=m;j++) t=min(t,xx[i][j]),ta+=t;
for(j=;j<=m;j++)
{
ans+=ta;
for(k=f1[j];k;k=nxt[k])
{
p=dd[k];
ta+=(sz[p]+)*(xx[i][p]-xx[i][lst[p]]);
}
ta-=xx[i][j];
}
}
printf("%lld",ans);
return ;
}
洛谷 P3400 仓鼠窝的更多相关文章
- 洛谷P3400 仓鼠窝(单调栈)
P3400 仓鼠窝 题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子 ...
- 单调栈求全1(或全0)子矩阵的个数 洛谷P5300与或和 P3400仓鼠窝
爆零好爽,被中学生虐好爽,还好我毕业得早 求全1(或全0)子矩阵的个数,看了题解有好几种思路,我学了三种,但有两种不是很理解,而且也没另外那个跑得快,所以简单讲述一一下我会的那种来自Caro23333 ...
- 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)
洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...
- 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]
题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...
- 洛谷p3398仓鼠找suger题解
我现在爱死树链剖分了 题目 具体分析的话在洛谷blog里 这里只是想放一下改完之后的代码 多了一个son数组少了一个for 少了找size最大的儿子的for #include <cstdio&g ...
- 洛谷 P3711 - 仓鼠的数学题(多项式)
洛谷题面传送门 提供一种不太一样的做法. 假设要求的多项式为 \(f(x)\).我们考察 \(f(x)-f(x-1)\),不难发现其等于 \(\sum\limits_{i=0}^na_ix^i\) 考 ...
- 洛谷P3398 仓鼠找sugar
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- 洛谷 P3711 仓鼠的数学题 [伯努利数 fft]
P3711 仓鼠的数学题 题意: \[ S_m(x) = \sum_{k=0}^x k^m, 0^0=1\quad 求 \sum_{m=0}^n S_m(x)a_m \] 的答案多项式\(\sum_{ ...
- 洛谷P3398 仓鼠找sugar [LCA]
题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
随机推荐
- 4. 基本TCP套接字编程
基本函数接口 socket函数 #include <sys/socket.h> int socket(int family, int type, int protocol); 成功时返回一 ...
- Android Menu开源项目整合工程
本实例整合了关于Android Menu的优秀开源代码,方便有需要用到Menu开源项目的小伙伴使用. 一.整合的项目有: SlidingMenu:https://github.com/jfeinste ...
- 关于yum的一些基本的东西
1 sqlite数据库的使用 第一,某个centos版本的包相关的信息都放在一个服务器端的sqlite数据库文件中,yum会下载到本地,进行包安装的时候用. 第二,安装的历史记录放在sqlite数据库 ...
- eclipse 修改代码后无法生效,需要clean后才能生效的解决办法
勾选project-->Bulid Automatically选项(自动编译)
- (linux)SD卡初始化-mmc_sd_init_card函数
为了学习SD/SDIO协议,看了一下linux中初始化SD卡的流程,结合代码更容易SD初始化是怎么做的. 下面图截自:"SD Specifications Part 1 Physical ...
- alsa和oss声音系统比较
OSS(Open Sound System) OSS的含义为,Open Sound System,是unix平台上一个统一的音频接口.以前,每个Unix厂商都会提供一个自己专有的API,用来处理音频. ...
- 基于HALCON的模板匹配方法总结 (转)
很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop的形状匹配算法的参数优化进行了研究,写了一篇& ...
- 黑客技术 —— Linux 命令行
很多和正则表达式 re 是一致的: 1. 修改上次执行的命令 删除多余部分: % grep fooo /var/log/auth.log % ^o % grep foo /var/log/auth.l ...
- 理解分布式id生成算法SnowFlake
理解分布式id生成算法SnowFlake https://segmentfault.com/a/1190000011282426#articleHeader2 分布式id生成算法的有很多种,Twitt ...
- OCCI编程接口介绍
OCCI简介 Oracle® C++ Call Interface (OCCI) 是一套应用程序编程接口,它允许C++程序与一个或者多个Oracle数据库进行交互.OCCI给予你强大的数据库操作能力, ...