6.26模拟赛(1)总结(T1:信息传递;T2:传染病控制;T3:排列;T4:最大数)
16:33:56
2020-06-26
当然可以先看一下成绩:


非常显然的成绩不能算有多好,当然其实这也可能是假期水课的报应 (额)
但是比我集训前想象的要好一点(集训时想象的是排名前30就可以,嗯?)
好了,毕竟是第一天,后面日子还长,相信结果不会烂的。
好了,现在看一下第一题:
第一题
原题来自洛谷P2661 :题目链接:https://www.luogu.com.cn/problem/P2661
比较显然的暴力思路(就是我写的)但是复杂度是O(n2)的,显然只有60分。
然后想正解,比较显然想到求一个最小环。但是如何求?
仔细观察这道题可以发现 每人只会把信息告诉一个人,也就是说只有一条出边
然后可以显然的发现图里只有简单环,那么我们可以想到求Tarjan强连通分量。
就是个裸板子,下面是代码:(注意只是这道题比较特殊,才能用Tarjan水过)
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=200005;
int a[maxn];
int Min=9999999;
int dfn[maxn],low[maxn],dfs_clock,sta[maxn],top,belong[maxn],siz[maxn],dcc;
void tarjan(int u){
dfn[u]=low[u]=++dfs_clock;
sta[++top]=u;
int v=a[u];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!belong[v])low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u]){
dcc++;
while(1){
int x=sta[top--];
belong[x]=dcc;
siz[dcc]++;
if(x==u)break;
}
if(siz[dcc]!=1) Min=min(siz[dcc],Min);
}
}
int main(){
//freopen("a.in","r",stdin);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
printf("%d",Min);
return 0;
}
但是就这样水过肯定是不行的,那么还有没有其他解法呢?
显然是有的。那就是带权并查集。
哎,假期没有认真听带权并查集,导致没有写出来,不过经过四分之一个时辰的努力。终于看懂了它。
然后我会在代码里加一些注释
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int fa[200005],d[200005];
int Min=0x3f3f3f3f;
int get(int x){
if(x==fa[x])return x;
else{
int last=fa[x];
fa[x]=get(fa[x]);
d[x]+=d[last];
return fa[x];
}
}
void merge(int x,int y){
int xx=get(x),yy=get(y);
if(xx!=yy){
fa[xx]=yy;
d[x]=d[y]+1;
}
else {
Min=min(Min,d[x]+d[y]+1);// d[x]+d[y]+1这个我会在后面加一张图解释。
}
}
int main(){
//freopen("a.in","r",stdin);
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)fa[i]=i;//初始化
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
merge(i,x);
}
printf("%d",Min);
return 0;
}

我觉得比较好理解(可能图比较烂)
第二题

这道题当时我是看错题意了,所以想成了树形DP,但成功水了三十分。
其实这道题没有正解,一般人都能想到贪心,但是贪心总是不能AC(80pts)
其实吧,不要想南么复杂,其实数据范围才300 ,直接爆搜(加一小小优化)就能过,
但是代码比较不大好写(本人目前还没有成功写出)
所以代码暂时不给了,先说一下思路:
首先dfs 一遍 求出 deep深度,size 子树大小,和father父亲。
然后依次每一深度枚举切断的边就行了。
代码到时会给的。。。。。。
OK 代码终于来了:
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=605;
int n,m;
int Min=9999999;
int mdeep;
int dis[maxn][maxn],cnt1[maxn];
struct edge{
int to,next;
}e[maxn];int head[maxn],cnt=0;
void add(int x,int y){
e[++cnt].to=y;e[cnt].next=head[x];head[x]=cnt;
}
int size[maxn],fa[maxn],deep[maxn];
void dfs(int u,int f){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==f)continue;
deep[v]=deep[u]+1;
fa[v]=u;
mdeep=max(mdeep,deep[v]);
dfs(v,u);
}
}
int cut[maxn];
void biaoji(int u,int ji){
cut[u]=ji;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v==fa[u])continue;
biaoji(v,ji);
}
}
int dfs3(int dep){
int sum=0;
for(int i=1;i<=cnt1[dep];i++){
if(cut[dis[dep][i]]==0)sum++;
}
return sum;
}
void dfs2(int dep,int sum){
if(sum>=Min)return;
if(dep>mdeep||dfs3(dep)==0){
//printf("%d ",sum);
Min=min(Min,sum);return;
}
for(int i=1;i<=cnt1[dep];i++){
int to=dis[dep][i];
if(cut[to]==1)continue;
biaoji(to,1);
//printf("%d ",dfs3(dep));
dfs2(dep+1,sum+dfs3(dep));
biaoji(to,0);
}
}
int main(){
//freopen("a.in","r",stdin);
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++){
dis[deep[i]][++cnt1[deep[i]]]=i;
}
dfs2(1,1);
printf("%d",Min);
return 0;
}
第三题
题目来源:洛谷P4163 [SCOI2007] 链接:https://www.luogu.com.cn/problem/P4163

这道题其实我当时就没思路。
这道题解法很多:
有状压DP,有直接爆搜,当然我今天不想说这两种方法
我想说C++STL解法(简单)
首先介绍一个STL容器:
next_permutation
它可以从递增数列(一定要是递增的,不然不是全排列)求出全排列组合(就是求出的排列是从小到大)。
非常好用,但是有一个问题就是一定要会拼写(我就是没拼出来)
来一起拼三遍: next_permutation,next_permutation,next_permutation
下面就非常简单,模拟就完了。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
//freopen("a.in","r",stdin);
int t;scanf("%d",&t);
while(t--){
char s[15];int a[15];
int d;
scanf("%s%d",s,&d);
int len=strlen(s);
for(int i=0;i<len;i++){
a[i+1]=s[i]-'0';
}
sort(a+1,a+len+1);
int cnt=0;
while(1){
long long ans=0;
for(int i=1;i<=len;i++){
ans=ans*10+a[i];
}
if(ans%d==0)cnt++;
if(next_permutation(a+1,a+len+1)==0)break;
}
printf("%d\n",cnt);
}
return 0;
}
应该非常显然。
第四题

第四题是我唯一AC的一道题,就是线段树。
当然树状数组和单调队列也能解决。
然后直接上代码了
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=200005;
ll tree[maxn<<2],a[maxn];
ll n,d;
ll t=0;
ll cnt=0;
void modify(int rt,int l,int r,ll x,ll y){
if(l==r){
tree[rt]=max(tree[rt],y);return;
}
int mid=(l+r)/2;
if(x<=mid)modify(rt<<1,l,mid,x,y);
else modify(rt<<1|1,mid+1,r,x,y);
tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
ll query(int rt,int l,int r,ll s,ll t){
if(s<=l&&r<=t){
return tree[rt];
}
int mid=(l+r)/2;
if(t<=mid)return query(rt<<1,l,mid,s,t);
else if(s>mid)return query(rt<<1|1,mid+1,r,s,t);
else return max(query(rt<<1,l,mid,s,t),query(rt<<1|1,mid+1,r,s,t));
}
int main(){
//freopen("a.in","r",stdin);
scanf("%lld%lld\n",&n,&d);
for(int i=1;i<=n;i++){
char c;scanf(" %c ",&c);
if(c=='A'){
ll x;scanf("%lld",&x);
x=(x%d+t%d)%d;
modify(1,1,n,++cnt,x);
}
else {
ll l;scanf("%lld",&l);
if(cnt==0){
printf("0\n");continue;
}
t=query(1,1,n,cnt-l+1,cnt);
printf("%lld\n",t);
}
}
return 0;
}
OK,集训的第一次正式考试就结束了。
以此为戒,面向未来
6.26模拟赛(1)总结(T1:信息传递;T2:传染病控制;T3:排列;T4:最大数)的更多相关文章
- 7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树
LINK:qiqi20021026的T1 考场上只拿到了50分的\(nq\)暴力. 考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高. 先考虑LCS的问题 常见解决方法是后缀数组/tri ...
- WC2019 全国模拟赛第一场 T1 题解
由于只会T1,没法写游记,只好来写题解了... 题目链接 题目大意 给你一个数列,每次可以任取两个不相交的区间,取一次的贡献是这两个区间里所有数的最小值,求所有取法的贡献和,对 \(10^9+7\) ...
- 【洛谷mNOIP模拟赛Day1】T1 斐波那契
题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...
- NOI.AC省选模拟赛第一场 T1 (树上高斯消元)
link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...
- 【csp模拟赛1】T1 心有灵犀
[题目描述] 爱玩游戏的小 Z 最近又换了一个新的游戏.这个游戏有点特别,需要两位玩 家心有灵犀通力合作才能拿到高分. 游戏开始时,两位玩家会得到同一个数字 N,假设这个数字共有 t 位数码, 然后两 ...
- NOIP模拟赛(by hzwer) T1 小奇挖矿
[题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...
- 模拟赛DAY 2 T1江城唱晚
[题目背景] 墙角那株海棠,是你种下的思念. 生死不能忘,高烛照容颜. 一曲江城唱晚,重忆当年坐灯前, 青衫中绣着你留下的线. ——银临<江城唱晚> [问题描述] 扶苏是个喜欢一边听古风歌 ...
- 2.17NOIP模拟赛(by hzwer) T1 小奇挖矿
[题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
随机推荐
- java实现第六届蓝桥杯打印大X
打印大X 打印大X 小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度. 为了便于比对空格,所有的空白位置都以句点符来代替. 要求输入两个整数m n,表示笔的宽度,X的高度.用 ...
- HttpClientFactory-向外请求的最佳
简介 它的组件包是Microsoft.Extensions.Http 复原HttpClient带来的问题 HttpClient相关问题 虽然HttpClient类实现了IDisposable,但不是首 ...
- pip常出问题的操作
pip 是一个 Python 包安装与管理工具. 以pip安装yaml为主: 1.更新pip 打开cmd命令,安装yaml包,输入pip install pyyaml,提示pip已过期 更新pip版本 ...
- springmvc使用<mvc:default-servlet-handler/>导致的handler失效
使用springmvc时,会在web.xml中配置对所有请求进行拦截 <!-- 配置springmvc拦截的请求--> <servlet-mapping> <servle ...
- 自动网络搜索(NAS)在语义分割上的应用(一)
[摘要]本文简单介绍了NAS的发展现况和在语义分割中的应用,并且详细解读了两篇流行的work:DARTS和Auto-DeepLab. 自动网络搜索 多数神经网络结构都是基于一些成熟的backbone, ...
- Flask 的配置文件
Flask 的配置文件 四种方法给 Flask 做配置 1直接给 app 对象赋值属性 以字典的形式,给flask做配置 以文件的形式,给flask做配置(django 就是用这种) 以类的形式,给f ...
- 解决:Error:java: 无效的源发行版: 12
一. spring cloud项目启动.遇到问题: 二. 解决,共两个地方. 第一个位置: Shift/Ctrl/Alt/S 快捷键一起按 Modules选择你的项目(以及父级项目,如果有的话)-&g ...
- 解读Spring源码之前的准备
请忽略以下的文章,现在回过头来才发现学习源码不用如此复杂 1.IDEA 新建一个maven项目, 2.pom 中倒入 spring5 的基本包,然后利用maven 插件down下源码 3.然后就可以开 ...
- Java 技术网站总结(不停更新)
Spring Spring 中文手册 Spring 教程 Spring For All Spring 学习笔记 Spring Boot Break易站 Spring Cloud 中文文档 Spring ...
- Github上可以涨薪30k的Java教程和实战项目终于可以免费下载了
写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架.软件或者教程.这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整 ...
