NOIP Simulated Test

  这个名字一听就很高端.

  T1:sGCD:http://uoj.ac/problem/48

  题意概述:给定一个长度为$n$的序列,求$sgcd(a_1,a_i)$,定义$sgcd(a,b)$为$a,b$的次大公约数.$n<=1e5$

  我的做法:因为唯一分解定理,$sgcd(a,b)$一定是$(a,b)$再除去一个质因子,那当然是除去最小的质因子最合适啦,每次求出最大公约数再求它的最小质因子,总复杂度$O(NlogN\sqrt{a_i})$,有点卡常,考试时$A$了,但是在UOJ上只得了$80$分.

  正解:充分利用$gcd(a,b)|a$的条件,首先分解$a_1$的质因子,每次求出$(a_1,a_i)$后再进行试除.一个数的质因子个数是比$\sqrt{X}$要小很多的,可以愉快的通过此题. 

  

 # include <cstdio>
# include <iostream>
# define R register int
# define ll long long using namespace std; const int maxn=;
long long a[maxn],g,ans,p[maxn],h;
int n; long long read()
{
long long x=;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) { x=(x<<)+(x<<)+(c^); c=getchar(); }
return x;
} ll gcd (ll a,ll b) { return b?gcd(b,a%b):a; } ll m (ll a)
{
for (R i=;i<=h;++i)
if(a%p[i]==) return p[i];
return a;
} void div (ll x)
{
for (R i=;(ll)i*i<=x;++i)
{
if(x%i==) p[++h]=i;
while (x%i==) x/=i;
}
if(x!=) p[++h]=x;
} int main()
{
scanf("%d",&n);
for (R i=;i<=n;++i)
a[i]=read();
div(a[]);
for (R i=;i<=n;++i)
{
g=gcd(a[],a[i]);
if(g==) ans=-;
else ans=g/m(g);
printf("%lld",ans);
if(i!=n) putchar(' ');
}
return ;
}

sGCD

  T2:School:http://uoj.ac/contest/39/problem/308

  题意概述:$n$个点的图使用$k$种颜色染色,要求每条边两边的颜色都不相同的染色方案数量模$6$。

  今天考的时候和这道题给的部分分略有差异,数据为树的数据提高到了三个点.图的染色问题是一个没有多项式时间解法的难题,所以这道题一定有什么神仙解法。

  我的做法_数据分治:

  ·对于小数据搜索.

  ·对于树的数据打表找规律发现颜色数直接模$6$不影响答案,所以写了一个树形$dp$.

  ·其他时间:$printf("\%d",rand()\%6);$

  后来学到了正解:

  答案可以表示为      

  不过这是什么意思...?首先考虑用多少种颜色进行染色,就是上式中枚举的$i$,设一个新函数$f_i$表示用$i$种颜色染色的方案数,从$n$种颜色中选出$i$种来,最后是一个阶乘,用于把...和那个组合放在一起看就是一个排列啊,因为$123$和$321$毕竟还是不同的.拆出这个阶乘来主要是为了化简.注意到:当$i>2$时,这个式子模$6$等于$0$,所以我们只需要算$i$等于$1$或者是$2$的情况.对于$i$等于一,只要有边答案就为$0$,所以很好统计,对于$i$等于$2$的情况,只要确定了一个点就可以确定其他所有联通的点,求出每个联通块的答案个数,乘法原理统计答案即可.

  

  T3:http://uoj.ac/problem/105

  $APIO$的题拿来做$NOIP$模拟赛真的好吗...

  题意比较麻烦,就不说了。其实这是一个树形$dp$的题目,关键是要想好状态的表示,我考场上想的是$dp[i][1]$记录以$i$为根的子树上边连的是红边的答案,再记录上边为蓝边的答案,结果发现非常复杂,终于过了样例之后发现一条链就可以把我的程序$Hack$掉了.这个做法为什么难做呢?主要是情况比较多,如果上边是红边还好说,如果上面是蓝边就要分为根是后来插入的点和本来就有的点两种情况分别讨论.其实问题的关键也就在这里,如果以$i$点是后来插入的点还是本就有的点作为状态就会简单许多了.其实这样做还是很麻烦...还有一种更合理的方法是记录$i$是否是由他的一个儿子和父亲断边重连得来的。

  这样的做法还要枚举根,不过也可以通过记录次大值来$O(1)$换根. 

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <cmath>
# include <algorithm>
# include <string>
# define R register int using namespace std; //dp[i][0]表示点i不是通过2操作加入的,1表示是 const int maxn=;
int n,h,x,y,co,firs[maxn],dp[maxn][],dep[maxn],ans;
struct edge
{
int too,nex,co;
}g[maxn<<]; void add (int x,int y,int co)
{
g[++h].too=y;
g[h].nex=firs[x];
firs[x]=h;
g[h].co=co;
} void dfs (int x)
{
int j,G=-;
for (R i=firs[x];i;i=g[i].nex)
{
j=g[i].too;
if(dep[j]) continue;
dep[j]=dep[x]+;
dfs(j);
G=max(G,dp[j][]+g[i].co-max(dp[j][],dp[j][]+g[i].co));
dp[x][]+=max(dp[j][],dp[j][]+g[i].co);
dp[x][]+=max(dp[j][],dp[j][]+g[i].co);
}
dp[x][]+=G;
} int read()
{
int x=;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) { x=(x<<)+(x<<)+(c^); c=getchar(); }
return x;
} int main()
{
scanf("%d",&n);
for (R i=;i<n;++i)
{
x=read(),y=read(),co=read();
add(x,y,co);
add(y,x,co);
}
for (R i=;i<=n;++i)
{
memset(dp,,sizeof(dp));
memset(dep,,sizeof(dep));
dep[i]=;
dfs(i);
ans=max(ans,dp[i][]);
}
printf("%d",ans);
return ;
}

Beads and wires(N^2)

/shzr咕咕咕了,不过还是决定贴上代码/

  

 # include <cstdio>
# include <iostream>
# include <cstring>
# include <cmath>
# include <algorithm>
# include <string>
# define inf 0x3f3f3f3f
# define R register int using namespace std; //f[i][0]表示点i不是通过2操作加入的,1表示是 const int maxn=;
int n,h,x,y,co,firs[maxn],f[maxn][],dp[maxn][],dep[maxn],ans;
struct edge
{
int too,nex,co;
}g[maxn<<]; void add (int x,int y,int co)
{
g[++h].too=y;
g[h].nex=firs[x];
firs[x]=h;
g[h].co=co;
} void dfs (int x)
{
int j,t,t1,G=-inf,mG=-inf;
for (R i=firs[x];i;i=g[i].nex)
{
j=g[i].too;
if(dep[j]) continue;
dep[j]=dep[x]+;
dfs(j);
f[x][]+=max(f[j][],f[j][]+g[i].co);
t=f[j][]+g[i].co-max(f[j][],f[j][]+g[i].co);
if(t>=G) mG=G,G=t; else mG=max(mG,t);
}
f[x][]=f[x][]+G;
for (R i=firs[x];i;i=g[i].nex)
{
j=g[i].too;
if(dep[j]<dep[x]) continue;
t=-max(f[j][],f[j][]+g[i].co);
if(t+f[j][]+g[i].co==G)
t1=mG;
else
t1=G;
dp[j][]=t;
dp[j][]=t1;
}
} int read()
{
int x=;
char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) { x=(x<<)+(x<<)+(c^); c=getchar(); }
return x;
} void Dp (int x,int r)
{
ans=max(ans,f[x][]);
int j,t1,t2;
for (R i=firs[x];i;i=g[i].nex)
{
j=g[i].too;
if(dep[j]<dep[x]) continue;
t1 =f[x][]+dp[j][];
t2=f[x][]+dp[j][]+max(r,dp[j][]);
f[j][]+=max(t1,t2+g[i].co);
Dp(j,t1+g[i].co-max(t1,t2+g[i].co));
}
} int main()
{
scanf("%d",&n);
for (R i=;i<n;++i)
{
x=read(),y=read(),co=read();
add(x,y,co);
add(y,x,co);
}
dep[]=;
dfs();
Dp(,-inf);
printf("%d",ans);
return ;
}

Beads and wires O(N)

Shallwe学长的模拟赛的更多相关文章

  1. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

  2. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  3. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  4. NOIP模拟赛-2018.10.22

    模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...

  5. NOIP模拟赛 篮球比赛2

    篮球比赛2(basketball2.*) 由于Czhou举行了众多noip模拟赛,也导致放学后篮球比赛次数急剧增加.神牛们身体素质突飞猛进,并且球技不断精进.这引起了体育老师彩哥的注意,为了给校篮球队 ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  8. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  9. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

随机推荐

  1. C# Hadoop学习笔记(二)—架构原理

    一,架构   二.名词解释 (一)NameNode(简称NN),Hadoop的主节点,负责侦听节点是否活跃,对外开放接口等.在未来的大数据处理过程中,由于访问量和节点数量的不断增多,需要该节点的处理能 ...

  2. [日常] Go语言圣经--Map习题

    练习 4.8: 修改charcount程序,使用unicode.IsLetter等相关的函数,统计字母.数字等Unicode中不同的字符类别. 练习 4.9: 编写一个程序wordfreq程序,报告输 ...

  3. 几点建议,让Redis在你的系统中发挥更大作用

    Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不 ...

  4. 大数据之 Hadoop学习笔记

    1 hadoop生态系统 hdfs 分布式文件系统 hadoop-hdfs-2.7.2.jar mapreduce 分布式计算框架 hadoop-mapreduce-client-app-2.7.2. ...

  5. 安装mysql出现no compatible servers were found

    一.问题描述 今天在安装数据库的过程中,遇到错误提示: No compatible servers were found,You'll need to cancel this wizard and i ...

  6. CentOS 7 镜像下载

    新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64 ...

  7. flex做的圣杯布局

    now,给大家分享一个用flex写的圣杯布局,大家可以参考一下子 首先圣杯布局是两列固定宽度,中间自适应. 我直接说一下步骤,上图,上图 1.步骤1 2.步骤2 上面就是基本的步骤,下面我把代码给大家 ...

  8. 【代码笔记】iOS-NSLog的使用

    代码: // 在debug模式下输出NSLog,在release模式下不输出NSLog #ifndef __OPTIMIZE__ #define NSLog(...) NSLog(__VA_ARGS_ ...

  9. 网络基础 利用vnc viewer访问在vmware虚拟机上的linux

    利用vnc viewer访问在vmware虚拟机上的linux by:授客 QQ:1033553122 Linux服务器为架设在VMware之上的虚拟机,那么可以直接使用VMware自带的vnc,而不 ...

  10. 测试sql server服务是否配置正确

    最简单的方法: 新建一个testdb.udl文件,双击可出现测试界面