1.转圈游戏

https://www.luogu.org/problem/show?pid=1965

这道题失误极大,把freopen注释掉了,导致第一题暴0.

注意:在考试时一定要留下最后的时间检查格式!!!

由于此题中k的值很大,所以暴力只能过80%数据,需要用到快速幂。

  1. #include <cstdio>
  2. long long n,m,k,x,ans,t;
  3. int main()
  4. {
  5. freopen("circle.in","r",stdin);
  6. freopen("circle.out","w",stdout);
  7. scanf("%lld%lld%lld%lld",&n,&m,&k,&x);
  8. ans=; t=;
  9. while(k)
  10. {
  11. if(k%==)ans=(ans*t)%n;
  12. k/=;
  13. t=((t%n)*(t%n))%n;
  14. }
  15. printf("%d",(x+(m*ans)%n)%n);
  16. fclose(stdin);
  17. fclose(stdout);
  18. return ;
  19. }

2.火柴排队

https://www.luogu.org/problem/show?pid=1966

这道题可用树状数组||逆序对||归并排序完成

献上树状数组代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. struct MyStruct
  5. {
  6. int data;
  7. int loc;
  8. }a[],b[];
  9. int e[], n, c[];
  10. int inline readint()
  11. {
  12. int x = ;
  13. char c = getchar();
  14. while (c<'' || c>'') c = getchar();
  15. while (c >= ''&&c <= '')
  16. {
  17. x = x * + c - '';
  18. c = getchar();
  19. }
  20. return x;
  21. }
  22. int lowbit(int x)
  23. {
  24. return x&-x;//树状数组实现
  25. }
  26. void add(int x,int t)
  27. {
  28. while (x <= n)
  29. {
  30. e[x] += t;
  31. e[x] %=;
  32. x += lowbit(x);//每次往后加,可以改变后面对应的和
  33. }
  34. }
  35. int sum(int x)
  36. {
  37. int s = ;
  38. while(x)
  39. {
  40. s += e[x];
  41. s %= ;
  42. x -= lowbit(x);//得到所求的和
  43. }
  44. return s;
  45. }
  46. bool cmp(MyStruct x, MyStruct y)
  47. {
  48. return x.data < y.data;
  49. }
  50. int main()
  51. {
  52. n = readint();
  53. for (int i = ; i <= n; i++)
  54. {
  55. a[i].data = readint();
  56. a[i].loc = i;//记录位置
  57. }
  58. for (int i = ; i <= n; i++)
  59. {
  60. b[i].data = readint();
  61. b[i].loc = i;
  62. }
  63. sort(a + , a + n + , cmp);
  64. sort(b + , b + n + , cmp);
  65. for (int i = ; i <= n; i++)
  66. {
  67. c[a[i].loc] = b[i].loc;//离散优化
  68. }
  69. int ans = ;
  70. for (int i = ; i <= n; i++)
  71. {
  72. add(c[i], );//离散优化后大小就是正确顺序的位置
  73. ans += i - sum(c[i]);//当前位置,减去之前比他大的数的个数
  74. ans %= maxm;
  75. }
  76. printf("%d", ans);
  77. return ;
  78. }

3.货车运输

本题用LCA+最大生成树完成。。。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<iostream>
  5. #define MAXN 10005
  6. using namespace std;
  7. int n,m;
  8. struct T
  9. {
  10. int v;
  11. int w;
  12. int next;
  13. }edge[];
  14.  
  15. struct P
  16. {
  17. int u;
  18. int v;
  19. int w;
  20. }a[MAXN*];
  21. bool cmp(P x,P y)
  22. {
  23. return x.w > y.w;
  24. }
  25.  
  26. int head[MAXN],cnt;
  27. int f[MAXN];
  28. int find(int x)//并查集,判断是否在同一个集合内
  29. {
  30. if(f[x] == x) return f[x];
  31. else return f[x] = find(f[x]);
  32. }
  33. void Add_edge(int u,int v,int w)//树连边
  34. {
  35. edge[cnt].v = v;
  36. edge[cnt].w = w;
  37. edge[cnt].next = head[u];
  38. head[u] = cnt++;
  39. }
  40. void Union(int u,int v)//联通块
  41. {
  42. int x = find(u);
  43. int y = find(v);
  44. if(x != y) f[x] = y;
  45. }
  46. void kruskal()//最大生成树
  47. {
  48. for(int i = ; i <= MAXN; i++)
  49. f[i] = i;
  50. for(int i = ; i <= m; i++)
  51. {
  52. int u = a[i].u,v = a[i].v;
  53. if(find(u) != find(v))
  54. {
  55. Union(u,v);
  56. Add_edge(u,v,a[i].w);
  57. Add_edge(v,u,a[i].w);
  58. }
  59. }
  60. }
  61.  
  62. int up[MAXN][],g[MAXN][],h[MAXN];//up[i][j]表示i的第2^j个祖先,g[i][j]表示i到i的第2^j个祖先路径上的最小权值,h[i]表示i在树中深度
  63. bool vis[MAXN];
  64. void build_tree(int u)
  65. {
  66. vis[u] = ;
  67. for(int i = head[u]; i != -; i = edge[i].next)
  68. {
  69. int v = edge[i].v;
  70. if(!vis[v])
  71. {
  72. g[v][] = edge[i].w;
  73. up[v][] = u;
  74. h[v] = h[u]+;
  75. build_tree(v);
  76. }
  77. }
  78. }
  79. //把较深的一个点往上提,并记录他到祖先边权最小值,用他的一个祖先代替他
  80. int move(int &u,int H)
  81. {
  82. int res = ;
  83. for(int i =; i >= ; i--)
  84. {
  85. if(h[up[u][i]] >= H)
  86. {
  87. res = min(res,g[u][i]);
  88. u = up[u][i];
  89. }
  90. }
  91. return res;
  92. }
  93. int query(int u,int v)//自认为是最难的地方
  94. {
  95. if(find(u) != find(v)) return -;
  96. int res = ;
  97. if(h[u] != h[v]) res = h[u] > h[v]?move(u,h[v]):move(v,h[u]);
  98. if(u == v) return res;
  99. for(int i = ; i >= ; i--)//倍增的同时记录最小值,两个点越来越逼近公共祖先
  100. {
  101. if(up[u][i] != up[v][i])
  102. {
  103. res = min(res,min(g[u][i],g[v][i]));
  104. u = up[u][i];
  105. v = up[v][i];
  106. }
  107. }
  108. res = min(res,min(g[u][],g[v][]));//实际上到了这一步up[x][0] == up[y][0]因为它们的已经在同一棵子树里面
  109. //printf("up[u][0]: %d\n",up[u][0]);
  110. //printf("up[v][0]: %d\n",up[v][0]);
  111. return res;
  112. }
  113.  
  114. int main()
  115. {
  116. memset(head,-,sizeof head);
  117. scanf("%d%d",&n,&m);
  118. for(int i = ; i <= m; i++)
  119. scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
  120. sort(a+,a+m+,cmp);
  121. kruskal();
  122.  
  123. for(int i = ; i <= n; i++)//构建森林,并且初始化h,up,g
  124. {
  125. if(!vis[i])
  126. {
  127. h[i] = ;
  128. build_tree(i);
  129. g[i][] = ;
  130. up[i][] = i;
  131. }
  132. }
  133. for(int i = ; i <= ; i++)//预处理up和g,i大了也没有什么影响
  134. {
  135. for(int j = ; j <= n; j++)
  136. {
  137. up[j][i] = up[up[j][i-]][i-];
  138. g[j][i] = min(g[j][i-],g[up[j][i-]][i-]);
  139. }
  140. }
  141.  
  142. int q;
  143. scanf("%d",&q);
  144. for(int i = ; i <= q; i++)
  145. {
  146. int x,y;
  147. scanf("%d%d",&x,&y);
  148. printf("%d\n",query(x,y));
  149. }
  150. return ;
  151. }

NOIP2013 Day1的更多相关文章

  1. noip2013/day1/1/转圈游戏

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  128000kB 描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从  ...

  2. 洛谷1967货车运输 即 NOIP2013 DAY1 T3

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

  3. 二模 (15)day2

    第一题:Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/2p 的概率完成并得到2p−1分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流做 ...

  4. noip2013提高组day1第一题-转圈游戏——快速幂典型应用

    所谓的快速幂: // 计算 m^n % k 的快速幂算法 int quickpow(int m,int n,int k) { ; ) { ) b = (b*m)%k; n = n >> ; ...

  5. 【NOIP2013】DAY1题解+代码

    T1 傻逼快速幂,敲敲就过了. 我跟你们讲个笑话当时我以为这个数据范围过不了于是想出了求GCD再推规律什么的magic方法中途还咨询了某个学长. 然后怎么想都是不可做. ……直到我发现我昨年的代码一个 ...

  6. NOIP2013 提高组 Day1

    https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...

  7. JZOJ 3534. 【NOIP2013提高组day1】货车运输

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

  8. Noip2013之路

    当我回望过去的一年,我想,我对自己没有任何的愧疚,因为我每一个脚印,都踩的很坚实. 第一次参加模拟赛,第一次接触NOIP的规则,虽然考得不是特别好,但是还是很有收获的,首先,数组一定要开得足够大,不然 ...

  9. NOIP2013题解

    NOIP2013题解 Day1 转圈游戏 circle 快速幂模板题. #include<iostream> using namespace std; int n,m,k,x; int f ...

随机推荐

  1. 通过一道面试题了解Condition线程通信

    Condition Condition接口描述了可能会与锁有关联的条件变量.这些变量在用法与使用Object.wait访问的隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个Lock可能与多 ...

  2. 2.spring cloud eureka client配置

    红色加粗内容表示修改部分 1.把server项目打成jar包并启动 在项目根目录cmd执行  mvn clean package -Dmaven.test.skip=true mavne仓库地址建议 ...

  3. DNSmasq搭建DNS服务器

    原文地址:http://jirry.me/2016/04/19/dnsmasq-on-aliyun/ DNSmasq 是一个小巧且方便地用于配置 DNS 和 DHCP 的工具,适用于小型网络,它提供了 ...

  4. iOS支付宝SDK回调那坑

    支付宝钱包支付接口开发包2.0标准版(iOS 2.2.1) ,回调不出来,demo给出的方法是: - (BOOL)application:(UIApplication *)application op ...

  5. 利用Appium Python测试爱壁纸的登录和设置壁纸

    设置壁纸: #coding:utf-8 #Import the common package import os import unittest from appium import webdrive ...

  6. Python中的数据结构 --- 集合(set)

    1.集合(set)里面的元素是不可以重复的    s={1,2,3,3,4,3,4}      ## 输出之后,没有重复的 2.定义一个空集合 s = set([]) print s,type(s)3 ...

  7. [Linux] 随机切分文件内容

    1.从原文件中随机选出若干行 可以直接用shuf命令就可以完成: $ shuf -n source.txt > target.txt shuf命令的说明: $ shuf --help Usage ...

  8. [Linux] 复制文件夹下指定创建时间的文件

    暂时不知道什么命令可以达到这个目标,目前的方法是分步进行: 首先,找出指定创建时间内的文件名 例如在imgs文件夹中,找出创建时间在一天内的文件 > feb_files.txt 然后将这些文件复 ...

  9. IOS开发 GCD介绍: 基本概念和Dispatch Queue

    iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...

  10. U-Boot 不能识别FAT32 SD分区

    /********************************************************************* * U-Boot 不能识别FAT32 SD分区 * 说明: ...