NOIP2013Day1解题报告
本来今天晚上拿13年NOIP的题目来做一下,测测能够得多少分,结果一晚上把Day1写完竟然AK了,吼吼吼
D1T1,题目:http://codevs.cn/problem/3285/
很水的一道快速幂啊,题目竟然还刚好有0号节点来降低难度,记住对于转圈之后的位置要往取模方面想
ans=(x+m*10k)%n,原本是x号位置,每次往前走m个位置,共走了10k,最后再对于圈的大小取模即为最终位置
模意义下可变形,ans=x+m*10k%n=x+m*(10k%n)%n
其中10k%n不就是个快速幂取模吗?直接上模板:http://www.cnblogs.com/hadilo/p/5719139.html
简单AC
// Copyright(c) Hadilo.All Rights Reserved.
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#define fre(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
typedef long long LL;
typedef double db;
const long double CPS=CLOCKS_PER_SEC,TL=0.998;
const int oo=;
inline int read()
{
int re=;
bool fu=;
char ch=getchar();
while ((ch>''||ch<'')&&ch!='-') ch=getchar();
if (ch=='-')
{
fu=;
ch=getchar();
}
while (ch>=''&&ch<='')
{
re=re*+ch-'';
ch=getchar();
}
return fu?-re:re;
}
int n;
inline int mi(LL a,int b)
{
LL k=;
a%=n;
while (b)
{
if (b&) k=k*a%n;
b>>=;
a=a*a%n;
}
return (int)k;
}
int main()
{
fre("circle");
n=read();
cout<<(read()*mi(,read())+read())%n<<endl;
return ;
}
D1T2,题目:http://codevs.cn/problem/3286/
其实看完题目我是先写的T3再写的T2,因为感觉这个不是太好证明
可伪证一下,把两个数组排序后对应位置即为最终答案,因为找不出反例而且感觉很正确
则对于两个数组a、b分别离散化一下,再记一个数组c[i]为b[i]离散化的值在a[i]中的位置
最后对 c 数组求逆序对即可,归并排序或树状数组都可以,我写的是归并排序
// Copyright(c) Hadilo.All Rights Reserved.
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#define fre(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
typedef long long LL;
typedef double db;
const long double CPS=CLOCKS_PER_SEC,TL=0.998;
const int oo=,N=,mo=;
inline int read()
{
int re=;
bool fu=;
char ch=getchar();
while ((ch>''||ch<'')&&ch!='-') ch=getchar();
if (ch=='-')
{
fu=;
ch=getchar();
}
while (ch>=''&&ch<='')
{
re=re*+ch-'';
ch=getchar();
}
return fu?-re:re;
}
struct gap
{
int x,num;
};
gap a[N];
int b[N],c[N],p[N],ans;
inline void gb(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>,i,j,top=;
gb(l,mid);
gb(mid+,r);
for (i=l,j=mid+;i<=mid&&j<=r;)
{
if (c[i]<=c[j]) b[++top]=c[i++];
else
{
b[++top]=c[j++];
if ((ans+=mid-i+)>mo) ans-=mo;
}
}
while (i<=mid) b[++top]=c[i++];
while (j<=r) b[++top]=c[j++];
for (;top;top--,r--) c[r]=b[top];
}
inline bool cmp(gap x,gap y)
{
return x.x<y.x;
}
int main()
{
fre("math");
int i,n=read();
for (i=;i<=n;i++) a[i]=(struct gap){read(),i};
sort(a+,a+i,cmp);
for (i=;i<=n;i++)
{
b[a[i].num]=i;
p[i]=a[i].num;
a[i]=(struct gap){read(),i};
}
sort(a+,a+i,cmp);
for (i=;i<=n;i++) c[a[i].num]=p[i];
gb(,n);
printf("%d\n",ans);
return ;
}
D1T3,题目:http://codevs.cn/problem/3287/
题目要求路径上的所有边权的最小值最大
对于两点之间的路径,不就是走最大的那几个边可以保证答案最大
而在一棵树中是能保证图刚好连通的,做一颗最大生成树
然后对于每组询问直接倍增求LCA即可,记得统计路径上的边权最小值
// Copyright(c) Hadilo.All Rights Reserved.
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#define fre(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
typedef long long LL;
typedef double db;
const long double CPS=CLOCKS_PER_SEC,TL=0.998;
const int oo=,N=,M=,L=,N2=;
inline int read()
{
int re=;
bool fu=;
char ch=getchar();
while ((ch>''||ch<'')&&ch!='-') ch=getchar();
if (ch=='-')
{
fu=;
ch=getchar();
}
while (ch>=''&&ch<='')
{
re=re*+ch-'';
ch=getchar();
}
return fu?-re:re;
}
struct gap
{
int u,v,w;
};
gap e[M];
int first[N],f[N][L],g[N][L],next[N2],v[N2],w[N2],d[N],fa[N],t;
inline int log2(int x)
{
int k=-;
while (x)
{
k++;
x>>=;
}
return k;
}
inline int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
inline void dfs(int x,int last)
{
if (last) fa[x]=find(last);
t=max(t,d[x]=d[last]+);
f[x][]=last;
for (int i=first[x];i;i=next[i])
if (v[i]!=last)
{
g[v[i]][]=w[i];
dfs(v[i],x);
}
}
inline bool cmp(gap x,gap y)
{
return x.w>y.w;
}
int main()
{
fre("truck");
int n=read(),m=read(),i,j,x,y,top=,ans;
for (i=;i<=m;i++) e[i]=(struct gap){read(),read(),read()};
sort(e+,e++m,cmp);
for (i=;i<=n;i++) fa[i]=i;
for (i=;i<=m;i++)
{
x=find(e[i].u);
y=find(e[i].v);
if (x!=y)
{
fa[x]=y;
top++;
next[top]=first[v[top+n]=e[i].u];
first[e[i].u]=top;
next[top+n]=first[v[top]=e[i].v];
first[e[i].v]=top+n;
w[top]=w[top+n]=e[i].w;
}
}
for (i=;i<=n;i++) fa[i]=i;
for (i=;i<=n;i++) if (fa[i]==i) dfs(i,);
t=log2(t);
for (i=;i<=t;i++)
for (j=;j<=n;j++)
{
f[j][i]=f[f[j][i-]][i-];
g[j][i]=min(g[j][i-],g[f[j][i-]][i-]);
}
m=read();
while (m--)
{
x=read();
y=read();
if (find(x)==find(y))
{
ans=oo;
if (d[x]<d[y]) swap(x,y);
for (i=log2(d[x]-d[y]);i>=;i--)
if (f[x][i]&&d[f[x][i]]>=d[y])
{
ans=min(ans,g[x][i]);
x=f[x][i];
}
if (x==y)
{
printf("%d\n",ans);
continue;
}
for (i=log2(d[x]);i>=;i--)
if (f[x][i]&&f[x][i]!=f[y][i])
{
ans=min(ans,min(g[x][i],g[y][i]));
x=f[x][i];
y=f[y][i];
}
printf("%d\n",min(ans,min(g[x][],g[y][])));
}
else printf("-1\n");
}
return ;
}
版权所有,转载请联系作者,违者必究
联系方式:http://www.cnblogs.com/hadilo/p/5932395.html
NOIP2013Day1解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- hyper-v 中 安装 Centos 7.0 设置网络 教程
安装环境是: 系统:win server 2012 r2 DataCenter hyper-v版本:6.3.9600.16384 centos版本:7.0 从网上下载的 centos 7.0 如果找 ...
- jQuery制作视频网站的展示效果
效果:如图所示,用户可以单击左上角的左右箭头,来控制视频展示的左右滚动. 当单击向右箭头时下面的展示视频会向左滚动隐藏,同时新的视频展示会以滚动方式显示出来.向左同理. css: ;; word-br ...
- C#语法杂谈
1. 值类型和引用类型 1.1 值类型 比如int,float,struct等,和C/C++中的变量差不多,但编译器会强制你必须先初始化再使用,避免一不小心使用了未初始化的变量. 1.2 引用类型 c ...
- 读书笔记:Sheldon Ross:概率论基础教程:随机变量
例1b 一个坛子里装有编号1-20的球,无放回抽取3个,取出球中至少一个号码大于等于17的概率是多少? 除了书上的解法外,还有一种解法: 考虑相反的情况:三个球的号码都小于17. 第一次从编号1-16 ...
- 无法找到类:java.lang.ClassNotFoundException: com.tt.javaweb.HttpServletRequest问题解决
问题如下:找不到Httpservlet对应的Class,进入build目录下发现确实没有对应的class文件. 严重: Allocate exception for HttpServletReques ...
- VB脚本调用exe应用程序并传递参数
VB脚本调用应用程序,并传递参数给exe应用程序: Private Sub CommandButton1_Click() Dim a a = Shell("D:\\ExperimentLin ...
- Callable和Future
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是void类型. 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使 ...
- 内存修改mfc
vc++6.0,内涵图
- 不用删除整个Maven本地库文件夹,Eclipse下直接更新Maven库
- Flink单机版安装与wordCount
Flink为大数据处理工具,类似hadoop,spark.但它能够在大规模分布式系统中快速处理,与spark相似也是基于内存运算,并以低延迟性和高容错性主城,其核心特性是实时的处理流数据.从此大数据生 ...