[考试总结]noip模拟43
这个题目出的还是很偷懒。。。。
第一题。。。第二题。。。第三题。。。四。。。。
好吧。。。
这几次考得都有些问题,似乎可能是有些疲惫,脑袋也是转不太动,考完总觉得自己是能力的问题,但是改一分钟之后会发现自己硬生生把正解干成了暴力。
第一题
这个题目一眼看上去是一个很不错的贪心题目。
之后我们确实可以使用贪心来做这个题目。
其实就是我们发现一定会是先走到小的里面,然后再去折到上面。
然后其实这个题目还是可以使用 \(dp\) 来做,可是我似乎是不会。。。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
#define asm(i,x) for(register signed i=head[x];i;i=edge[i].next)
namespace xin_io
{
#define sb(x) cout<<#x" = "<<x<<' '
#define jb(x) cout<<#x" = "<<x<<endl
#define debug cout<<"debug"<<endl
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
char buf[1<<20],*p1 = buf,*p2 = buf; int ak; typedef long long ll; typedef unsigned long long ull;
class xin_stream{public:template<typename type>inline xin_stream &operator >> (type &s)
{
register int f = 0;s = 0; register char ch = gc();
while(!isdigit(ch)) {f |= ch == '-'; ch = gc();}
while( isdigit(ch)) s = (s << 1) + (s << 3) + (ch xor 48),ch = gc(); return s = f ? -s : s,*this;
}}io;
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 1e9+7; const ll llinf = 1e18+7;
namespace xin
{
class xin_edge{public:int next,ver;}edge[maxn];
int head[maxn],zhi = 0;
inline void add(int x,int y) {edge[++zhi].ver = y; edge[zhi].next = head[x]; head[x] = zhi;}
int n,ind[maxn];
int d[maxn],maxd[maxn];
int sum[maxn],val[maxn];
class xin_data
{
private:
friend bool operator < (xin_data x,xin_data y)
{return x.maxd < y.maxd;}
public:
int x,maxd;
xin_data(){}
xin_data(int x,int maxd):x(x),maxd(maxd){}
};
void dfs1(int x,int f)
{
d[x] = d[f] + 1; maxd[x] = d[x];
asm(i,x)
{
register int y = edge[i].ver;
if(y == f) continue;
dfs1(y,x);
maxd[x] = std::max(maxd[x],maxd[y]);
}
}
void dfs2(int x,int f)
{
std::vector < xin_data > vec; vec.clear();
asm(i,x)
{
register int y = edge[i].ver;
if(y == f) continue;
dfs2(y,x);
vec.push_back(xin_data(y,maxd[y]));
val[x] += sum[y];
}
std::sort(vec.begin(),vec.end());
try(i,0,(int)vec.size() - 1)
{
if(i and vec[i-1].maxd - d[x] < d[x]) sum[x]--,val[x] += vec[i-1].maxd - d[x];
sum[x] += sum[vec[i].x]; val[x] += val[vec[i].x];
}
}
inline short main()
{
io >> n;
try(i,1,n-1)
{
register int x,y; io >> x >> y;
add(x,y); add(y,x); ind[x] ++; ind[y] ++;
}
dfs1(1,0);
try(i,1,n) if(ind[i] == 1) sum[i] = 1;
dfs2(1,0);
cout<<val[1]<<endl;
return 0;
}
}
signed main() {return xin::main();}
第二题
似乎好像是用 \(dij\) 或者是 \(spfa\),但是我使用了 \(nb\) 方法过了。
我们有一个很 \(naive\) 的想法就是二分答案,之后每一个格子这样 \(\mathcal O(nm)\) 的去找,然后把小的那个加上需要的差值。
然后我们就很容易发现这个做法是个假的。
但是。
进行的每一次 \(\mathcal O(nm)\) 扫描,其实都是一次修正性算法。
所以每一次进行这个算法,都会更加正确。
所以我们只需要多做几次,也就是增加几个常数,然后就可以顺利过掉这个题目。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
#define asm(i,x) for(register signed i=head[x];i;i=edge[i].next)
namespace xin_io
{
#define sb(x) cout<<#x" = "<<x<<' '
#define jb(x) cout<<#x" = "<<x<<endl
#define debug cout<<"debug"<<endl
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
char buf[1<<20],*p1 = buf,*p2 = buf; int ak; typedef long long ll; typedef unsigned long long ull;
class xin_stream{public:template<typename type>inline xin_stream &operator >> (type &s)
{
register int f = 0;s = 0; register char ch = gc();
while(!isdigit(ch)) {f |= ch == '-'; ch = gc();}
while( isdigit(ch)) s = (s << 1) + (s << 3) + (ch xor 48),ch = gc(); return s = f ? -s : s,*this;
}}io;
}
#define int long long
using namespace xin_io; static const int maxn = 1e6+10,inf = 1e9+7; const ll llinf = 1e18+7;
namespace xin
{
#define abs(x) (x < 0 ? -x : x)
int n,m,k;
int a[maxn/200][maxn/200],b[maxn/200][maxn/200];
inline bool check(int x)
{
register int temp = k;
try(i,1,n) try(j,1,m) b[i][j] = a[i][j];
try(cse,1,14)
try(i,1,n) try(j,1,m)
{
if(j - 1 >= 1) //(i,j-1)
{
register int cha = b[i][j] - b[i][j-1];
if(abs(cha) > x)
{
temp -= abs(cha) - x;
if(cha < 0) b[i][j] += abs(cha) - x;
else b[i][j-1] += abs(cha) - x;
}
}
if(j + 1 <= m) //(i,j+1)
{
register int cha = b[i][j] - b[i][j+1];
if(abs(cha) > x)
{
temp -= abs(cha) - x;
if(cha < 0) b[i][j] += abs(cha) - x;
else b[i][j+1] += abs(cha) - x;
}
}
if(i + 1 <= n and j - 1 >= 1) //(i+1,j-1)
{
register int cha = b[i][j] - b[i+1][j-1];
if(abs(cha) > x)
{
temp -= abs(cha) - x;
if(cha < 0) b[i][j] += abs(cha) - x;
else b[i+1][j-1] += abs(cha) - x;
}
}
if(i - 1 >= 1) //(i-1,j)
{
register int cha = b[i][j] - b[i-1][j];
if(abs(cha) > x)
{
temp -= abs(cha) - x;
if(cha < 0) b[i][j] += abs(cha) - x;
else b[i-1][j] += abs(cha) - x;
}
}
if(i -1 >= 1 and j + 1 <= m) //(i-1,j+1)
{
register int cha = b[i][j] - b[i-1][j+1];
if(abs(cha) > x)
{
temp -= abs(cha) - x;
if(cha < 0) b[i][j] += abs(cha) - x;
else b[i-1][j+1] += abs(cha) - x;
}
}
if(i + 1 <= n) //(i+1,j)
{
register int cha = b[i][j] - b[i+1][j];
if(abs(cha) > x)
{
temp -= abs(cha) - x;
if(cha < 0) b[i][j] += abs(cha) - x;
else b[i+1][j] += abs(cha) - x;
}
}
}
return temp >= 0;
}
int maxx = -inf;
inline short main()
{
io >> n >> m >>k ;
try(i,1,n) try(j,1,m) io >> a[i][j],maxx = std::max(a[i][j],maxx);
register int l = 0,r = maxx;
while(l != r - 1 and l < r)
{
register int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid;
}
if(check(l)) cout<<l<<endl;
else cout<<r<<endl;
return 0;
}
}
signed main() {return xin::main();}
第三题
一个 \(10\) 分暴力滚粗了。。。。
第四题
一个很强的 \(dp\),到现在还是不是很理解。。。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
#define asm(i,x) for(register signed i=head[x];i;i=edge[i].next)
namespace xin_io
{
#define sb(x) cout<<#x" = "<<x<<' '
#define jb(x) cout<<#x" = "<<x<<endl
#define debug cout<<"debug"<<endl
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
char buf[1<<20],*p1 = buf,*p2 = buf; int ak; typedef long long ll; typedef unsigned long long ull;
class xin_stream{public:template<typename type>inline xin_stream &operator >> (type &s)
{
register int f = 0;s = 0; register char ch = gc();
while(!isdigit(ch)) {f |= ch == '-'; ch = gc();}
while( isdigit(ch)) s = (s << 1) + (s << 3) + (ch xor 48),ch = gc(); return s = f ? -s : s,*this;
}}io;
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 1e9+7; const ll llinf = 1e18+7;
#define int long long
namespace xin
{
#define fmod(x) (x -= (x >= mod) ? mod : 0)
int ans = 0;
int f[maxn/300][maxn/300],g[maxn/300][maxn/300];
int n,mod;
int sum[maxn/300][maxn/300];
inline short main()
{
io >> n >> mod; f[0][0] = 1;
try(i,1,n) try(j,1,n) f[i][j] = (f[i-1][j-1] + f[i-1][j] * j % mod),fmod(f[i][j]);
try(i,1,n) g[0][i] = 1;
try(i,1,n) try(j,1,n) g[i][j] = (g[i-1][j+1] + g[i-1][j] * j % mod),fmod(g[i][j]);
try(i,1,n) throw(j,n,1)
{
sum[i][j] = f[i-1][j] * (g[n-i][j] + 2 * (n - i * 1ll) * g[n-i-1][j] % mod) % mod;
sum[i][j] += sum[i][j+1]; fmod(sum[i][j]);
}
try(x,1,n)
{
register int ans = 0;
try(i,1,n)
{
register int temp = sum[i][x];
(temp += f[i-1][x-1] * (g[n-i][x] + 2 * (n - i * 1ll) * g[n-i-1][x] % mod) % mod); fmod(temp);
(ans += temp); fmod(ans);
}
printf("%lld ",ans);
}
return 0;
}
}
signed main() {return xin::main();}
[考试总结]noip模拟43的更多相关文章
- 8.18考试总结[NOIP模拟43]
又挂了$80$ 好气哦,但要保持优雅.(草 T1 地衣体 小小的贪心:每次肯定从深度较小的点向深度较大的点转移更优. 模拟一下,把边按链接点的子树最大深度排序,发现实际上只有上一个遍历到的点是对当前考 ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- 5.23考试总结(NOIP模拟2)
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- [考试总结]noip模拟23
因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...
- 「考试」noip模拟9,11,13
9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...
- 6.11考试总结(NOIP模拟7)
背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...
- 6.10考试总结(NOIP模拟6)
前言 就这题考的不咋样果然还挺难改的.. T1 辣鸡 前言 我做梦都没想到这题正解是模拟,打模拟赛的时候看错题面以为是\(n\times n\)的矩阵,喜提0pts. 解题思路 氢键的数量计算起来无非 ...
随机推荐
- noip模拟测试21
考试总结:这次考试,前两道题的题面描述不是很清楚,导致我不知道输出格式到底是什么,挂了差不多80分(好多人也是这样),总体来说,这次考试的前两道题暴力分是打满了,最后一道题打了一个假的暴搜,在考场上没 ...
- 自学linux——5.网络设置
网络设置 1.网卡配置文件位置:ls /etc/sysconfig/network-scripts/ 2.网卡配置文件命名:ifcfg-网卡名称 3.查看网卡配置文件:cat /etc/sysconf ...
- K8S为什么要弃用Docker?Dockershim将移除
一.背景由于最近知道了 K8s 新版本(v1.20)确定弃用 Docker 的消息,为了明确是否会对现有系统架构产生响,所以对涉及到的相关技术进行了一定的梳理(索性的是对现有的系统架构基本无影响:&g ...
- 串、KMP模式匹配算法
串是由0个或者多个字符组成的有限序列,又名叫字符串. 串的比较: 串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号. 计算机中常用的ASCII编码,由8位二进制 ...
- ElasticSearch进阶篇(一)--版本控制
一.前言 ElasticSearch(以下简称ES)的数据写入支持高并发,高并发就会带来很普遍的数据一致性问题.常见的解决方法就是加锁.同样,ES为了保证高并发写的数据一致性问题,加入了类似于锁的实现 ...
- 线程的分离状态(detached state)
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: [cpp] view plaincopyprint? int pt ...
- 007 GMII、SGMII和SerDes的区别和联系
一.GMII和SGMII的区别和联系 GMII和SGMII区别,上一篇已经介绍了,这一篇重点介绍SGMII和SerDes区别. GMII和SGMII GMII 在MII接口基础上提升了数据位宽和Clo ...
- kubernetes/k8s CNI分析-容器网络接口分析
关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...
- BuildPack 打包
无需 dockerfile,使用 buildpacks 打包镜像 书接上文,聪明如你已经发现项目中没有定义 dockerfile,但我们依然能打镜像,是如何做到的呢?正如上面提到的 gradle 的 ...
- ubuntu20.04 apache2 配置安装ssl证书
1. 获取SSL证书 根据自己的网站服务器来获取不同的ssl证书,我的服务器是ubuntu20.04. 证书如下: 00_***.key ## 私钥文件 01_CERTIFICATE_***_***. ...