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. Jquery停止动画

    stop方法 第一个参数:是否清除动画队列 true | false 第二个参数:是否跳转到动画最终效果   true | false 使用stop()方法的技巧 当下拉菜单和手风琴产生动画队列的问题 ...

  2. C#微信小程序服务端获取用户解密信息

    using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.C ...

  3. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  4. 微信小程序 折叠效果

    <view class='help'> <view class='help_item'> <view class='title' data-index='1' catch ...

  5. H5音乐播放器【歌单列表】

    上篇详细描述了播放页歌词如何实现跟随跟单滚动,如何解析歌词,那么歌单页又是如何生成的呢,话不多说,直接上图上代码! 首先需要获取数据,具体获取数据api请转到我跟我大兄弟博客去观看学习去,同时也感谢我 ...

  6. onkeydown小练习

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. jQuery同步Ajax带来的UI线程阻塞问题

    一.需求 在调ajax接口的时候因为有时间延迟,想要做一个loading加载的效果,等数据返回时再把loading的效果去掉. 所以我在调ajax的代码块前面加了显示loading效果的代码,ajax ...

  8. 为什么你用不好Numpy的random函数?

    为什么你用不好Numpy的random函数? 在python数据分析的学习和应用过程中,经常需要用到numpy的随机函数,由于随机函数random的功能比较多,经常会混淆或记不住,下面我们一起来汇总学 ...

  9. SD从零开始47-50, 装运成本基础、控制、结算, 信用/风险管理概述

    [原创] SD从零开始47 装运成本基础 详细的装运成本处理Shipment Cost Processing in Detail 装运成本计算和装运成本结算可用于内向和外向交货: 装运成本记录在一张新 ...

  10. art-template模板应用

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...