T1

这道题在考场上想到了二维前缀和,就是自己算前缀和的方式有点麻烦,导致花的时间较长,但还是成功搞了出来。

因为暴力计算的话需要不停枚举左上角和右下角的 i ,j, 时间复杂度为 n^4 ,我当时就想一种能不能减少一层或者两层枚举内容,但是没什么思路。

考虑这样一个性质:在模k意义下相同的前缀和,任意两个相减可以被 k 整除

这道题正解为 n^3 ,的复杂度,我们考虑将每一列压缩,这样,我们只需要通过枚举每个矩形区域的上下边界,就可以求得答案

注意:当余数为0的时候要多算一次答案

代码:

#include<bits/stdc++.h>
#define re register int
#define int long long
#define ll long long
using namespace std;
const int N=410,M=1e6+10;
int n,m,k,ans;
int a[N][N],sum[N][N],s[N];
int vis[M];
ll read()
{
ll x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x;
}
#undef int
int main()
{
#define int long long
n=read();
m=read();
k=read();
for(re i=1;i<=n;i++)
{
for(re j=1;j<=m;j++)
{
a[i][j]=read();
}
}
for(re i=1;i<=n;i++)
{
for(re j=1;j<=m;j++)
{
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
}
for(re i=0;i<n;i++)
{
for(re j=i+1;j<=n;j++)
{
for(re p=1;p<=m;p++)
{
s[p]=(sum[j][p]-sum[i][p]+k)%k;
ans+=vis[s[p]]++;
}
ans+=vis[0];
for(re p=1;p<=m;p++)
vis[s[p]]=0;
vis[0]=0; }
}
printf("%lld\n",ans);
return 0;
}

T2

 这道题,是一道贪心题,但是我在考场上没看出来,当时之打了个dfs。

 其实不难看出,如果要修建小队,则在距离他的最远的祖先哪里最优

 所以我们可以按深度从大到小排序,从深度最大的儿子向上更新答案

 代码:

#include<bits/stdc++.h>
#define re register int
#define next neet
#define INF 9999999
using namespace std;
const int N=1e5+10;
int n,k,t,ans,tot;
int fa[N],deep[N],num[N],o[N];
int to[N<<1],next[N<<1],head[N<<1];
struct node
{
int out,ff;
};
int my(int a,int b)
{
return deep[a]>deep[b];
}
node gett(int v)
{
node P;
int u=v,out=INF,mf=v;
for(re i=1;i<=k;i++)
{
u=fa[u];
out=min(out,o[u]+i);
mf=u;
if(u==0)
break; }
P.out=out;
P.ff=mf;
return P;
}
void change(int x)
{
int u=x;
for(re i=1;i<=k;i++)
{
u=fa[u];
o[u]=min(o[u],i);
if(u==0)
break;
}
}
void add(int x,int y)
{
to[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
void dfs(int st,int f)
{
deep[st]=deep[f]+1;
for(re i=head[st];i;i=next[i])
{
int p=to[i];
if(p==f)
continue;
fa[p]=st;
dfs(p,st);
}
}
int main()
{
scanf("%d%d%d",&n,&k,&t);
int a,b,c,d;
for(re i=2;i<=n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
deep[0]=-1;
dfs(1,0);
for(re i=1;i<=n;i++)
{
num[i]=i;
o[i]=INF;
}
o[0]=INF;
sort(num+1,num+n+1,my);
for(re i=1;i<=n;i++)
{
int v=num[i];
node X;
X=gett(v);
o[v]=min(o[v],X.out);
if(o[v]>k)
{
++ans;
o[X.ff]=0;
change(X.ff);
}
}
printf("%d\n",ans);
return 0;
}

T3

这道题,确实比较有难度

看到对于一个区间的操作,我当时想了线段树,书装数组,但是没什么思路。

正解是利用差分!!,这道题思路非常妙,考虑一个差分数组,那么考虑对原 010101 串进行差分。 例如样例,原串是 0100010,这里设第 000 位和第 n+1n+1n+1 位都为 000,用红色数字表示。

则差分之后是 0110011,那么我们对原串 [l,r] ,进行翻转,相当于把 a[l]^=1,a[r+1]^=1,

而我们的目的是将差分数组全部变为0,考虑转移时的情况:

1.两端都是 0,变为 1

2.两端都是1.变为 0

3.一个 1,一个 0;

可见,只有第二种情况对答案有贡献,所以我们之考虑第二种情况;

我们将每个 i与i+b[j] 连一条长度为1的边,那么将 [L,R] 的区间翻转的最小次数就是 L到 R 的最短路

我们将所有的 1 进行状态压缩,易得:

t=s^(1<<i-1)^(1<<j-1)

f[t]=min(f[t],f[s]+dis[i][j]);

最后输出答案 f[0],即可

代码:

#include<bits/stdc++.h>
#define re register int
using namespace std;
const int N=4e4+10;
int n,k,m,sum;
int b[N],pos[N],dis[N],q[N];
int f[(1<<16)+5];
int d[N>>2][N>>2];
bool vis[N];
void bfs()
{
int u,v,l,r;
for(re i=1;i<=sum;i++)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[pos[i]]=0;
vis[pos[i]]=1;
l=r=1;
q[l]=pos[i];
while(l<=r)
{
u=q[l];
++l;
for(re j=1;j<=m;j++)
{
v=u-b[j];
if(v>=1&&(!vis[v]))
{
dis[v]=dis[u]+1;
vis[v]=1;
q[++r]=v;
}
v=u+b[j];
if(v<=n+1&&(!vis[v]))
{
dis[v]=dis[u]+1;
vis[v]=1;
q[++r]=v;
}
}
}
for(re j=1;j<=sum;j++)
d[i][j]=dis[pos[j]];
}
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
int a;
for(re i=1;i<=k;i++)
{
scanf("%d",&a);
vis[a]^=1;
vis[a+1]^=1;
}
for(re i=1;i<=m;i++)
scanf("%d",&b[i]);
for(re i=1;i<=n+1;i++)
if(vis[i])
pos[++sum]=i;
bfs();
memset(f,0x3f,sizeof(f));
f[(1<<sum)-1]=0;
for(re s=(1<<sum)-1;s;s--)
{
int p=1;
int ss=s;
while((ss&1)==0)
{
++p;
ss>>=1;
}
for(re i=p+1;i<=sum;i++)
{
int t=s^(1<<(i-1))^(1<<(p-1));
f[t]=min(f[t],f[s]+d[p][i]);
}
}
printf("%d\n",f[0]);
return 0;
}

noip模拟测试10的更多相关文章

  1. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

  2. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  3. 7.29 NOIP模拟测试10 辣鸡(ljh)+模板(ac)+大佬(kat)

    T1 辣鸡(ljh) 就是一道分类讨论的暴搜,外加一丢丢的减枝,然而我挂了,为啥呢,分类讨论变量名打错,大于小于号打反,能对才怪,写了sort为了调试就注释了,后来忘了解开,小减枝也没打.但是这道题做 ...

  4. [NOIP模拟测试10]辣鸡(ljh) 题解

    首先计算块内贡献,很显然是$(x_2-x_1)*(y_2-y_1)*2$. 然后考虑矩形之间的贡献,sort一遍分类讨论$n^2$暴力即可. 注意考虑边界情况是否能多两个,以及角对角的情况. 另外,排 ...

  5. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  9. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

随机推荐

  1. 框架篇:分布式全局唯一ID

    前言 每一次HTTP请求,数据库的事务的执行,我们追踪代码执行的过程中,需要一个唯一值和这些业务操作相关联,对于单机的系统,可以用数据库的自增ID或者时间戳加一个在本机递增值,即可实现唯一值.但在分布 ...

  2. 11 监控MySQL主从状态是否异常

    #!/bin/bash source /etc/profile # 主从同步 # master:binlog # slave:relaylog # 写->master->binlog< ...

  3. 22、正则表达式(用于三剑客grep,awk,sed,内容中包含空行)

    简单的说就是为处理大量的字符串而定义的一套规则和方法,通过定义特殊符号的辅助,系统管理员就可以快速过滤,替换城输出需要的字符串 : ^:^word 表示匹配以什么字符开头的内容: $:word$表示匹 ...

  4. 8、linux常用命令

    8.1.pwd: 显示当前的路径: -L:显示逻辑路径,即快捷方式的路径(默认的参数): -P :显示物理路径,真实的路径: 8.2.man: 命令的查看: 8.3.help: 命令的查看: 8.4. ...

  5. (C++)戳西瓜

    写在前面的话: 请不要吝啬你的点赞!!! 题目描述 有 n 个西瓜,编号为0 到 n-1,每个西瓜上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的西瓜.每当你戳破一个西瓜 i ...

  6. SpringBoot Cache 入门

    首先搭载开发环境,不会的可以参考笔者之前的文章SpringBoot入门 添加依赖 <dependency> <groupId>org.springframework.boot& ...

  7. SpringBoot | 1.3 约定编程Spring AOP

    前言 前面聊过Spring的一个很重要的概念,IoC控制反转,接下来就是AOP了: 1. AOP切面编程 面向切面编程,是利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 ...

  8. Mysql:报错message from server: "Too many connections"(连接太多)

    报错信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source re ...

  9. vsftp安装错误总结

    1.vsftpd 530 Login incorrect 解决办法:将用户从/etc/vsftpd/ftpusers  中删除 参考:http://blog.51yip.com/linux/1672. ...

  10. 并不是static final 修饰的变量都是编译期常量

    见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(O ...