2020 省选模拟测试 Round #8 solution (20/02/07)

【比赛链接】http://59.61.75.5:8018/contest/218

A. 并

【题意】

一棵 $n$ 个点的树有 $n-1$ 条边,分别为 $(u_1,v_1),(u_2,v_2),\cdots,(u_{n-1},v_{n-1})$. 开始时,对每个点 $u$,有集合 $S_u=\{u\}$。

有 $m$ 个操作,第 $i$ 次操作给定 $p_i$,将 $S_{u_{p_i}}$ 与 $S_{v_{p_i}}$ 赋为它们的并。

所有操作结束后,对所有的 $i\in[1,n]$,求包含 $i$ 的集合的数目。

【数据范围】$n,m\le 5\times 10^5$。

【题解】

考虑每个点什么时候会被统计。显然每次包含其连通块的操作都会影响。将操作反序处理,统计一下即可。

效率 $O(m+n)$。期望得分:100。

【代码】

 1 #include<bits/stdc++.h>
 2 int n,m,u[500010],v[500010],s[500010],val[500010],q[500010];
 3 signed main()
 4 {
 5     scanf("%d%d",&n,&m);
 6     for ( int i=1;i<n;i++ ) scanf("%d%d",&u[i],&v[i]);
 7     for ( int i=1;i<=n;i++ ) s[i]=1;
 8     for ( int i=1;i<=m;i++ ) scanf("%d",&q[i]);
 9     for ( int i=m,x;i;i-- ) x=q[i],s[u[x]]=s[v[x]]=s[u[x]]+s[v[x]]-val[x],val[x]=s[u[x]];
10     for ( int i=1;i<=n;i++ ) printf("%d%c",s[i]," \n"[i==n]);
11     return 0;
12 }

DTOJ4710

C. 管理

【题意】

一排 $n$ 个物品,第 $i$ 个物品权值为 $a_i$,请将其分成恰好 $k$ 非空段,且让同段中 $a_i$? 相同的二元组 $(i,j)$ 尽量少。亦即,假设在第 $i$ 段里权值为 $j$ 物品有 $c(i,j)$ 个,则请最小化 $\sum\limits_{i=1}^k\sum\limits_{j}\binom{c(i,j)}{2}$。

【数据范围】$2\le n\le 10^5,\,1\le k\le \min\{n,20\},\,1\le a_i\le n$。

【题解】

考虑 $dp$。设 $f[i][j]$ 表示前 $i$ 个数分为 $k$ 段的最小值。则有:$f[i][j]=\min\limits_{0\leq k <i}(f[k][j-1]+w(k+1,i))$。

对于 $k$,由于 $k$ 较小,显然可以分层处理,即对每一层 $j$ 分别转移。

打表发现具有决策单调性。又无法用指针或单调队列维护具体情况,考虑用分治法处理决策单调性。

考虑如何计算 $w(l,r)$。显然可以由 $w(l,r)$ 推至 $w(l-1,r)$ 等类似位置。因此用类似莫队的方法进行维护即可。

效率 $O(nk\log n)$。期望得分:100。

 1 #include<bits/stdc++.h>
 2 const long long inf=1LL<<60;
 3 int n,k,cnt[100010],a[100010],pl,pr;
 4 long long f[100010][22],res;
 5 inline void Ins ( int x,int v ) { res-=1LL*cnt[x]*(cnt[x]-1)/2;cnt[x]+=v;res+=1LL*cnt[x]*(cnt[x]-1)/2; }
 6 inline void solve ( int l,int r,int L,int R,int k )
 7 {
 8     int mid=(l+r)>>1;
 9     while ( pl>L+1 ) Ins(a[--pl],1);
10     while ( pr<mid ) Ins(a[++pr],1);
11     while ( pl<L+1 ) Ins(a[pl++],-1);
12     while ( pr>mid ) Ins(a[pr--],-1);
13     int p=L;long long ans=f[L][k-1]+res;
14     while ( pl<=mid and pl<=R+1 )
15     {
16         if ( f[pl-1][k-1]+res<=ans ) ans=f[pl-1][k-1]+res,p=pl-1;
17         Ins(a[pl++],-1);
18     }
19     f[mid][k]=ans;
20     if ( l<=mid-1 ) solve(l,mid-1,L,p,k);
21     if ( mid+1<=r ) solve(mid+1,r,p,R,k);
22 }
23 signed main()
24 {
25     scanf("%d%d",&n,&k);
26     for ( int i=1;i<=n;i++ ) scanf("%d",&a[i]);
27     for ( int i=0;i<=n;i++ ) for ( int j=0;j<=k;j++ ) f[i][j]=inf;
28     f[0][0]=0;
29     for ( int j=1;j<=k;j++ )
30     {
31         res=0;pl=1;pr=n;
32         for ( int i=1;i<=n;i++ ) cnt[i]=0;
33         for ( int i=1;i<=n;i++ ) Ins(a[i],1);
34         solve(1,n,0,n-1,j);
35     }
36     return !printf("%lld\n",f[n][k]);
37 }

DTOJ4718

原文地址:https://www.cnblogs.com/RenSheYu/p/12272749.html

时间: 2024-11-05 20:27:25

2020 省选模拟测试 Round #8 solution (20/02/07)的相关文章

[考试反思]1002csp-s模拟测试56:凌乱

放假回来状态回升??(玩够了-但是稍困) T1打的不完全对,但是过掉了.很快的想到了二分吧喇叭啦.. 然后T2也挺快想出来了但是挂细节没发现,考试快结束的时候才发现出锅了. 改了过来是正解,但是出题人无良卡了线段树强制树状数组,T了一个子任务,卡常到飞起. T3暴力没什么问题. 卡常是一种习惯.要注意题目数据范围观察是否卡常. T1: 所有的决策都是一条一次函数. 分两类,斜率正或斜率非负. 如果第二类的直线里有在T=0时符合要求的,那么答案就是0,所以check(0)一下. 如果非负的直线都在

csp-s模拟测试60

csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴一个不一样的毒瘤做法. 1 //ans=(ans+m)%i 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define re re

[考试反思]0114省选模拟7:迷离

这次考得相对不错,但是没什么水准. 只不过记得T1这道原题而已.虽说我忘了怎么做,而且数据范围不一样...差不多是从头想的. 但是并没有AC,像个弱智一样,有两个细节写的完全不对还有80分运气也是真好. 其实挂了不止两个细节...以为是原题于是上来就写20分钟写完,然后过一会出一个锅... 然后看T2,感觉$O(nk^2)$也许差不多?常数很大...但也不会别的.挺好想但是不是很好写. 于是乎强烈谴责cbx没素质暴力水题考后还不改正解的无脸行径 于是就开始写,写了一个半小时. 看T3,绝对大神题

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

css Hack,用IE11模拟测试的,条件注释要找真IE去测,模拟的无效

<!DOCTYPE html> <!--[if lt IE 7 ]> <html class="ie6 ie"> <![endif]--> <!--[if IE 7 ]> <html class="ie7 ie"> <![endif]--> <!--[if IE 8 ]> <html class="ie8 ie"> <![endif]

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

Mock 模拟测试简介及 Mockito 使用入门

Mock 是什么 mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 简单的看一张图 我们在测试类 A 时,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如 D.E.F 等,假如类 D.E.F 构造很耗时又或者调用很耗时的话是非常不便于测试的(比如是 DAO 类,每次访问数据库都很耗时).所以我们引入 Mock 对象. 如上图,我们将