NOIP2021游记总结
\(\text{Day-1}\)
惨遭遣返······
这真是伟大的啊!!
\(\text{Day1}\)
\(day\) 几好像没有意义,反正只有一天
\(\text{T1}\)
极致 \(H_2O\)
机子跑得非常“快”,样例四直接飙出 \(1s\) 了!
确实无语
还担心过不了呢
提前把 \(10^7\) 内数字含 \(7\) 的数找出来,再把他们的倍数标记掉即可
询问可以离线排序指针做到最坏 \(O(MAXV)\)
也可向 \(dch\) 那样在线二分(真慢)
我考场就打了并查集
\(\text{Code}\)
#include <cstdio>
#include <iostream>
#define re register
using namespace std;
const int N = 1e7;
int Q[6000000], cnt, fa[N + 15], bin[10], q[N + 10];
inline int check(int x)
{
int d = 0;
for(; x; x /= 10, ++d) if (x % 10 == 7) return d;
return -1;
}
void Prework()
{
bin[0] = 1;
for(re int i = 1; i <= 8; i++) bin[i] = bin[i - 1] * 10;
for(re int i = 1; i <= N + 10; i++) fa[i] = i;
int j;
for(re int i = 7; i <= N + 10; i = j + 1)
{
int k = check(i); j = i;
if (k == -1) continue;
for(; j < i + bin[k]; j++) Q[++cnt] = j;
}
for(re int i = 1; i <= cnt; i++)
for(re int j = Q[i]; j <= N + 10; j += Q[i]) fa[j] = fa[j + 1];
}
inline int find(int x)
{
q[0] = 0;
while (fa[x] != x) q[++q[0]] = x, x = fa[x];
for(re int i = 1; i <= q[0]; i++) fa[q[i]] = x;
return x;
}
inline void read(int &x)
{
x = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
}
int main()
{
freopen("number.in", "r", stdin), freopen("number.out", "w", stdout);
int T; read(T);
Prework();
for(re int i = 1, x; i <= T; i++)
{
read(x);
if (find(x) != x) printf("-1\n");
else printf("%d\n", find(x + 1));
}
}
\(\text{T2}\)
这真是悲伤的啊!!怎么 \(T2\) 又是这种题!
最讨厌这种纯 \(DP\) 题了,一点意思都没有
考场简单无脑 \(DP\) 水了 \(50pts\)
正解也很无脑
设 \(f_{i,j,k,l}\) 表示考虑到第 \(i\) 位,前面选了 \(j\) 个数,第 \(0\) 到 \(i-1\) 位产生了 \(k\) 个 \(1\),这些位置给第 \(i\) 位的进位为 \(l\) 时的答案
转移考虑第 \(i\) 位的选数,枚举选的个数 \(t\)
\]
答案就是到 \(m+1\) 位产生的 \(1\) 的个数与进位的数往高位推完后产生的 \(1\) 的个数的和小于等于 \(K\) 的 \(f\) 值之和
\(\text{Code}\)
#include <cstdio>
#define RE register
using namespace std;
typedef long long LL;
const int P = 998244353;
int n, m, K, v[111];
LL f[111][35][35][35], pw[111][35], fac[35], ans, ifac[35];
inline void Add(LL &x, LL y){x += y, x = (x > P ? x - P : x);}
inline LL fpow(LL x, LL y){LL s = 1; for(; y; y >>= 1, x = x * x % P) if (y & 1) s = s * x % P; return s;}
inline LL C(int n, int m){return fac[n] * ifac[m] % P * ifac[n - m] % P;}
inline int calc(int x){int s = 0; for(; x; x >>= 1) s += (x & 1); return s;}
int main()
{
scanf("%d%d%d", &n, &m, &K);
fac[0] = ifac[0] = 1;
for(RE int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % P, ifac[i] = fpow(fac[i], P - 2);
for(RE int i = 0; i <= m; i++) scanf("%d", &v[i]);
for(RE int i = 0; i <= m; i++)
for(RE int j = 0; j <= n; j++) pw[i][j] = fpow(v[i], j);
f[0][0][0][0] = 1;
for(RE int i = 0; i <= m; i++)
for(RE int j = 0; j <= n; j++)
for(RE int k = 0; k <= K; k++)
for(RE int l = 0; l <= (n >> 1); l++)
if (f[i][j][k][l])
for(RE int t = 0; t + j <= n; t++)
Add(f[i+1][j+t][k+((l+t)&1)][l+t>>1], f[i][j][k][l] * pw[i][t] % P * C(j+t, t) % P);
for(RE int k = 0; k <= K; k++)
for(RE int l = 0; l <= n / 2; l++)
if (f[m + 1][n][k][l] && k + calc(l) <= K) Add(ans, f[m + 1][n][k][l]);
printf("%lld\n", ans);
}
\(\text{T3}\)
直接水分走起,还忘记打模拟退火了!!
正解又是 \(DP\)
发现一些性质
1.对原序列差分之后,修改操作相当于交换相邻两差分值
2.最优序列差分值是一个单谷型的
3.原序列同时减去一个相同的数方差不变
4.对与一个序列答案是 \(n\sum_{i=1}^n a_i^2-(\sum_{i=1}^n a_i)^2\)
那么我们就可以差分后 \(DP\) 构造这个最优解了
设 \(f_{i,j}\) 表示安排完前 \(i\) 个差分值,当前产生的 \(a\) 序列的和为 \(j\) 时最优的 \(\sum a_i^2\)
转移考虑当前差分值序列放前面或后面即可
非常 \(easy\)
\(\text{Code}\)
#include <cstdio>
#include <algorithm>
#define IN inline
#define RE register
using namespace std;
typedef long long LL;
const int N = 10000;
const LL INF = 1e17;
int n, a[N + 5], b[N + 5], cur;
LL f[2][N * 50 + 5];
IN void MIN(LL &x, LL y){x = min(x, y);}
IN LL Sqr(LL x){return x * x;}
int main()
{
scanf("%d", &n);
for(RE int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(RE int i = 1; i < n; i++) b[i] = a[i + 1] - a[i];
for(RE int i = 0; i <= n * a[n]; i++) f[0][i] = f[1][i] = INF;
sort(b + 1, b + n);
int k = 1; while (b[k] == 0 && k + 1 < n) ++k;
f[k & 1 ^ 1][0] = 0;
for(RE int i = k; i < n; cur += b[i++])
{
for(RE int j = 0; j <= i * a[n]; j++) f[i & 1][j] = INF;
for(RE int j = 0; j <= (i - 1) * a[n]; j++)
if (f[i & 1 ^ 1][j] < INF)
{
MIN(f[i & 1][j + cur + b[i]], f[i & 1 ^ 1][j] + Sqr(cur + b[i]));
MIN(f[i & 1][j + i * b[i]], f[i & 1 ^ 1][j] + Sqr(b[i]) * i + 2LL * j * b[i]);
}
}
LL ans = INF;
for(RE int j = 0; j <= n * a[n]; j++)
if (f[n & 1 ^ 1][j] < INF) MIN(ans, f[n & 1 ^ 1][j] * n - Sqr(j));
printf("%lld\n", ans);
}
\(\text{T4}\)
鉴于 \(\text{CSPS2021 T4}\) 的教训题都没看
但后来发现暴力分很高的样子
\(\text{Summary}\)
今年从 \(CSP\) 到 \(NOIP\) 最亏的就是纯 \(DP\) 题
这方面太薄弱了
纯 \(DP\) 题做得太少,考场遇到没有想法
主要是以前很少考这种题,今年直接疯狂连击!
确实很无语
出这种题的好处是出题人十分开心
要做做这方面的题(虽然这类题很无聊)
NOIP2021游记总结的更多相关文章
- 背水一战——CSP2021/NOIP2021 游记
洛谷 version 转载本文章的其他链接: 1(S00021 提供) 2(Ew_Cors 提供) \[\texttt{2021.9.10} \] 终于开坑了. 笑死,初赛根本还没开始复习,反正初赛也 ...
- CSp2021/ NOIp2021 游记
目录 Part 1. CSp2021 J S Part 2. NOIp2021 总结 Part 1. CSp2021 J 好水 挂飞 239pts,1= S 好毒瘤 rnm,写了个暴力就去搞 T2 \ ...
- NOIP2021游记(退役记)
11月 13日 停课了 学了一上午+一晚上的分块. 下午月赛切掉两道题之后xzh发现E题是道树剖,果断开始切E. 结果: 做了快两个小时还是0分. 11月 14日 上午把黄题冲上了100,绿题冲上了5 ...
- NOIP2021 游记
不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分不要挂分释迦牟尼脚绽莲花菩提达摩你真伟大天上天下唯我独尊如来佛祖太上老君耶稣耶稣 ...
- 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记
先挖坑(这个blog怎么变成游记专用了--) 已更完 #include <cstdio> using namespace std; int main(){ puts("转载请注明 ...
- 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记
先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...
- NOIp2016 游记
DAY -2 不要问我为什么现在就开了一篇博客. 本来想起个NOIp2016爆零记或者NOIp2016退役记之类的,但是感觉现在不能乱立flag了.所以就叫游记算了. 前几场模拟赛崩了一场又一场,RP ...
- NOIP2016游记
只是游记而已.流水账. Day0:忘了. Day1:看完T1,本以为T2一如既往很简单,结果看了半天完全没有思路.然后看了一眼T3,期望,NOIP什么时候要考期望了,于是接着看T2.一开始我推的限制条 ...
- CTSC2016&&APIO2016滚粗记&&酱油记&&游记<del>(持续更新)</del>
挖一波坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs. ...
- 游记——noip2016
2016.11.18 (day 0) 呆在家. 悠闲地呆在家.. 明后天可能出现的错误: 1)没打freopen.打了ctime: 2)对拍程序忘记怎么写了...忘记随机化种子怎么写了: 3)不知道厕 ...
随机推荐
- 同一服务器部署多tomcat以及MyEclipse添加多tomcat
tomcat有很多版本但他们的部署方式并不因为版本的不同而改变其的部署方式,操作者不必考虑此等原因.本人办公电脑使用的是tomcat7,家里自用的是6版本,这里就以6版本为例实现同一台机器上部署多to ...
- MySQL 的 NULL 值是怎么存储的?
大家好,我是小林. 之前有位读者在面字节的时候,被问到这么个问题: 如果你知道 MySQL 一行记录的存储结构,那么这个问题对你没什么难度. 如果你不知道也没关系,这次我跟大家聊聊 MySQL 一行记 ...
- 记一次 .NET 某电子厂OA系统 非托管内存泄露分析
一:背景 1.讲故事 这周有个朋友找到我,说他的程序出现了内存缓慢增长,没有回头的趋势,让我帮忙看下到底怎么回事,据朋友说这个问题已经困扰他快一周了,还是没能找到最终的问题,看样子这个问题比较刁钻,不 ...
- 【JVM调优】Day01:Garbage的概念、垃圾回收的算法(标记清除、拷贝、标记压缩)、各种垃圾回收器(Serial、Parallel、CMS并发)及存在的问题
〇.前言 简历写上:熟悉GC常用算法,熟悉常见垃圾回收器.具有实际JVM调优实战经验 瞬间涨3k 一.什么是garbage Java中垃圾回收器自动进行垃圾回收,不用自己回收 new 对象在内存中,c ...
- re、base64的结合使用爬取豆瓣top250
一.缘由 对于豆瓣的这个网站,记得使用了不少于三种的爬取和解析方式来进行的.今天的这种解析方式是我使用起来较为顺手,后来就更喜欢使用xpath解析,但是这两种也需要掌握. 二.代码展示 '''爬取豆瓣 ...
- 去哪儿是如何做到大规模故障演练的?|TakinTalks
# 一分钟精华速览 # 混沌工程作为一种提高技术架构弹性能力和容错能力的复杂技术手段,近年来讨论声音不断,相比在分布式系统上进行随机的故障注入实验,基于混沌工程的大规模自动化故障演练,不仅能将&quo ...
- Python全栈工程师之从网页搭建入门到Flask全栈项目实战(6) - Flask表单的实现
1.表单介绍 1.1.表单知识回顾 常见的表单元素: 表单标签<form> action:表单提交的URL地址 method:表单请求的方式(GET/POSt) enctype:请求内容的 ...
- echarts去除下载小图标
toolbox: { show: true, orient: 'vertical', left: 'right', top: 'center', feature: { dataView: { read ...
- 10、RestTemplate方式实现远程调用Client
一.JSONObject类详解: JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进行了封装,添加了很多 ...
- [生命科学] snapgene 构建载体方法分享
snapgene 构建载体方法分享 文章目录 snapgene 构建载体方法分享 1. Snapgene 构建载体-酶切位点法 2. 载体构建--同源重组法 3. 总结 1. Snapgene 构建载 ...