HGOI20190706 题解
Problem A 质因数
设f(x) 表示x的不同质因子个数,给出T组x,询问f(x)的值。
对于100%的数据 $x,T \leq 10^5 $
Sol : 第一遍欧拉筛,并记录下每个数的最小质因数。
然后对于每个询问直接O(1) 映射它的最小质因数,然后不断除掉。
最差情况是2的幂次,复杂度应该是$O(n log_2 n)$
# include <bits/stdc++.h>
using namespace std;
const int N=1e6+;
bool is_pr[N];
int pr[N],dr[N];
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(x%+'');
}
void EouLaSha(int Lim)
{
memset(is_pr,true,sizeof(is_pr));
is_pr[]=false;
for (int i=;i<=Lim;i++) {
if (is_pr[i]) pr[++pr[]]=i,dr[i]=i;
for (int j=;j<=pr[]&&i*pr[j]<=Lim;j++) {
is_pr[i*pr[j]]=false;
dr[i*pr[j]]=pr[j];
if (i%pr[j]==) break;
}
}
}
int fun(int x)
{
int cnt=;
while (x!=) {
++cnt; int t=dr[x]; while (x%t==) x/=t;
}
return cnt;
}
int main()
{
EouLaSha(1e6);
int T=read();
while (T--) {
int x=read();
write(fun(x)); putchar('\n');
}
return ;
}
easy.cpp
Problem B 编码
定义P(A)表示对于一个数字串编码值,显然A可以由$b_i$ 个 $c_i$字符不断拼接组成 。
则P(A) 为$b_i和$c_i$顺次相连所组成的字符串。如P("111222333") = "132333" 表示"1"出现3次,"2"出现3次,"3"出现3次
其中$b_i$不允许有前导零,在上述限制下令最后的长度尽可能短。
现在给出P(A)的值,询问A有多少种不同的解。
对于100%的数据 $ length(A)\leq 10^5$
Sol : 这道题是一个Dp题。
设$f_i$ 表示到第$i$位置为止$[1,i]$所构成子串中,可能的解的个数,最后$f_n$就是解。
考虑$f_i$从$f_j$转移过来,即$[j+1,i]$可以构成一组$b_i , c_i$。
考虑这个转移的限制:
- [j+1,i]长度应该大于等于2,即$j\leq i-2$
- 不能有前导0,如果当前转移必然会造成前导零的,那么此次转移不合法,即$s_{i+1} \neq "0" $
- 令最后编码长度尽可能短,需要$c_i \neq c_{i+1}$ 即$s_j \neq s_i $
所以我们就可以写出一个转移方程 $f_i = \left\{\begin{matrix} \sum\limits_{j=0} ^ {i-2} (s_i \neq s_j) \times f_j & s_{i+1}\neq "0"\\ 0 & s_{i+1}= "0" \end{matrix}\right.$
上述转移可以使用前缀和优化,令$sum_{i,j} = \sum\limits_{k=0} ^ {i} (s_k = j)\times f_k ,g_i = \sum\limits_{j=0}^{i} f_j$
上述转移可以写成: $f_i = \left\{\begin{matrix} g_{i-2} - sum_{i-2,s_i} \ & s_{i+1}\neq "0"\\ 0 & s_{i+1}= "0" \end{matrix} \right. $
同时注意$sum_{i,j} 和 g_{i}$ 的同步更新即可。
复杂度就是$O (9 \times n) $
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e6+;
const int mo=;
int f[N];
int n,sum[N][],g[N];
char s[N];
signed main()
{
scanf("%s",s+); int n=strlen(s+);
if (!(s[]^)){ puts(""); return ;}
memset(f,,sizeof(f));
f[]=; g[]=; f[]=; g[]=;
for (int i=;i<=n;i++) {
for (int j=;j<=;j++) sum[i][j]=sum[i-][j];
if (s[i+]=='') {
f[i]=;
g[i]=g[i-]+f[i];
sum[i][s[i]-'']=(sum[i][s[i]-'']+f[i])%mo;
continue;
}
f[i]+=g[i-]; f[i]-=sum[i-][s[i]-'']; f[i]=(f[i]%mo+mo)%mo;
g[i]=(g[i-]+f[i])%mo;
sum[i][s[i]-'']=(sum[i][s[i]-'']+f[i])%mo;
}
printf("%lld\n",f[n]);
return ;
}
hard.cpp
Problem C 八卦阵
给出一幅有向图,对于每个点有8种状态$f_{u,0} ... f_{u,7} $i$秒钟u的状态为$b_{u,(i-1)\ mod \ 8} \ in [1,8]$
对于两个点的状态$i,j$都存在一个复杂度$c_{i,j}$
第i秒钟通过边E=(u,v,w)的代价是$w + c_{b_{u,(i-1) \ mod \ 8},b_{v,(i-1)\ mod \ 8}} $
问从1号点走到底n号点的最小代价是多少。
对于100%的数据 $n \leq 10^5 ,m \leq 3\times 10^5 c_{i,j},w\leq 10^4$
Sol : 考虑Dijkstra求最短路在松弛更新的时候把代价改成上面的的权值。
对于每个节点,记录下访问他的时间,然后考虑(u,v,w)这条边的松弛
考虑时间是按照$8$一个循环,还是比较小的,可以使用$dist_{i,j}$表示当前时间是$i$ 从1访问到$j$号点的最小代价。
使用$d_{time - 1,u}$ 来更新$d_{time,v}$ ,注意到下标需要对8取模。
复杂度就是$O(n log_2 n)$
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e5+,M=3e5+;
struct Edge{
int pre,to,w;
}a[M];
int n,m;
int c[][],b[N][];
int head[N],tot,d[][N];
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(x%+'');
}
void adde(int u,int v,int w)
{
a[++tot].pre=head[u];
a[tot].to=v;
a[tot].w=w;
head[u]=tot;
}
struct rec{
int len,id,time;
};
struct cmp {
bool operator () (rec a,rec b) {
return a.len>b.len;
}
};
priority_queue<rec,vector<rec>,cmp>q;
int dijkstra(int s,int t)
{
memset(d,0x3f,sizeof(d)); d[][s]=;
q.push((rec){,s,});
while (!q.empty()) {
rec u=q.top();q.pop();
for (int i=head[u.id];i;i=a[i].pre) {
int tim=(u.time+)%,v=a[i].to;
int cost=a[i].w+c[b[u.id][((tim-)%+)%]][b[v][((tim-)%+)%]];
if (d[tim][v]-cost>d[((tim-)%+)%][u.id]) {
d[tim][v]=d[((tim-)%+)%][u.id]+cost;
q.push((rec){d[tim][v],v,tim});
}
}
}
int ans=0x3f3f3f3f;
for (int i=;i<=;i++)
ans=min(ans,d[i][t]);
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for (int i=;i<=;i++)
for (int j=;j<=;j++)
c[i][j]=read();
for (int i=;i<=n;i++)
for (int j=;j<=;j++)
b[i][j]=read();
for (int i=;i<=m;i++) {
int u=read(),v=read(),w=read();
adde(u,v,w);
}
int ans=dijkstra(,n);
write(ans); putchar('\n');
return ;
}
hammer.cpp
HGOI20190706 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- axios模块封装和分类列表实现
这个作用 主要还是为了让代码更加的,清晰. 不要全部都放到 created(){} 这个方法下面.把这些代码全部抽离出去. 这里就只是去调用方法.1. src 目录下,新建文件夹--- rest ...
- codeforces 620C
题目链接:https://codeforces.com/problemset/problem/620/C 题目分析 题意:给你一串珍珠,每个珍珠都有一个对应值,需要分割这n个珍珠(必须连续),使得每一 ...
- Springboot实现上传文件接口,使用python的requests进行组装报文上传文件的方法
记录瞬间 近段时间使用Springboot实现了文件的上传服务,但是在使用python的requests进行post上传时,总是报错. 比如: 1.Current request is not a m ...
- Oracle sqlplus prelim 参数介绍
SQL>conn / as sysdba ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法 解决 ORA-00020 错 ...
- js里生成guid
function guid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { | , ...
- oa_mvc_easyui_后台布局(3)
1.新建HomeController控制器,并创建视图,后台的主页 2.easyUI的引用: <link href="~/Content/default/easyui.css" ...
- 误删除/dec/zero,/dev/null
误删除/dev/zero [root@MYSQL-MONGO145 dev]# mknod /dev/zero c 1 5[root@MYSQL-MONGO145 dev]# chmod 666 /d ...
- jQuery 遍历 - 祖先
通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() pare ...
- 关于Linux防火墙的问题以及关闭,试一下这四条命令
关闭防火墙,依次执行以下四条命令 临时服务 service firewalld stop 永久关闭 chkconfig iptables off 列出所有规则 iptables -L 清除所有规则,可 ...
- mysql prompt的用法详解
prompt命令可以在mysql提示符中显示当前用户.数据库.时间等信息 代码如下: mysql -uroot -p --prompt="\\u@\\h:\\d \\r:\\m:\\s> ...