Shallwe学长的模拟赛
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$的情况,只要确定了一个点就可以确定其他所有联通的点,求出每个联通块的答案个数,乘法原理统计答案即可.
$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学长的模拟赛的更多相关文章
- [GRYZ]寒假模拟赛
写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...
- 【20170521校内模拟赛】热爱生活的小Z
学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...
- 『2019/4/8 TGDay1模拟赛 反思与总结』
2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...
- NOIP模拟赛-2018.10.22
模拟赛 今天第一节课是历史,当然是不可能上的,一来到机房发现今天高二考试... 老师说以后可能还要给高一考...那还不如现在跟着做好了,毕竟在学长学姐中垫底显得没那么丢人 这套题风格挺奇怪的...为什 ...
- NOIP模拟赛 篮球比赛2
篮球比赛2(basketball2.*) 由于Czhou举行了众多noip模拟赛,也导致放学后篮球比赛次数急剧增加.神牛们身体素质突飞猛进,并且球技不断精进.这引起了体育老师彩哥的注意,为了给校篮球队 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
随机推荐
- [android] 切换按钮-自定义控件-拖动效果
重写View的onTouchEvent()方法,传递进来MotionEvent对象 调用MotionEvent对象的getAction()方法,获取当前动作 switch判断一下当前动作 事件为Mot ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- MYSQL查询优化(Ⅰ)
一. 通过查询缓冲提高查询速度 一般我们使用SQL语句进行查询时,数据库服务器每次在收到客户端 发来SQL后,都会执行这条SQL语句.但当在一定间隔内(如1分钟内),接到完全一样的SQL语句,也同样执 ...
- Java设计模式之【单例模式】
Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...
- Oracle 临时表创建及删除
Oracle临时表 临时表分为两种 会话级别(ON COMMIT PRESERVE ROWS;) CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <co ...
- POJ2387(KB4-A)
Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 54716 Accepted ...
- Oracle查询时15分钟划分
select to_date(to_char(sysdate, 'yyyy-MM-dd hh24') || ':' || floor(to_number(to_char(s ...
- Finereport和Finebi的区别
1.问题描述 大家现在可能都知道,目前帆软旗下特色产品主要是FineReport和FineBI,但是部分用户可能会有个疑问:FineReport和FineBI到底有什么区别? 2.产品介绍FineRe ...
- T-SQL的timestamp类型实际应用
目录 0x00 适用场景 0x01 问题描述 0x02 字节数组 0x03 Base64编码 0x04 其实没那么麻烦 0x05 回顾 0x00 适用场景 1. 前端: JavaScript 2. 后 ...
- 在Docker Swarm上部署Apache Storm:第2部分
[编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...