T1

有个朴素的暴力,枚举每一个子矩形,复杂度 \(O(n^{2}m^{2})\),观察数据范围,n很小,考虑枚举行,对于 \(m\) 用 \(two\;pointers\) 来维护。

先预处理出每一列的前缀和,然后枚举行,对于列,用个双指针,把 \([l,r]\) 这一段区间卡出来,答案每回累加合法的区间长度即可。

复杂度 \(O(n^{2}m)\)

Code
#include<cmath>
#include<cstdio>
#define MAX 50100
#define re register
#define int long long
namespace OMA
{
char ch[MAX];
int n,m,l,r,tot[MAX];
int ans,sum[33][MAX];
struct stream
{
template<typename type>inline stream &operator >>(type &s)
{
int w=1; s=0; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*=w,*this;
}
}cin;
signed main()
{
//freopen("node.in","r",stdin);
cin >> n >> m;
for(re int i=1; i<=n; i++)
{
scanf("%s",ch+1);
for(re int j=1; j<=m; j++)
{ sum[i][j] = sum[i-1][j]+(ch[j]=='1'); }
}
cin >> l >> r;
for(re int i=1; i<=n; i++)
{
for(re int j=i; j<=n; j++)
{
int lp = 0,rp = 0;
for(re int k=1; k<=m; k++)
{
//printf("i=%lld j=%lld k=%lld ",i,j,k);
tot[k] = tot[k-1]+sum[j][k]-sum[i-1][k];
//printf("tot[%lld]=%lld\n",k,tot[k]);
while(tot[k]-tot[lp]>r&&lp+1<k)
{ lp++; }
while(tot[k]-tot[rp+1]>=l&&rp+1<k)
{ rp++; }
if(tot[k]-tot[rp]>=l)
{ ans += rp-lp+1; }
}
}
}
printf("%lld\n",ans);
return 0;
}
}
signed main()
{ return (OMA::main(),0); }

T2

题意转换

好了,现在你已经知道转换后的题意,问题在于如何求解 \(cnt\) 数组和答案。

对于每一行,我们都开一个桶记录 \(a\) 出现的次数。

然后枚举每一行,再从1枚举到最大值,再枚举当前枚举的数的倍数,加上上边说的桶即可 建议看code

这样得到的 \(cnt_{i,j}\) 表示第i行有多少个数为j的倍数,每一行求和就是总的,而我们要的是j,所以考虑一波容斥,即减去j的其他倍数即可,这样的话就要倒序枚举最大值。

复杂度 \(O(n(m+\max\{a\}\ln\max\{a\}))\) 。

Code
#include<cstdio>
#define MAX 100010
#define re register
#define int long long
const int N = 22;
namespace OMA
{
int n,m,xam,ans;
int a[N][MAX];
int buc[N][MAX];
int cnt[N][MAX],sum[MAX];
const int p = 1e9+7;
struct stream
{
template<typename type>inline stream &operator >> (type &s)
{
int w=1; s=0; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*=w,*this;
}
}cin;
inline int max(int a,int b)
{ return a>b?a:b; }
signed main()
{
cin >> n >> m;
for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=m; j++)
{ cin >> a[i][j]; xam = max(xam,a[i][j]); buc[i][a[i][j]]++; }
}
for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=xam; j++)
{
for(re int k=1; j*k<=xam; k++)
{ cnt[i][j] += buc[i][j*k]; }
}
}
/*for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=xam; j++)
{ printf("%lld ",cnt[i][j]); }
printf("\n");
}*/
for(re int j=xam; j; j--)
{
sum[j] = 1;
for(re int i=1; i<=n; i++)
{ (sum[j] *= cnt[i][j]+1) %= p; }
sum[j] -= 1;
if(!sum[j])
{ continue ; }
for(re int k=2; k*j<=xam; k++)
{ sum[j] -= sum[k*j]; }
(ans += j*sum[j]) %= p;
}
printf("%lld\n",(ans+p)%p);
return 0;
}
}
signed main()
{ return OMA::main(); }

T3

点分治,不会,爬了

noip38的更多相关文章

随机推荐

  1. spring、springmvc、springboot、springcloud的联系与区别

    spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...

  2. P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题

    刷了n次用了奇淫技巧才拿到rk1,亥 这道题是网络流二十四题中「餐巾计划问题」的加强版. 于是怀着试一试的心情用费用流交了一发: 哇塞,过了9个点!(强烈谴责出题人用*造数据 下面是费用流解法简述: ...

  3. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...

  4. Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记

    目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...

  5. C语言:已知三角形三边长求面积

    //已知三角形三边长求面积 #include <stdio.h> #include <math.h> int main() { float a,b,c,p,s; int x=0 ...

  6. 【Python从入门到精通】(十一)Python的函数的方方面面【收藏下来保证有用!!!】

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文主要介绍Python的函数,函数的定义,使用,可变参数等等都有详细介绍. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎 ...

  7. File类与常用IO流第七章——Properties集合

    Properties概述 java.util.Properties extends Hashtable<k,v> implements Map<k,v> Properties类 ...

  8. spring pom文件报错:提示no declaration can be found for element 'dubbo:service'.

    转自:http://blog.csdn.net/happylife_haha/article/details/52755425 pom文件报错:The matching wildcard is str ...

  9. Http协议知识点回顾

    OSI七层协议: 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 完整的Http协议请求流程: 协议:客户端和服务器双方都能听的懂得语言(约定) 不需要关注底层的网络层或传输层协议 TCP ...

  10. Leetcode1.两数之和——简洁易懂

    > 简洁易懂讲清原理,讲不清你来打我~ 输入一个数组和一个整数,从数组中找到两个元素和为这个整数,输出下标![在这里插入图片描述](https://img-blog.csdnimg.cn/img ...