NOIP2017提高组模拟赛4 (总结)

第一题 约数

    设K是一个正整数,设X是K的约数,且X不等于1也不等于K.
加了X后,K的值就变大了,你可以重复上面的步骤。例如K= 4,我们可以用上面的规则产生所有的非素数. 可以通过5次变化得到。
24: 4->6->8->12->18->24.现在给你两个整数N 和 M, 求最少需要多少次变化才能到从 N 变到 M. 如果没法从N变到M,输出-1.这道题就是很简单的bfs,可以观察到n变化到m是近似成倍增长的。其实从最小到最大的变化也就只有30次而已。
#include<cstdio>
#include<algorithm>
#include<cmath>typedef long long ll;using namespace std;const int maxl=100;
const int oo=1e9;
const int N=100000;
int T,n,m;
int op[N+10],ct,ch,f[N+10];
bool uss[N+10];int main()
{freopen("a.in","r",stdin);freopen("a.out","w",stdout);scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1;i<=N;i++) f[i]=oo,uss[i]=0;f[n]=0; ct=ch=1; op[ct]=n;while(ch<=ct){if(op[ch]<m && f[op[ch]]<maxl){int i=floor(sqrt(op[ch]));i=(m<op[ch]+i)?m-op[ch]:i;for(;i>=2;i--){if(op[ch]%i==0){if(op[ch]+i<=m && f[op[ch]]+1<f[op[ch]+i]){if(!uss[op[ch]+i]) op[++ct]=op[ch]+i,uss[op[ch]+i]=1;f[op[ch]+i]=f[op[ch]]+1;//printf("%d %d -> %d %d\n",op[ch],f[op[ch]],op[ch]+i,f[op[ch]+i]);}if(i*i!=op[ct]){int yu=op[ch]+op[ch]/i;if(yu<=m && f[op[ch]]+1<f[yu]){if(!uss[yu]) op[++ct]=yu,uss[yu]=1;f[yu]=f[op[ch]]+1;//printf("%d %d -> %d %d\n",op[ch],f[op[ch]],yu,f[yu]);}}}}}uss[op[ch]]=0;ch++;}printf("%d\n",(f[m]!=oo)?f[m]:-1);}return 0;
}

第二题 警察与小偷

    为帮助捕获在逃的犯人, 警局引进了一套新计算机系统. 系统覆盖了N 个城市,有E条双向的道路。城市标号为1 到N. 犯人经常从一个城市逃到另外一个城市. 所以警察想知道应该在哪里设置障碍去抓犯人.计算机系统需要回答下面两种类型的问题:
1. 考虑城市A 、B; 如果把连接城市G1和G2的那条公路切断,逃犯还能从城市A逃到城市B吗?
2. 考虑三个城市A、B 、C. 如果把城市C封锁(则不能从其他进入城市C),逃犯还能从城市A逃到城市B吗?
你的任务是帮计算机系统回答这些提问。(一开始,任意两个城市都是可以相互到达的).这是一道好题,数据很大,但边是双向的,只是删一条边或一个点,而且保证了点两两之间是连通的。(这些很重要)那么,可以从dfs序入手,dfs序是一棵树,其中会有返祖边。(如图)


那我们只需要判断删掉的点或边是否在u到v的路径上,不在的话,删了也没用。(用三次lca处理)。
如果删的是边,判断边的左右端点是否为一个块,(dfn[a]>dfn[b] 且 low[a]≤dfn[b])是的话,删了还是u,v保持连通的,否则u,v不连通,(必经路被删)
如果删的是点c。lca---u,v的公共祖先
若c在u->lca的路径上,则更新uminlow(能到达的最早的点)。
若c在v->lca的路径上,则更新vminlow(能到达的最早的点)。
判断uminlow和vminlow都小于c就保证了u,v之间连通。
否则不连通。

#include<cstdio>
#include<algorithm>
#include<cstring>#define imax(a,b) ((a>b)?(a):(b))
#define imin(a,b) ((a<b)?(a):(b))typedef long long ll;using namespace std;const int mm=500100;
const int nn=100100;
int N,E,Q,dt,TN;
bool vis[nn];
int ti[nn],low[nn];
int ne[mm<<1],to[mm<<1],h[nn],tt;
int f[nn][20];void addedge(int a,int b)
{to[++tt]=b; ne[tt]=h[a]; h[a]=tt;to[++tt]=a; ne[tt]=h[b]; h[b]=tt;
}void dfs(int x,int fa)
{f[x][0]=fa;ti[x]=low[x]=++dt; vis[x]=1;for(int p=h[x];p;p=ne[p]){int u=to[p];if(u==fa) continue;if(!vis[u]) dfs(u,x);low[x]=imin(low[x],low[u]);}
}int lca(int a,int b)
{if(a==b) return a;if(ti[a]<ti[b]) swap(a,b);for(int i=TN;i>=0;i--)if(ti[f[a][i]]>ti[b]) a=f[a][i];return (f[a][0]);
}int mingo(int a,int b)
{for(int i=TN;i>=0;i--)if(ti[f[a][i]]>ti[b]) a=f[a][i];return a;
}bool judge(int u,int v,int a)
{int w=lca(u,v);int x=lca(u,a);int y=lca(v,a);if(x!=a) swap(x,y);return (x==a && y==w);
}int main()
{freopen("b.in","r",stdin);freopen("b.out","w",stdout);scanf("%d%d",&N,&E); tt=1;for(int i=1;i<=E;i++){int A,B; scanf("%d %d",&A,&B);addedge(A,B);}ti[0]=low[0]=0; dt=0; dfs(1,0);f[1][0]=1; TN=0;for(int i=1;(1<<(i-1))<N;i++){TN++;for(int j=1;j<=N;j++)f[j][i]=f[f[j][i-1]][i-1];}scanf("%d",&Q);for(int i=1;i<=Q;i++){int ww,a,b,c,d;scanf("%d",&ww);if(ww==1){scanf("%d%d%d%d",&a,&b,&c,&d);if(ti[a]<ti[b]) swap(a,b);if(ti[c]<ti[d]) swap(c,d);if(judge(a,b,c) && judge(a,b,d)){if(low[c]<=ti[d]) printf("yes\n"); else printf("no\n");} else printf("yes\n");} elseif(ww==2){scanf("%d%d%d",&a,&b,&c);if(ti[a]<ti[b]) swap(a,b);if(judge(a,b,c)){if(lca(a,b)==c){int xx=mingo(a,c),yy=mingo(b,c);if(low[xx]<ti[c] && low[yy]<ti[c]) printf("yes\n"); else printf("no\n");} else{int dp=0;if(lca(a,c)==c) dp=a; else dp=b;int xx=mingo(dp,c);if(low[xx]<ti[c]) printf("yes\n"); else printf("no\n");}} else printf("yes\n");}}return 0;
}

第三题 圆桌会议

    有N个人顺时针围在一圆桌上开会,他们对身高很敏感. 因此决定想使得任意相邻的两人的身高差距最大值最小. 如果答案不唯一,输出字典序最小的排列,指的是身高的排列.一道贪心的题目。假设不是一个环,而是一条链,那该怎么做?很显然,低-高-低这类是不可能的,因为低-低-高肯定比它更优。是环的话,最低-最高这肯定是不行的,因为需要最大的最小。可以考虑数列拆成两部分(排序后按A5-A3-A1-A2-A4-A6这样排)。这样是最优的,详细证明如下:A5-A3-A1-A2-A4-A6,假设A4-A6最大,可以改得更优,A5移过来,变成A3-A1-A2-A4-A5-A6,那么A3-A6比A4-A6跟大,答案肯定不会优。其他情况也差不多。Ai和Ai+1之间肯定改不了(-_-|| 显然的)。字典序怎么办?先求出minans,然后放A1,在右侧放A2,判断A4和当前头的距离是否合法(小于等于minans),不合法的话A3只能放在头的左侧作为新的头(不合法的话,再将A3放在右侧的话,A4就没法放了 放左或放右都会使最大距离大于minans),合法的话就将A3放在右侧,以此类推。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>#define imax(a,b) ((a>b)?(a):(b))typedef long long ll;using namespace std;bool cmp(int a,int b) { return (a<b); }int ng,n,d[60],ans,p[60];
int ya[60],yb[60],l1,l2;int main()
{freopen("c.in","r",stdin);freopen("c.out","w",stdout);scanf("%d",&ng);while(ng--){scanf("%d",&n); ans=0;for(int i=1;i<=n;i++) scanf("%d",&d[i]);sort(d+1,d+1+n);int w=(n+1)>>1,q=1,cc=w;p[w]=d[1];for(int i=2;i<=n;i++){if((i&1)==0) w+=q; else w-=q;p[w]=d[i];q++;}ans=abs(p[1]-p[n]);for(int i=2;i<=n;i++) ans=imax(ans,abs(p[i]-p[i-1]));l1=1; l2=1;ya[1]=d[1]; yb[1]=d[1];for(int i=2;i<=n;i++){if(abs(d[i+1]-yb[l2])>ans) yb[++l2]=d[i]; else ya[++l1]=d[i];}for(int i=1;i<=l1;i++) printf("%d ",ya[i]);for(int i=l2;i>=2;i--) printf("%d ",yb[i]); printf("\n");}return 0;
}

考的不怎么好,没状态,最后一题想出来但字典序问题没搞好。争取在每一次考试中都能不断进步吧!

超越自己,让自己变得更好 ------------加油,努力

转载于:https://www.cnblogs.com/kekxy/p/7526108.html

NOIP2017提高组模拟赛4 (总结)相关推荐

  1. 计蒜客NOIP2017提高组模拟赛(四)day1

    T1:小X的质数 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的 ...

  2. 计蒜客NOIP2017提高组模拟赛(三)day2-小区划分

    传送门 dp,注意边界 1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #includ ...

  3. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  4. JZOJ 5475. 【NOIP2017提高组正式赛】逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张n个点m条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,n号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...

  5. JZOJ 5474. 【NOIP2017提高组正式赛】时间复杂度

    Description 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请 ...

  6. JZOJ 5476. 【NOIP2017提高组正式赛】奶酪

    Description 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = ...

  7. JZOJ 5182. 【NOIP2017提高组模拟6.29】码灵鼠

    Description 码零鼠是一只很喜欢mx数学的神犇,上面那个不是ta本人的样子.这天,ta在研究一个神奇的数列,这个数列是这样的: a0 = 1 an = ai + aj (n>=1, i ...

  8. JZOJ 4932. 【NOIP2017提高组模拟12.24】B

    Description 现在你有 NN 个数,分别为 A1,A2,-,ANA1,A2,-,AN ,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R)(L,保证 MaxAi−MinA ...

  9. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

最新文章

  1. 《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
  2. 丰富“WinForms” 的一个别样项目(学生管理)
  3. 安装kickstart失败
  4. origin对数据进行操作
  5. 数据库类型少_DELETE与DROP 在数据库中的使用方法和区别
  6. 推荐一个看ELF文件的软件 010Editor
  7. [摘录]第2章 中场谈判技巧
  8. linux网站配置文件.htaccess伪静态转换到IIS web.config中
  9. java定时发送_Java 定时发送邮件 | 学步园
  10. Java并发编程实践-总结
  11. 樊昌信 通信原理第七版 第八章思考题
  12. 在html5网页中录音解决方案
  13. 【观察】华为:给园区安防加点“智慧”
  14. iOS常用第三方库大全
  15. 使用wangeditor遇到的坑,插入视频只显示音频
  16. 深度学习与计算机视觉-6章 Python-OpenCV
  17. 学习笔记——利用CC++语言计算二重积分
  18. python 无脸男
  19. 铁头乔:开源社区那些事
  20. A Fixed-Point Model for Pancreas Segmentation in Abdominal CT Scans

热门文章

  1. 程序员课外拓展001:EI收录号Accession number中的数字的含义
  2. uniapp 生成html5_uni-app 登录(h5+ app 篇)
  3. RT-thread 柿饼UI demo(文本浏览+电子相册) ---- 暨柿饼入门课第一周作业附加题
  4. 通知与服务——服务Service——服务的绑定与解绑延迟绑定服务与解绑服务
  5. NVMe ssd加速卡和NVMe ssd硬盘的区别
  6. 今日小程序推荐:纸塘-这个壁池真高清!
  7. 入职一年感言简短_如何在Windows任务栏中放入简短说明
  8. mysql fastdfs_FastDFS监控系统Fastdfs-zyc配置
  9. 03.【python基础二】if判断语句之if-else、elif、if嵌套
  10. 水星MW300R V6(MT7620)CPU引脚图