noip10
T1
直接暴力可拿60pts,不开 long long 会挂5pts,时间复杂度
\(\mathcal O(n^{4})\) , 然而这过不了400的数据,至少也要 \(\mathcal O(n^{3})\),然后,考试的时候就想不出来了。
正解,枚举行,计算出模 \(k\) 意义下余数相同的矩阵的个数,统计答案即可。
Code
#include<cstdio>
#define MAX 1000001
#define re register
#define int long long
namespace OMA
{
int n,m,p,ans;
int sum[401][401];
int cnt[MAX],pre[401];
inline int read()
{
int s=0,w=1; 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;
}
signed main()
{
n = read(),m = read(),p = read();
for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=m; j++)
{ (sum[i][j] += sum[i-1][j]+sum[i][j-1]+read()-sum[i-1][j-1]+p) %= p; }
}
for(re int i=0; i<=n-1; i++)
{
for(re int j=i+1; j<=n; j++)
{
cnt[0] = 1;
for(re int k=1; k<=m; k++)
{ ans += cnt[(pre[k] = sum[j][k]-sum[i][k]+p) %= p]++; }
for(re int k=1; k<=m; k++)
{ cnt[pre[k]] = 0; }
}
}
printf("%lld\n",ans);
return 0;
}
}
signed main()
{ return OMA::main(); }
T2
\(k=0\) 时,直接输出 \(n\) ,5pts。
\(k=1\) 时。直接树形dp,类似于小胖守皇宫,40pts。
正解:
- 可以用树形dp过,但不好搞,不过大帝做到了。
- 贪心,我们设 \(dp_{u,0}\) 表示 \(u\) 到最近被控制点的距离, \(dp_{u,1}\) 表示 \(u\) 到最远没被控制点的距离。
初始化,\(dp_{u,0}=\infty,dp_{u,1}=0\),
当 \(dp_{u,0}+dp_{u,1}<=k\) 时,说明该节点能被控制,不会对答案有贡献。 \(dp_{u,1}=-1\)
当 \(dp_{u,1}=k\) 时,此时该点必须被控制,这时已经达到能控制点的的最远距离,如果再向上的话,则无法控制 \(u\)。 \(dp_{u,0}=0,dp_{u,1}=-1\)
记得特判一下根节点能否被控制。 - 还有种 \(\mathcal O(n)\) 做法
Code
#include<cstdio>
#define MAX 100001
#define re register
namespace OMA
{
int n,k,t;
struct Graph
{
int next;
int to;
}edge[MAX<<1];
int cnt=1,head[MAX];
int dp[MAX][2],ans;
inline int read()
{
int s=0,w=1; 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;
}
inline void add(int u,int v)
{
edge[++cnt].next = head[u];
edge[cnt].to = v;
head[u] = cnt;
}
inline int min(int a,int b)
{ return a<b?a:b; }
inline int max(int a,int b)
{ return a>b?a:b; }
inline void dfs(int u,int fa)
{
dp[u][0] = 0x3f,dp[u][1] = 0;
for(re int i=head[u]; i; i=edge[i].next)
{
int v = edge[i].to;
if(v!=fa)
{
dfs(v,u);
if(~dp[v][1])
{ dp[u][1] = max(dp[u][1],dp[v][1]+1); }
dp[u][0] = min(dp[u][0],dp[v][0]+1);
}
}
if(dp[u][1]==k)
{ ans++,dp[u][0] = 0,dp[u][1] = -1; }
if(dp[u][0]+dp[u][1]<=k)
{ dp[u][1] = -1; }
}
signed main()
{
n = read(),k = read(),t = read();
for(re int i=1; i<=n-1; i++)
{
int u = read(),v = read();
add(u,v),add(v,u);
}
dfs(1,0);
if(~dp[1][1])
{ ans++; }
printf("%d\n",ans);
return 0;
}
}
signed main()
{ return OMA::main(); }
T3
考试的时候想了状压 \(k\) ,但是不会看到范围才想的状压
直接输出1,4pts。
对于 \(n\le16\) ,直接状压,24pts。
对于 \(m=1\) ,的情况,直接从前往后扫,遇见没亮的就点,28pts。
玄学 \(rand()\) ,可骗0~12pts不等 TLEer拿阳寿换的12pts
正解:
神仙转换。
先咕了QAQ
Code
#include<queue>
#include<cstdio>
#define MAX 40001
#define re register
namespace OMA
{
int n,k,m,cnt;
std::queue<int>q;
int vis[MAX],dis1[MAX];
int a[MAX],b[70],p[MAX];
int dis[20][20],top,dp[1<<17];
inline int read()
{
int s=0,w=1; 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;
}
inline int min(int a,int b)
{ return a<b?a:b; }
inline void bfs(int u)
{
for(re int i=0; i<=n; i++)
{ dis1[i] = vis[i] = 0; }
q.push(u);
vis[u] = true;
while(!q.empty())
{
int k = q.front(); q.pop();
for(re int i=1; i<=m; i++)
{
int v[2] = {k-b[i],k+b[i]};
if(v[0]>=0&&!vis[v[0]])
{ q.push(v[0]),dis1[v[0]] = dis1[k]+(vis[v[0]] = 1); }
if(v[1]<=n&&!vis[v[1]])
{ q.push(v[1]),dis1[v[1]] = dis1[k]+(vis[v[1]] = 1); }
}
}
}
signed main()
{
n = read(),k = read(),m = read();
for(re int i=1; i<=k; i++)
{ a[read()] = 1; }
for(re int i=1; i<=m; i++)
{ b[i] = read(); }
for(re int i=0; i<=n; i++)
{
if(a[i]^a[i+1])
{ p[++cnt] = i; }
}
for(re int i=1; i<=cnt; i++)
{
bfs(p[i]);
for(re int j=1; j<=cnt; j++)
{ dis[i][j] = dis1[p[j]]; }
}
top = (1<<cnt)-1;
for(re int i=1; i<=top; i++)
{ dp[i] = 0x3f3f3f3f; }
for(re int i=0; i<=top; i++)
{
int k = 0;
while(i&(1<<k))
{ k++; }
for(re int j=k+1; j<=cnt-1; j++)
{
if(!(i&(1<<j))&&dis[j+1][k+1])
{ dp[i|(1<<j)|(1<<k)] = min(dp[i|(1<<j)|(1<<k)],dp[i]+dis[j+1][k+1]); }
}
}
printf("%d\n",dp[top]);
return 0;
}
}
signed main()
{ return OMA::main(); }
noip10的更多相关文章
- [NOIP10.6模拟赛]1.merchant题解--思维+二分
题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...
- [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
题目链接: 咕 闲扯: 终于在集训中敲出正解(虽然与正解不完全相同),开心QAQ 首先比较巧,这题是\(Ebola\)出的一场模拟赛的一道题的树上强化版,当时还口胡出了那题的题解 然而考场上只得了86 ...
- [NOIP10.5模拟赛]1.a题解--离散化+异或线段树
题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...
- [NOIP10.5模拟赛]3.c题解--思维
题目链接 这次不咕了 https://www.luogu.org/problemnew/show/AT2389 闲扯 考场20分爆搜走人 \cy 话说这几天T3都很考验思维啊 分析 我们先钦定一只鸡( ...
- [NOIP10.3模拟赛]3.w题解--神奇树形DP
题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...
- [NOIP10.4模拟赛]3.z题解--思维
题目链接: 咕咕 闲扯: 哈哈这道T3考场上又敲了5个namespace,300+行,有了前车之鉴还对拍过,本以为子任务分稳了 结果只有30分哈哈,明明用极限数据对拍过不知怎么回事最后数据又是读不全, ...
- [NOIP10.4模拟赛]2.y题解--折半搜索+状压计数
题目链接: 咕 闲扯: 这题暴力分似乎挺多,但是一些奇奇怪怪的细节没注意RE了,还是太菜了 分析: 首先我们考虑最naiive的状压DP ,\(f[u][v][state]\)表示u开头,v结尾是否存 ...
随机推荐
- Docker部署Redis集群(主从复制 高可用)
环境 vmware12+centos7 关于环境安装可以参考我的另一篇博客 https://www.cnblogs.com/pengboke/p/13063168.html 1.清理环境 我这里用的虚 ...
- 『心善渊』Selenium3.0基础 — 28、unittest中测试套件的使用
目录 1.测试套件的作用 2.使用测试套件 (1)入门示例 (2)根据不同的条件加载测试用例(了解) (3)常用方式(推荐) 1.测试套件的作用 在我们实际工作,使用unittest框架会有两个问题: ...
- HAl库控制L298N直流电机旋转笔记
主函数开始后的处理流程: 1..所有外设初始化:HAL_Init() 2.系统时钟配置 RCC振荡器初始化:HAL_RCC_OsConfig() RCC时钟初始化:HAL_RCC_ClockConfi ...
- 史上最强Tableau Server 安装教程
前言 本文介绍的是单节点部署Tableau Server. 安装前 1.Tableau Server 的单节点安装的最低硬件推荐配置: 处理器: 64 位 必须支持 SSE4.2 和 POPCNT 指 ...
- HMAC简介及HMAC-SHA256实现Demo
一.什么是HMAC HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思. HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HM ...
- Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记
目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...
- java面向对象(下)-抽象类
抽象类和抽象方法 抽象类和抽象方法必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法 抽象类和抽象方法的规则如下 1.抽象类和抽象方法必须要用abstra ...
- 【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)
151. 翻转字符串里的单词 知识点:字符串:双指针 题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔 ...
- Spark—编译Spark源码
Spark版本:Spark-2.1.0 Hadoop版本:hadooop-2.6.0-cdh5.7.0 官方文档:http://spark.apache.org/docs/latest/buildin ...
- SPOJ ABCDEF题解
题面 源 OJ 未 AC(卡 \(map\) ,不想写 \(hash\) ). 看到 \(n \leq 100\) ,显然 \(O(n^6)\) 会挂掉,所以要优化. 考虑到原式可化为 \(a \ti ...