肝了两题...

  T1一眼题,分解质因数,找出2的个数和5的个数取min输出

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
int n,m,T;
int fac2[maxn],fac5[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int main()
{
freopen("zero.in","r",stdin);
freopen("zero.out","w",stdout);
read(T);
for(int i=;i<=;i++)
{
int x=i;fac2[i]=fac2[i-];fac5[i]=fac5[i-];
for(;(x&)==;x>>=)fac2[i]++;
for(;x%==;x/=)fac5[i]++;
}
while(T--)
{
read(m);read(n);
int cnt2=fac2[m]-fac2[n]-fac2[m-n];
int cnt5=fac5[m]-fac5[n]-fac5[m-n];
printf("%d\n",min(cnt2,cnt5));
}
return ;
}

  T2是个环套树题

  分三类:①两个点都在同个树上,求直径,两次bfs或者树形DP即可

      ②一个点在环上一个点在树上,答案为最大深度dep+len/2

      ③两个点在不同的树上,即求max(depi+depj+dis(i,j)),而dis(i,j)显然是<=len/2且递增的,用单调队列维护max(depj+dis(i,j)),队头与i距离超过len/2就出队,走一圈之后就可以算出这种情况的答案

  三类取max

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int too,pre;}e[maxn];
int n,m,x,y,z,tot,ans,st,ed,cnt,len;
int mx1[maxn],mx2[maxn],d[maxn],last[maxn],isrt[maxn],rt[maxn],q[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline void add(int x,int y){e[++tot].too=y;e[tot].pre=last[x];last[x]=tot;}
void dfs(int x,int fa)
{
d[x]=d[fa]+;mx1[x]=d[x];mx2[x]=;
for(int i=last[x];i;i=e[i].pre)
if(e[i].too!=fa&&!isrt[e[i].too])
{
dfs(e[i].too,x);
if(mx1[e[i].too]>mx1[x])mx2[x]=mx1[x],mx1[x]=mx1[e[i].too];
else if(mx1[e[i].too]>mx2[x])mx2[x]=mx1[e[i].too];
}
ans=max(ans,mx1[x]+mx2[x]-(d[x]<<));
}
int dfs2(int x,int fa)
{
if(x==ed)return len++,;
for(int i=last[x];i;i=e[i].pre)
if(e[i].too!=fa)if(dfs2(e[i].too,x))
return rt[++cnt]=x,isrt[x]=,len++,;
return ;
}
inline int dis(int x,int y){if(x>=y)return x-y;return len-(y-x);}
inline void work()
{
int l=,r=;
for(int i=(len>>);i;q[++r]=i,i--)
while(l<=r&&mx1[rt[q[r]]]+dis(q[r],cnt)<=mx1[rt[i]]+dis(i,cnt))r--;
for(int i=cnt;i;i--)
{
while(l<=r&&(dis(q[l],i)>(len>>)||q[l]==i))l++;
ans=max(ans,mx1[rt[i]]+mx1[rt[q[l]]]+dis(q[l],i));
while(l<=r&&mx1[rt[q[r]]]+dis(q[r],i)<=mx1[rt[i]])r--;
q[++r]=i;
}
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
read(n);read(m);
for(int i=;i<n;i++)read(x),read(y),add(x,y),add(y,x);
for(int i=;i<=m;i++)
{
read(st);read(ed);ans=len=cnt=;
memset(isrt,,sizeof(isrt));d[]=-;
rt[++cnt]=ed;isrt[ed]=;dfs2(st,);
for(int j=;j<=cnt;j++)dfs(rt[j],),ans=max(ans,mx1[rt[j]]+(len>>));
work();printf("%d\n",ans);
}
return ;
}

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解的更多相关文章

  1. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解

    上星期打的...题有点水,好多人都AK了 T1排个序贪心就好了 #include<iostream> #include<cstring> #include<cstdlib ...

  2. 【前行】◇第3站◇ 国庆训练营·OI制模拟赛

    [第3站] 国庆训练营·OI制模拟赛Ⅰ 怀着冲刺提高组400的愿望来到这个very small but very interesting 的训练营QwQ 在北大dalao的带领下开始了第一场OI模拟赛 ...

  3. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  4. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  5. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  6. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  7. Java 第十一届 蓝桥杯 省模拟赛 小明的城堡

    小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...

  8. Java 第十一届 蓝桥杯 省模拟赛 梅花桩

    小明每天都要练功,练功中的重要一项是梅花桩. 小明练功的梅花桩排列成 n 行 m 列,相邻两行的距离为 1,相邻两列的距离也为 1. 小明站在第 1 行第 1 列上,他要走到第 n 行第 m 列上.小 ...

  9. Java 第十一届 蓝桥杯 省模拟赛 元音字母辅音字母的数量

    给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母. 元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母. 输入格式 输入一行,包含一个单词,单词中只包含小写英文字母. 输 ...

随机推荐

  1. hdu2544最短路(floyd基础)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. Python里//与/的区别?

    1.Python里面//的作用是除法取整,也就是直接取整数部分 例如:5//6=0; 56//3=18 2.而/的作用是直接进行常规的除法运算 例如:56/8=7 程序运算实例如下:

  3. 关于java获取网页内容

    最近项目需求,做一些新闻站点的爬取工作.1.简单的jsoup爬取,静态页面形式: String url="a.atimo.cn";//静态页面链接地址Document doc = ...

  4. [JSON].remove( keyPath )

    语法:[JSON].remove( keyPath ) 返回:无 说明:移除指定路径的键 示例: Set jsonObj = toJson("{div:{'#text-1': 'is tex ...

  5. linux学习总结---mysql总结②

    函数: 字符串 日期时间 数学 子查询:嵌套查询 1. 做子查询: select sclass from studb where sname='..' 2.select * from studb wh ...

  6. jupyter notebook 使用cmd命令窗口打开

    第一步:将文件路径改为你需要使用文件所在的路径 第二部:   jupyter notebook

  7. Django基本目录详解

    1.app是自己建立的一个存放app的文件夹,因为项目大了之后会存在很多app(pycharm生成app方法 Tools-Run manage.py Task-输入startapp app名称) 2. ...

  8. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset Trie

    题目链接: http://codeforces.com/contest/706/problem/D D. Vasiliy's Multiset time limit per test:4 second ...

  9. javaIO--字节流

    流---是指的一组有序的.有气垫和重点的字节集合,是对的护具传输的总称或者抽象. 流采用缓冲区技术,当写一个数据时,系统将数据发送到缓冲区而不是外部设备(如硬盘),当读一个数据时,系统实际是从缓冲区读 ...

  10. TCP系列18—重传—8、FACK及SACK reneging下的重传

    一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...