考场

第一次在 hz 考试。害怕会困,但其实还好

看完题感觉不太难,估计有人 AK。

T3 比较套路,没办法枚举黑点就从 LCA 处考虑,在一个点变成黑点时计算其他点和它的 LCA 的贡献,暴力跳父亲,显然每对 \((fa,son)\) 只有对答案的影响是相同的,即每对只需要处理一次,均摊 \(O(\log n)\),线段树在 dfs 序维护答案,区间取 \(\max\)、单点查询。

T1 T2 没啥想法,就先把 T3 码了,除了数组越界+变量打反外 顺利过大样例,拍上就丢了

T1 尝试推式子直接算答案,但又有平方项又有 \(\mod\) 很烦,那就打表找规律吧。发现有循环节,那就把首尾不是循环节的部分和一段循环节拎出来暴力 LIS,中间每个循环节显然会让答案 \(+1\)。过不了拍,膜了几组 WA 掉的数据发现两个循环节中对应数的 LIS 不一定只 \(+1\),调了调参发现拎出来循环节长度个循环节就行了,大概 9.20 过拍

时间不多了,T2 就没咋想正解。尝试反转费用和价值(DP 数组是 bool 类型怎么转啊)无果就暴力背包了。\(n=2\) 时可以扩欧,但不会求非正整数解的情况,弃了。最后 20min 无所事事

res

rk1 100+30+100

没有挂分,好耶

ycx rk2 100+30+60

ys rk3 20+90+80

最长不下降子序列

一些证明:

发现 \(a_i\) 会确定地产生 \(a_{i+1}\) ,那么在产生至多 \(D\) 个数后会出现循环节,且循环节长度不超过 \(D\)

如果循环节中有逆序对,那么答案就不止加一(后一个循环节中的大数能接在前一个的较小数中),最坏情况就是循环节是降序的,因此需要循环节长度个循环节

考场代码
const int N = 1e7+5;
int A,B,C,D;
LL n; int pre,len,suf,m,a[N],pos[200];
LL ans; struct BIT {
int t[200];
void add(int i,int x) { for(++i;i<=D;i+=i&-i)t[i]=max(t[i],x); }
int query(int i) { int res=0; for(++i;i;i-=i&-i)res=max(res,t[i]); return res; }
} bit; signed main() {
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
read(n,a[1],A,B,C,D);
pos[a[ pre=1 ]] = 1;
for(pre = 2; ; ++pre) {
a[pre] = (A*a[pre-1]*a[pre-1] + B*a[pre-1] + C) %D;
if( pos[a[pre]] ) { len = pre-pos[a[pre]], pre -= len+1; break; }
pos[a[pre]] = pre;
}
suf = (n-pre)%len, m = min((LL)pre+len*len+suf,n);
For(i,pre+len,m) a[i] = (A*a[i-1]*a[i-1] + B*a[i-1] + C) %D;
For(i,1,m) {
int f = bit.query(a[i]) + 1;
bit.add(a[i],f);
if( i <= m-len ) ans = max(ans,(LL)f);
else ans = max(ans,f+(n-m)/len);
}
write(ans);
return iocl();
}

完全背包问题

一个比较好的做法是 分层图同余最短路

一个比较 naive 的做法是 DP。

solution 写的蛮清楚的,但代码不好写,自己口胡了 1.5h

DP
const int N = 55;
int n,m,v[N],l,c; const LL inf = 0x3f3f3f3f3f3f3f3f;
int v0;
LL f[N][35][10000];
bool vis[10000]; int add(int x,int y) { return ((x+y)%v0+v0)%v0; }
void ckmin(LL &x,LL y) { if( y < x ) x = y; } namespace sub {
bitset<300001> f[55][35];
void main() {
if( v0 < l ) return;
f[0][0][0] = 1;
For(i,1,n) For(j,1,c) f[i][j] = f[i-1][j] | (f[i][j-1]<<v[i]);
while( m-- ) {
LL w; read(w);
if( w > 3e5 ) puts("No");
else puts(f[n][c][w] ? "Yes" : "No");
}
exit(0);
}
} signed main() {
read(n,m);
For(i,1,n) read(v[i]);
read(l,c);
v0 = *min_element(v+1,v+n+1);
sub::main();
memset(f,0x3f,sizeof f);
f[0][0][0] = 0;
For(i,1,n) {
if( v[i] >= l ) {
for(int k = 0; k < v0; ++k) f[i][0][k] = f[i-1][0][k];
For(j,1,c) for(int k = 0; k < v0; ++k)
ckmin(f[i][j][k] , min(f[i-1][j][k],f[i][j-1][add(k,-v[i])]+v[i]));
} else For(j,0,c) {
memset(vis,0,sizeof vis);
for(int l = 0; l < v0; ++l) if( !vis[l] ) { // 找环
int p = l;
for(int k = add(l,v[i]); k != l; k = add(k,v[i])) // 找环内开始的点
if( f[i-1][j][k] < f[i-1][j][p] )
p = k;
f[i][j][p] = f[i-1][j][p], vis[p] = 1;
for(int k = add(p,v[i]); k != p; k = add(k,v[i]))
f[i][j][k] = min(f[i-1][j][k],f[i][j][add(k,-v[i])]+v[i]),
vis[k] = 1;
}
}
For(j,0,c) for(int k = 0; k < v0; ++k) {
ckmin(f[i][j][k],f[i-1][j][k]);
if( j ) ckmin(f[i][j][k],f[i][j-1][k]);
}
}
while( m-- ) {
LL w; read(w);
puts(f[n][c][w%v0]<=w ? "Yes" : "No");
}
return 0;
}

最近公共祖先

线段树维护子树

考场代码
char readc() {
char c=getchar();
while(!isalpha(c))c=getchar();
return c;
}
void ckmax(int &x,int y) { if( y > x ) x = y; } const int N = 1e5+5;
int n,m,val[N];
vector<int> to[N]; int ind,fa[N],siz[N],dfn[N],which[N];
vector<bool> vis[N]; void dfs(int u,int fa) {
::fa[u] = fa, siz[u] = 1, dfn[u] = ++ind;
vis[u].assign(to[u].size()+1,0);
int son = 0;
for(int v : to[u]) if( v != fa ) which[v] = ++son, dfs(v,u), siz[u] += siz[v];
} namespace seg {
#define ls (u<<1)
#define rs (u<<1|1)
struct Node { int l,r,mx; } t[N*4];
void down(int u,int x) { ckmax(t[u].mx,x); }
void down(int u) {
down(ls,t[u].mx), down(rs,t[u].mx);
t[u].mx = -1;
}
void build(int u,int l,int r) {
t[u] = Node{l,r,-1};
if( l == r ) return;
int mid = l+r>>1;
build(ls,l,mid), build(rs,mid+1,r);
}
void modify(int u,int l,int r,int x) {
if( l > r ) return;
if( l <= t[u].l && t[u].r <= r ) { down(u,x); return; }
down(u);
if( l <= t[ls].r ) modify(ls,l,r,x);
if( t[rs].l <= r ) modify(rs,l,r,x);
}
int query(int u,int p) {
if( t[u].l == t[u].r ) return t[u].mx;
down(u);
return query( p<=t[ls].r?ls:rs ,p);
}
} signed main() {
// freopen("c.in","r",stdin);
// freopen("c.out","w",stdout);
read(n,m);
For(i,1,n) read(val[i]);
for(int i = 1; i < n; ++i) {
int x,y; read(x,y);
to[x].pb(y), to[y].pb(x);
}
dfs(1,0), seg::build(1,1,n);
while( m-- ) {
char op = readc(); int x; read(x);
// assert(dfn[x]<=n);
if( op == 'M' ) {
seg::modify(1,dfn[x],dfn[x]+siz[x]-1,val[x]);
for(int y = fa[x]; y && !vis[y][which[x]]; x = y, y = fa[y])
// printf("@ %d %d\n",y,x),
seg::modify(1,dfn[y],dfn[x]-1,val[y]),
seg::modify(1,dfn[x]+siz[x],dfn[y]+siz[y]-1,val[y]),
vis[y][which[x]] = 1;
} else write(seg::query(1,dfn[x]));
}
return iocl();
}

关于数据

极水,T2 T3 过不了样例都能拿 90pts,T2 不分层能拿 80pts,根本没有卡最短路,跑的比 DP 快多了

20210803 noip29的更多相关文章

  1. noip29

    T1 以下的LIS代指最长不降子序列. 考场看到取模,便想到了之前写过的Medain,取模操作让序列分布均匀,对应到本题上,既然是求LIS,那它应该是有循环节的,后来打表证实确实是有. 然后,我码了个 ...

  2. 调用免费API查询全年工作日、周末、法定节假日、节假日调休补班数据

    前言 日常开发中,难免会用到判断今天是工作日.周末.法定节假日.节假日调休补班做一些业务处理,例如:仅在上班时间给用户推送消息.本文记录调用免费API查询全年工作日.周末.法定节假日.节假日调休补班数 ...

  3. Spring Boot中使用时序数据库InfluxDB

    除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用MongoDB.LDAP这些存储的案例.接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在 ...

  4. 手撸一个SpringBoot-Starter

    1. 简介 通过了解SpringBoot的原理后,我们可以手撸一个spring-boot-starter来加深理解. 1.1 什么是starter spring官网解释 starters是一组方便的依 ...

  5. 阿里云RocketMQ定时/延迟消息队列实现

    新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...

  6. OceanBase三节点部署&&扩容

    OceanBase三节点部署&&扩容 环境信息搭建三节点(1-1-1)创建资源池和租户查看数据分布 环境信息 IP OB目录 端口 192.168.43.89 /data/observ ...

  7. Debian 11 “bullseye” 安装笔记

    作者:gc(at)sysin.org,主页:www.sysin.org Debian 版本:11 代号:bullseye 发布日期:2021.08.14 内核版本:5.10 $ uname -a Li ...

  8. linux centos7 获取开机时间

    2021-08-03 1. who 命令 who 命令显示关于当前在本地系统上的所有用户信息:登录名,线路,时间,备注 # 列出当前登录本系统的用户 who # 列出本系统的开机/重启时间 who - ...

  9. centos7 shell 计算器 bc 命令

    2021-08-03 1. 安装 yum -y install bc 2. 简介 bc 命令是任意精度计算器语言,通常在 linux 下当计算器使用 类似基本的计算器, 使用这个计算器可以做基本的数学 ...

随机推荐

  1. 【JavaWeb】EL表达式&过滤器&监听器

    EL表达式和JSTL EL表达式 EL表达式概述 基本概念 EL表达式,全称是Expression Language.意为表达式语言.它是Servlet规范中的一部分,是JSP2.0规范加入的内容.其 ...

  2. 总结开发中基于DevExpress的Winform界面效果

    DevExpress是一家全球知名的控件开发公司, DevExpress 也特指此公司出品的控件集合或某系列控件或其中某控件.我们应用最为广泛的是基于Winform的DevExpress控件组,本篇随 ...

  3. C/C++入门

    C:面向过程-函数 C++:面向对象-类:向下兼容C 程序包含头文件+主函数 简单数据类型 long long型赋超过int型范围的初值,需要在初值后面加上LL,否则可能会编译错误 不要使用float ...

  4. JAVA虚拟机的组成>从零开始学java系列

    目录 JAVA虚拟机的组成 什么是虚拟机? JAVA虚拟机的组成部分 堆区(堆内存) 方法区 虚拟机栈 本地方法栈 程序计数器 字符串常量池 JAVA虚拟机的组成 什么是虚拟机? 虚拟机是运行在隔离环 ...

  5. 【Lua篇】静态代码扫描分析(一)初步介绍

    一.静态代码分析         静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段.通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问 ...

  6. 在游戏中播放cg视频遇到的问题

    遇到问题 我们线上手游要给港澳台用户增加cg视频,在我之前文章中已经讲到了我们是怎么在unity中播放cg的--><使用AVPro Video在Unity中播放开场视频(CG)笔记> ...

  7. Haskell Command-line Application Building

    Haskeline Package Haskeline provides a user interface for line input in command-line programs. This ...

  8. shell趣味实验——图形

    目录 一.直线 二.矩形 2.1.镂空矩形 三.直角三角形 3.1.倒直角三角形 3.2.反直角三角形 3.3.等腰三角形 3.4.倒等腰三角形 3.5.菱形 四.平行四边形 五.梯形 5.1.等腰梯 ...

  9. SpringBoot开发十三-检查登录状态

    需求介绍-检查登录状态 防止用户知道我们的一些功能的链接,直接就进到了该页面,就像有些功能是管理员访问才能进的,就需要进行登录状态的判断. 我们知道这个功能点很多其他的功能点都需要使用,所以我们需要使 ...

  10. 手把手和你一起实现一个Web框架实战——EzWeb框架(四)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(四)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 这一篇文章主要实现路由组功能.实现路由 ...