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& ...
随机推荐
- Spring基础(1) : 自动装配
1.自动装配 1.1 byType 1.1.1根据类型自动匹配,若当前没有类型可以注入或者存在多个类型可以注入,则失败.必须要有对于的setter方法 public class Person{ pub ...
- oracle逐步学习总结之oracle数字函数和日期函数(基础四)
原创作品,转自请注明出处:https://www.cnblogs.com/sunshine5683/p/10140716.html 继上篇总结,继续进行总结: 以下下数字函数: 1.abs(n):返回 ...
- Vue计算属性的用法
计算属性是个很好玩的东西,在这里面可以对数据模型进行操作,·也可以使用getter,setter方法.使用的话也是非常的简洁明了 这里写个例子 <!DOCTYPE html> <ht ...
- git命令(持续更新)
将远程仓库中的代码下载到本地仓库:git clone git仓库地址 将本地仓库中修改的文件提交到远程仓库:git push -u origin master 将当前目录添加到本地仓库,.表示当前目录 ...
- Codeforces675D(SummerTrainingDay06-J)
D. Tree Construction time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...
- JavaScript--事件对象(25)
// JavaScript事件的一个重要的方面是它们拥有一些相对一致的特点,可以给开发提供强大的功能; // 最方便和强大的就是事件对象,它们可以帮你处理鼠标事件和键盘敲击方面的情况; // 此外还可 ...
- Django Rest framework 之 视图
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- 微信小程序-上传照片-多张显示
图片就是一个简单的效果 实现 先看wxml和wxss代码 <view class='in-demand'> <view class='dema-title'> <text ...
- HTTPS的安全性
一.Https介绍 1. 什么是Https HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道, ...
- Cobalt Strike 学习
前言 本文以一个模拟的域环境为例对 Cobalt Strike 的使用实践一波. 环境拓扑图如下: 攻击者(kali) 位于 192.168.245.0/24 网段,域环境位于 192.168.31. ...