tags:

  • 模拟
  • 快速幂
  • 逆序对
  • 树状数组
  • 归并排序
  • 最小生成树
  • lca
  • 倍增
    categories:
  • 信息学竞赛
  • 总结

tex live 2017.iso
转圈游戏
火柴排队
货车运输

转圈游戏

solution

  就是要求让一个人在一个圈上走一定步数, 问最后在哪里.例如走\(10^k\)次, 一次走\(\text{m}\)步, 初始时在\(\text{x}\), 圈长\(\text{n}\), 那么它最后的位置就是:
\[ x+m10^k\mod n \]
那么直接用快速幂暴力求出这个式子的值.

code

#include<cstdio>
int n,m,k,x;long long pow(int a,int b){long long ans=1ll,bas=a;while(b){if(b&1)ans*=bas;ans%=n;if(!bas)return ans;bas*=bas;bas%=n;if(!bas)return false;b>>=1;}return ans;
}int main(){scanf("%d%d%d%d",&n,&m,&k,&x);long long ans=x,mm=pow(10,k);ans+=m*mm%n;ans%=n;printf("%lld\n",ans);return 0;
}

火柴排队

solution

  其实就是将其中一个通过交换两个相邻的元素使得变化后的序列与另一个序列最相近, 问操作次数.
  其实就是使得两个序列中最大的元素位置相同, 第二大的元素位置也相同, 第三大的元素位置相同......那么元素的具体大小其实根本无所谓, 只需要知道元素之间的大小关系, 所以可以先将两个序列离散化, 然后找到其中一个的元素在另一个中的位置, 记为序列\(\text{c}\), 经离散后的序列记为\(\text{a,b}\), 那么我们进行的交换操作, 实际上就是将\(\text{c}\)变为序列\(1,2,\cdots ,n\), 这样其实就是将\(\text{b}\)变成\(\text{a}\).

Code

#include<algorithm>
#include<cstdio>
#define N 100005
#define mod 99999997int ans;
int n,u[N];
int a[N],b[N];
int e[N],f[N],g[N];void mergesort(int l,int r){ if(l==r)return;int mid,i,j,k;  mid=(l+r)>>1;   mergesort(l,mid); mergesort(mid+1,r); i=l,j=mid+1,k=l;  while(i<=mid&j<=r)if(g[i]>=g[j])u[k++]=g[j++],ans+=(mid-i+1)%mod,ans%=mod;else u[k++]=g[i++];while(i<=mid)u[k++]=g[i++];while(j<=r)u[k++]=g[j++];for(i=l;i<=r;i++)g[i]=u[i];
}struct Node{int val,pos;bool operator<(const Node& s)const{return val<s.val;}
}c[N],d[N];int main(){scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&a[i]);for(int i=1;i<=n;++i)scanf("%d",&b[i]);for(int i=1;i<=n;++i)c[i]=(Node){a[i],i};for(int i=1;i<=n;++i)d[i]=(Node){b[i],i};std::sort(c+1,c+n+1);std::sort(d+1,d+n+1);for(int i=1;i<=n;++i)e[c[i].pos]=i;for(int i=1;i<=n;++i)f[d[i].pos]=i;for(int i=1;i<=n;++i)g[i]=c[f[i]].pos;mergesort(1,n);printf("%d",ans);return 0;
}

货车运输

  这个经典的题目不知道做了多少遍了, 这次做还是发现了一些问题.

Solution

  需要使得图上两点之间经过路径上边的最小值最大, 首先将原图变成最大生成树, 因为两点之间经过的最小边权最大的路径必然存在在最大生成树上. 记两点之间的路径的转折点为\(\text{lca}\)(最近公共祖先),在最大生成树上两点\(\text{u,v}\)之间路径上边的最小值就是\(\text{u}\)到\(\text{lca}\)路径上边的最小值或者是\(\text{u}\)到\(\text{lca}\)路径上边的最小值.

  • 需要用倍增来加速\(\text{lca}\)的求解, 也可以用树链剖分, 用\(f(u,i)\)表示从\(\text{u}\)向上第\(2^i\)个点是哪个点.递推公式为:
    \[ f(u,i)=f(f(u,i-1),i-1) \]
  • 求\(树上两点之间路径的最小值\)可以使用\(\text{RMQ}\)算法, 用\(d(u,i)\)表示从$\text{u}以上\(2^i\)个点路径的最小值, 那么递推公式为:
    \[ d(u,i)=\max{d(u,i-1),d(f(u,i-1),i-1)} \]

  \(f(u,0)\)和\(d(u,0)\)可以在dfs中直接得到, \(f(u,i)\)和\(d(u,i)\)需要递推来获得.

Code

#include<algorithm>
#include<cstdio>
#define N 500005
#define inf 0x3f3f3f3f
int n,m,q;
int fa[N];
int dep[N];
int f[N][20];
int d[N][20];int min(int i,int j){return i>j?j:i;
}int find(int s){if(fa[s]!=s)fa[s]=find(fa[s]);return fa[s];
}
struct E{int u,v,cost;void Init(){scanf("%d%d%d",&u,&v,&cost);}bool operator<(const E&s)const{return cost>s.cost;}void print(){printf("%d %d %d\n",u,v,cost);}
}edge[N];int head[N],tot;
struct Edge{int v,c,nxt;
}e[N];void AddEdge(int u,int v,int c){e[++tot]=(Edge){v,c,head[u]};head[u]=tot;e[++tot]=(Edge){u,c,head[v]};head[v]=tot;
}void dfs(int x,int fath){f[x][0]=fath;dep[x]=dep[fath]+1;for(int i=head[x];i;i=e[i].nxt){if(e[i].v==fath)continue;d[e[i].v][0]=e[i].c;dfs(e[i].v,x);}
}int Lca(int u,int v){int cha;if(dep[u]<dep[v])std::swap(u,v);for(int i=19;i>-1;--i)if(dep[f[u][i]]>=dep[v])u=f[u][i];for(int i=19;i>-1;--i)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];if(u!=v)return f[u][0];return u;
}int Ans(int u,int v){if(u==v)return inf;int ans=inf;for(int i=19;i>-1;--i)if(dep[f[u][i]]>=dep[v])ans=min(d[u][i],ans),u=f[u][i];return ans;
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;++i)edge[i].Init();for(int i=1;i<=n;++i)fa[i]=i;std::sort(edge+1,edge+m+1);int f1,f2,flag=0;for(int pos=1,f1,f2,i=1;i<n;++i){for(f1=find(edge[pos].u),f2=find(edge[pos].v);f1==f2;++pos,f1=find(edge[pos].u),f2=find(edge[pos].v))if(pos>m){flag=1;break;}if(flag)break;fa[f1]=f2;AddEdge(edge[pos].u,edge[pos].v,edge[pos].cost);//edge[pos].print();}dfs(1,0);for(int i=1;i<20;++i)for(int j=1;j<=n;++j)f[j][i]=f[f[j][i-1]][i-1];for(int i=1;i<20;++i)for(int j=1;j<=n;++j)d[j][i]=min(d[j][i-1],d[f[j][i-1]][i-1]);scanf("%d",&q);int u,v,lca;while(q--){scanf("%d%d",&u,&v);lca=Lca(u,v);if(find(u)!=find(v))printf("-1\n");else printf("%d\n",min(Ans(u,lca),Ans(v,lca)));}return 0;
}

转载于:https://www.cnblogs.com/qdscwyy/p/8728113.html

NOIP 2013 day1相关推荐

  1. 【NOIP 2013 Day1 T3】货车运输(最大生成树+LCA)

    题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

  2. NOIP 2016 Day1 T3-换教室

    NOIP 2016 Day1 T3-换教室 题意 思路 代码 题目链接:换教室 题意 \;\;\;\; 有 nnn 节要上.每节课有两个教室同时在上,教室为 ci,dic_{i},d_{i}ci​,d ...

  3. NOIP 2017 Day1 T2 时间复杂度 complexity - 模拟题 题解

    作者@豪哒哒哒HaoDaDaDa 转载自简书@豪哒哒哒HaoDaDaDa-简书-NOIP 2017 Day1 T2 时间复杂度 (有一个月没有写简书了-) (这次终于开始拿Markdown写了,富文本 ...

  4. [NOIP 2013提高组]转圈游戏 题解

    这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...

  5. NOIP 2013 提高组 货车运输

    描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...

  6. Noip 2016 Day1 题解

    老师让我们刷历年真题, 然后漫不经心的说了一句:"你们就先做做noip2016 day1 吧" ...... 我还能说什么,,,,,老师你这是明摆着伤害我们啊2333333333 ...

  7. NOIP 2013 普及组初赛试题

    第 1 题 一个 32 位整型变量占用(A)个字节. A. 4 B. 8 C. 32 D. 128 常识题,每个32 位整型变量占4个字节 第 2 题 二进制数 11.01 在十进制下是(A). A. ...

  8. [NOIp 2013]货车运输

    Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...

  9. Noip 2013 练习

    转圈游戏 传送门 Solution 快速幂 Code //By Menteur_Hxy #include <cstdio> #include <cstdlib> #includ ...

最新文章

  1. 段错误linux 内存不够,c - 为什么我的程序在linux-gcc而不是mingw-gcc上出现段错误? - 堆栈内存溢出...
  2. 2012年欧洲杯德国战车止步四强赛
  3. C语言的关键字 extern
  4. 巧妙喝水打败多种疾病(节选)
  5. linux nginx 配置端口访问,Linux入门教程:ubuntu 16.04配置nginx服务器实现一个IP一个端口多个站点,ubuntunginxNginx 使用异步...
  6. NodeJs将项目上传至服务器
  7. Swift For TensorFlow终于开源,但先别急着用
  8. Software--Architecture--SOA Factory
  9. 概率就是个冷冰冰的坑
  10. OpenCV读取UsbCam的图像
  11. 微信公众号小程序开发
  12. Hadoop实战经验之HDFS故障排除-尚硅谷大数据培训
  13. 寄存器的七种寻址方式
  14. 第六届“强网杯”全国网络安全挑战赛-青少年专项赛
  15. 打怪物小游戏,无聊打发时间
  16. 用Photoshop制作2寸照片方法
  17. GPS定位系统普遍存在的问题
  18. 【神经网络】MP神经网络模型(附实例代码讲解)
  19. EEG情感分析综述(三)
  20. 软考信息系统项目管理师质量管理高分论文赏析

热门文章

  1. MySQL中查询时间最大的一条记录
  2. Spring MVC上传文件原理和resolveLazily说明
  3. Orace 12.2 ORA-12012: error on auto execute of job SYS.ORA$AT_OS_OPT_SY_21
  4. 部分标点符号和数学符号的英文名字
  5. xpath技术,用在dom4j中
  6. 27 | 案例篇:为什么我的磁盘I/O延迟很高?
  7. py-opp 类(class)
  8. 【AWSL】之Linux引导过程及服务控制(MBR、GRUB、runlevel、systemcl、init、ntsysv、chkconfig)
  9. 参数变化_PDP驱动波形参数分析
  10. write up: web 前女友(SKCTF)