A. H国的身份证号码I

dfs裸题。

时间复杂度\(O(n^k)\)。

#include <bits/stdc++.h>
#define FOR(i,a,b) for (int i=a; i<=b; ++i)
int ans[15], n, k; void dfs(int pos, int pre){
if (pos>n) {
FOR(i,1,n) printf("%d",ans[i]);
putchar('\n');
return ;
}
FOR(i,0,k) {
if (i*pre>k) break;
ans[pos]=i; dfs(pos+1,i);
}
}
int main()
{
scanf("%d%d",&n,&k);
FOR(i,1,k) ans[1]=i, dfs(2,i);
return 0;
}

B.合并子目录

以 \(/\)为分隔符,对所有的文件夹进行hash后存入map,给每个文件夹的hash值分配一个id。

以这些id和文件夹的从属关系建树,那么只要\(size[i]=1\)就表示这个文件夹i可以和它的子文件夹合并。

时间复杂度\(O(nlogn)\)。

#include <bits/stdc++.h>
#define FOR(i,a,b) for (int i=a; i<=b; ++i)
#define pb push_back
map<int,int>mp;
map<int,bool>mark;
int id;
string s[N];
vector<int> v[500000], g[500000]; int main ()
{
int n, len, hah, p, t;
cin>>n;
FOR(i,1,n) {
cin>>s[i];
len=s[i].length(); hah=0;
for (int j=1; j<len; ++j) {
hah=131*hah+s[i][j];
if (s[i][j]=='/') {
if (mp.find(hah)==mp.end()) {
mp[hah]=++id;
if ((t=v[i].size())) g[mp[v[i][t-1]]].pb(id);
}
v[i].pb(hah);
}
}
if ((t=v[i].size())) mark[v[i][t-1]]=true;
}
FOR(i,1,n) {
len=s[i].length(); p=0;
for (int j=1; j<len; ++j) {
if (s[i][j]=='/') {
if (p+1>=v[i].size()) break;
if (g[mp[v[i][p]]].size()==1 && mark.find(v[i][p])==mark.end()) s[i][j]='-';
++p;
}
}
}
FOR(i,1,n) cout<<s[i]<<endl;
return 0;
}

C.H国的身份证号码II

令\(dp[i][j]\)表示前i位且第i位的数字是j的方法数。

显然有

1.\(i>1\Rightarrow dp[i][j](j\leq K)=\sum (dp[i-1][k] \mid j\times k\leq K,k\leq K)\)。

2.\(i=1\Rightarrow dp[i][j](1\leq j\leq K)=1\)。

注意到这个dp方程可以用矩阵快速幂加速。

时间复杂度\(O(10^3logn)\)。

#include <bits/stdc++.h>
#define FOR(i,a,b) for (int i=a; i<=b; ++i)
typedef long long LL; struct Matrix{LL matrix[N][N];}a, sa, unit, kk;
LL n;
int k; Matrix Mul(Matrix a, Matrix b) //矩阵乘法(%MOD)
{
Matrix c;
FOR(i,0,9) FOR(j,0,9) {
c.matrix[i][j]=0;
FOR(l,0,9) c.matrix[i][j]+=(a.matrix[i][l]*b.matrix[l][j])%MOD;
c.matrix[i][j]%=MOD;
}
return c;
}
Matrix Cal(LL exp) //矩阵快速幂
{
Matrix p=a, q=unit;
if (exp==0) return q;
while (exp!=1) {
if (exp&1) exp--, q=Mul(p,q);
else exp>>=1, p=Mul(p,p);
}
return Mul(p,q);
}
void init(){
FOR(i,0,9) unit.matrix[i][i]=1;
FOR(i,1,min(k,9)) kk.matrix[0][i]=1;
FOR(j,0,min(k,9)) FOR(i,0,min(k,9)) if (i*j<=k) a.matrix[i][j]=1;
}
int main ()
{
LL ans=0;
scanf("%lld%d",&n,&k);
init();
sa=Cal(n-1); sa=Mul(kk,sa);
FOR(i,0,9) ans=(ans+sa.matrix[0][i])%MOD;
printf("%lld\n",ans);
return 0;
}

D.观光旅行

图的最小生成树有一个性质,图的最小生成树上任意两点\((u,v)\)路径里的边的最大值是原图里\((u,v)\)路径里边的最大值最小的边。

由于题意中边权各不相同,所以最小生成树必定唯一。

因此对于那些不在最小生成树上的边,答案就是\((0,0)\)。

现在的问题是,对于出现在最小生成树的每一条边\((u,v)\),找出一条路径\((a,b)\),使得边\((u,v)\)出现在路径\((a,b)\)上,且是路径上的边权最大值。要求\(a<b\)且a尽量大b尽量小。

考虑边\((u,v)\)了,那么a必然是与u左边的一些点,b必然是与v右边的一些点。并且这两边的点分别构成了一个集合,使得集合内的边权都小于\(w(u,v)\)。

于是可以考虑按边权从小到大的方式枚举,用并查集维护点之间的连通性。

由于最后的答案还有要求,我们还需要对每个点集维护一个set来查询集合内id最大值,以及集合内第一个大于x的id。

然而或许还是会TLE,因为过程中需要合并set,考虑set的启发式合并,每次将size小的set并入size大的set内。

这些都可以在Kruskal的过程中完成。

时间复杂度\(O(nlog^2n)\)。

#include <bits/stdc++.h>
#define FOR(i,a,b) for (int i=a; i<=b; ++i)
typedef long long LL; int n, m;
struct Node{int u, v, w, id;}node[N<<1];
int F[N], ans[N<<1][2];
int ma[N], tmp[N];
set<int> a[N];
set<int>::iterator it; bool comp(Node a, Node b){return a.w<b.w;}
int find(int x){return F[x]==0?x:(F[x]=find(F[x]));}
void GB(int x, int y){
for (it=a[x].begin(); it!=a[x].end(); ++it) a[y].insert(*it);
}
void Prim(){
sort(node+1,node+m+1,comp);
FOR(i,1,m) {
int u=find(node[i].u), v=find(node[i].v);
if (u==v) continue;
if (ma[u]>ma[v]) {
ans[node[i].id][0]=ma[v], ans[node[i].id][1]=*a[u].lower_bound(ma[v]);
}
else {
ans[node[i].id][0]=ma[u], ans[node[i].id][1]=*a[v].lower_bound(ma[u]);
}
if (a[u].size()>a[v].size()) swap(u,v);
ma[v]=max(ma[u],ma[v]); GB(u,v);
F[u]=v;
}
}
int main ()
{
scanf("%d%d",&n,&m);
FOR(i,1,m) scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].w), node[i].id=i;
FOR(i,1,n) a[i].insert(i), ma[i]=i;
Prim();
FOR(i,1,m) printf("%d %d\n",ans[i][0],ans[i][1]);
return 0;
}

[Offer收割]编程练习赛23-freeloop的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. [Offer收割]编程练习赛97

    链接 [https://hihocoder.com/contest/offers97/problems] 题意 题目1 : 放置矩形 时间限制:10000ms 单点时限:1000ms 内存限制:256 ...

  5. [Offer收割]编程练习赛9,10

    题目1 : 闰秒 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差. ...

  6. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  7. HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)

    描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...

  8. HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)

    描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...

  9. [Offer收割]编程练习赛48

    题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...

  10. [Offer收割]编程练习赛3 - 题目3 : 智力竞赛

    智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...

随机推荐

  1. .Net 如何访问主流的各大数据库

    做过开发的都知道,.NET基本可以理解是和MSSQL,windows服务器属于一个好的搭档,正如PHP和MYSQL,LIUNX等也可以理解是一个完美搭配:但是在实际的开发中并不完全是这样的,如果你是学 ...

  2. Python中remove,pop,del的区别

    先上题:写出最终打印的结果 a = [1, 2, 3, 4] for x in a: a.remove(x) print(a) print("=" * 20) b = [1, 2, ...

  3. node.js主从分布式爬虫

    前言 前文介绍过用Python写爬虫,但是当任务多的时候就比较慢, 这是由于Python自带的http库urllib2发起的http请求是阻塞式的,这意味着如果采用单线程模型,那么整个进程的大部分时间 ...

  4. 小球下落(Dropping Balls, Uva 679)

    题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...

  5. Hyperledger Fabic中的Transaction流程

    Hyperledger Fabic中的Transaction流程 Transaction处理流程时从client发起proposal到背书节点,背书节点发返回背书结果.client再将proposal ...

  6. java后端面试题汇总

    转载链接:https://www.nowcoder.com/discuss/90776?type=0&order=0&pos=23&page=0 基础篇 数据结构与算法 线性表 ...

  7. IIS 无法加载 CSS,JS的问题

    IIS 能加载 aspx,但不能加载里面的 js,css ,感觉有点坑. 解决方案如下:http://www.pageadmin.net/article/20121001/479.html 原来是没有 ...

  8. 个人作业-Week 1

    1)快速看完整部教材,列出你仍然不懂的5到10个问题,发布在你的个人博客上. Q1:"Scrum Master不是一个官,而是一个没有行政权力的沟通者,就像微软的PM那样.他/她同时还要在团 ...

  9. vs2013 CodeLens

    那东西叫 CodeLens  只有VS2013 旗舰版 (update 2及以上) 才可以用,高级版 专业版都没有.如何打开CodeLens呢?在VS菜单栏 >> 工具 >> ...

  10. 调研ANDRIOD平台的开发环境的发展演变

    在同学的推荐下,我选用学习eclipse这个软件,参考了这个网址的教程开始了一步一步的搭建之路. http://jingyan.baidu.com/article/bea41d437a41b6b4c5 ...