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 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Mysql binlog应用场景与原理深度剖析

    1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他M ...

  2. 啃掉Hadoop系列笔记(01)-Hadoop框架的大数据生态

    一.Hadoop是什么 1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构 2)主要解决,海量数据的存储和海量数据的分析计算问题. 3)广义上来说,HADOOP通常是指一个更广泛的概 ...

  3. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  4. JDK安装及JAVA环境变量配置(JDK1.8版本)

    一:JDK官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html JD ...

  5. 小白学习django第六站-http相关

    请求与相应 HttpRequest对象API def home(request): print('path:', request.path) print('mothod:', request.meth ...

  6. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

  7. Java Web开发技术教程入门-自定义标签

    回顾: 昨天了解了JSP开发的两种模式Model1和Model2模式.Model1采用JSP+JavaBean技术开发Web应用,它比较适合小规模应用的开发,效率较高,易于实现.但由于在Model1中 ...

  8. Java Web开发技术教程入门-JavaBean组件与Servlet

    补更:阅战阅勇第7/8/9Days笔记 昨天我们了解了JDBC技术的一些日常操作,对于数据库而言,不仅仅的只有"增,删,改,查".博主觉得最重要的是SQL语句的优化,一个" ...

  9. 编译LAMP部署动态网站环境

    LAMP动态网站部署架构是由一套 Linux+Apache+MySQL+PHP 组成的动态网站系统解决方案. 以下配置环境为:Linux=RHEL7 --> Apache=2.4.33 --&g ...

  10. 进程之multiprocessing模块代码篇

    这里再把之前的内容总结和补充一下: 并发和并行: 你在干坏事,来了一个电话,干完坏事再去接电话,说明你既不是并发也不是并行. 你在干坏事,来了一个电话,你接完电话接着干坏事,说明你支持并发 你在干坏事 ...