T1转圈游戏

十月のsecret

题解:快速幂

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #define LL long long
  5. using namespace std;
  6.  
  7. int n,m,k,x;
  8.  
  9. void read(int &x){
  10. char ch=getchar();x=;int f=;
  11. for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  12. for(;isdigit(ch);ch=getchar())x=x*+ch-'';
  13. x=x*f;
  14. }
  15.  
  16. LL ksm(int x,int y){
  17. LL ret=%n;
  18. while(y){
  19. if(y&)ret=ret*x%n;
  20. x=x*x%n;
  21. y>>=;
  22. }
  23. return ret;
  24. }
  25.  
  26. int main(){
  27. freopen("circle.in","r",stdin);
  28. freopen("circle.out","w",stdout);
  29. read(n);read(m);read(k);read(x);
  30. cout<<(x%n+m*ksm(,k)%n)%n<<endl;
  31. fclose(stdin);fclose(stdout);
  32. return ;
  33. }

AC

T2火柴排队

十月のsecret

题解:逆序对

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 100009
  6. #define mod 99999997
  7. using namespace std;
  8.  
  9. int ans,n,c[maxn],tree[maxn];
  10.  
  11. struct F{
  12. int h,id;
  13. }a[maxn],b[maxn];
  14.  
  15. void read(int &x){
  16. char ch=getchar();x=;int f=;
  17. for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  18. for(;isdigit(ch);ch=getchar())x=x*+ch-'';
  19. x=x*f;
  20. }
  21.  
  22. bool cmp(F a,F b){
  23. return a.h<b.h;
  24. }
  25.  
  26. int lowbit(int x){
  27. return x&(-x);
  28. }
  29.  
  30. void add(int x){
  31. while(x<=n){
  32. tree[x]++;
  33. x+=lowbit(x);
  34. }
  35. }
  36.  
  37. int sum(int x){
  38. int ret=;
  39. while(x){
  40. ret+=tree[x];
  41. x-=lowbit(x);
  42. }
  43. return ret;
  44. }
  45.  
  46. int main(){
  47. freopen("match.in","r",stdin);
  48. freopen("match.out","w",stdout);
  49. read(n);
  50. for(int i=;i<=n;i++)read(a[i].h),a[i].id=i;
  51. for(int i=;i<=n;i++)read(b[i].h),b[i].id=i;
  52. sort(a+,a+n+,cmp);sort(b+,b+n+,cmp);
  53. for(int i=;i<=n;i++)c[a[i].id]=b[i].id;
  54. for(int i=;i<=n;i++){
  55. add(c[i]);
  56. ans=(ans%mod+(i-sum(c[i])%mod)%mod);
  57. }
  58. cout<<ans<<endl;
  59. fclose(stdin);fclose(stdout);
  60. return ;
  61. }

AC

T3货车运输

十月のsecret

题解:最大生成树+kruskal重构树

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define maxn 100009
  5. #define maxm 500009
  6. using namespace std;
  7.  
  8. int n,m,tot,sumedge,nn,qx;
  9. int head[maxn],dad[maxn],deep[maxn],size[maxn],top[maxn],w[maxn],fa[maxn];
  10.  
  11. struct E{
  12. int x,y,z;
  13. }e[maxm];
  14.  
  15. struct Edge{
  16. int x,y,nxt;
  17. Edge(int x=,int y=,int nxt=):
  18. x(x),y(y),nxt(nxt){}
  19. }edge[maxn<<];
  20.  
  21. void add(int x,int y){
  22. edge[++sumedge]=Edge(x,y,head[x]);
  23. head[x]=sumedge;
  24. }
  25.  
  26. bool cmp(E a,E b){
  27. return a.z>b.z;
  28. }
  29.  
  30. int f(int x){
  31. fa[x]==x?x:fa[x]=f(fa[x]);
  32. }
  33.  
  34. void dfs(int x){
  35. size[x]=;deep[x]=deep[dad[x]]+;
  36. for(int i=head[x];i;i=edge[i].nxt){
  37. int v=edge[i].y;
  38. if(v==dad[x])continue;
  39. dad[v]=x;
  40. dfs(v);
  41. size[x]+=size[v];
  42. }
  43. }
  44.  
  45. void dfs_(int x){
  46. int s=;
  47. if(!top[x])top[x]=x;
  48. for(int i=head[x];i;i=edge[i].nxt){
  49. int v=edge[i].y;
  50. if(v!=dad[x]&&size[v]>size[s])s=v;
  51. }
  52. if(s){
  53. top[s]=top[x];
  54. dfs_(s);
  55. }
  56. for(int i=head[x];i;i=edge[i].nxt){
  57. int v=edge[i].y;
  58. if(v!=dad[x]&&v!=s)dfs_(v);
  59. }
  60. }
  61.  
  62. int lca(int x,int y){
  63. for(;top[x]!=top[y];){
  64. if(deep[top[x]]>deep[top[y]])swap(x,y);
  65. y=dad[top[y]];
  66. }
  67. if(deep[x]>deep[y])return w[y];
  68. return w[x];
  69. }
  70.  
  71. int main(){
  72. freopen("truck.in","r",stdin);
  73. freopen("truck.out","w",stdout);
  74. scanf("%d%d",&n,&m);nn=n;
  75. for(int i=;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
  76. sort(e+,e+m+,cmp);for(int i=;i<=n;i++)fa[i]=i;
  77. for(int i=;i<=m;i++){
  78. int fx=f(e[i].x),fy=f(e[i].y);
  79. if(fx!=fy){
  80. nn++;w[nn]=e[i].z;
  81. add(fx,nn);add(nn,fx);
  82. add(fy,nn);add(nn,fy);
  83. fa[nn]=nn;fa[fx]=nn;fa[fy]=nn;
  84. if(++tot==n-)break;
  85. }
  86. }
  87. dfs(nn);dfs_(nn);
  88. scanf("%d",&qx);
  89. for(int i=;i<=qx;i++){
  90. int x,y;
  91. scanf("%d%d",&x,&y);
  92. if(f(x)!=f(y))printf("-1\n");
  93. else printf("%d\n",lca(x,y));
  94. }
  95. fclose(stdin);fclose(stdout);
  96. return ;
  97. }

AC

树链剖分

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define inf 100000000
  6. #define maxn 10009
  7. using namespace std;
  8.  
  9. int n,m,q,sumedge,cnt,tot,qx;
  10. int head[maxn],dad[maxn],deep[maxn],size[maxn],fe[maxn];
  11. int w[maxn],top[maxn],re[maxn],tpos[maxn],fa[maxn];
  12. struct E{
  13. int x,y,z;
  14. }e[maxn*];
  15. struct Tree{
  16. int l,r,mn;
  17. }tr[maxn<<];
  18.  
  19. struct Edge{
  20. int x,y,z,nxt;
  21. Edge(int x=,int y=,int z=,int nxt=):
  22. x(x),y(y),z(z),nxt(nxt){}
  23. }edge[maxn<<];
  24.  
  25. void add(int x,int y,int z){
  26. edge[++sumedge]=Edge(x,y,z,head[x]);
  27. head[x]=sumedge;
  28. }
  29.  
  30. bool cmp(E a,E b){
  31. return a.z<b.z;
  32. }
  33.  
  34. int f(int x){
  35. return fa[x]==x?x:fa[x]=f(fa[x]);
  36. }
  37.  
  38. void dfs(int x){
  39. size[x]=;deep[x]=deep[dad[x]]+;
  40. for(int i=head[x];i;i=edge[i].nxt){
  41. int v=edge[i].y;
  42. if(v==dad[x])continue;
  43. dad[v]=x;
  44. dfs(v);
  45. size[x]+=size[v];
  46. }
  47. }
  48.  
  49. void dfs_(int x,int v){
  50. int s=,t=;tpos[x]=++cnt;re[cnt]=x;fe[x]=v;
  51. if(!top[x])top[x]=x;
  52. for(int i=head[x];i;i=edge[i].nxt){
  53. int v=edge[i].y;
  54. if(v!=dad[x]&&size[v]>size[s])s=v,t=edge[i].z;
  55. }
  56. if(s){
  57. top[s]=top[x];
  58. dfs_(s,t);
  59. }
  60. for(int i=head[x];i;i=edge[i].nxt){
  61. int v=edge[i].y;
  62. if(v!=dad[x]&&v!=s)dfs_(v,edge[i].z);
  63. }
  64. }
  65.  
  66. int lca(int x,int y){
  67. for(;top[x]!=top[y];){
  68. if(deep[top[x]]>deep[top[y]])swap(x,y);
  69. y=dad[top[y]];
  70. }
  71. if(deep[x]>deep[y])return y;
  72. return x;
  73. }
  74.  
  75. void pushup(int rt){
  76. tr[rt].mn=min(tr[rt<<].mn,tr[rt<<|].mn);
  77. }
  78.  
  79. void build(int rt,int l,int r){
  80. tr[rt].l=l;tr[rt].r=r;
  81. if(l==r){
  82. tr[rt].mn=fe[re[l]];
  83. return ;
  84. }
  85. int mid=(l+r)>>;
  86. build(rt<<,l,mid);build(rt<<|,mid+,r);
  87. pushup(rt);
  88. }
  89.  
  90. int query(int rt,int l,int r,int ql,int qr){
  91. if(l>=ql&&r<=qr){
  92. return tr[rt].mn;
  93. }
  94. int ans=inf,mid=(l+r)>>;
  95. if(ql<=mid)ans=min(ans,query(rt<<,l,mid,ql,qr));
  96. if(qr>mid)ans=min(ans,query(rt<<|,mid+,r,ql,qr));
  97. return ans;
  98. }
  99.  
  100. int query_mn(int x,int y){
  101. int ret=inf;
  102. for(;top[x]!=top[y];){
  103. if(deep[top[x]]>deep[top[y]])swap(x,y);
  104. ret=min(ret,query(,,n,tpos[top[y]],tpos[y]));
  105. y=dad[top[y]];
  106. }
  107. if(deep[x]>deep[y])swap(x,y);
  108. ret=min(ret,query(,,n,tpos[x]+,tpos[y]));
  109. printf("%d\n",ret);
  110. }
  111.  
  112. int main(){
  113. scanf("%d%d",&n,&m);
  114. for(int i=;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
  115. for(int i=;i<=n;i++)fa[i]=i;
  116. sort(e+,e+m+,cmp);
  117. for(int i=m;i>=;i--){
  118. int x=e[i].x,y=e[i].y;
  119. int fx=f(x),fy=f(y);
  120. if(fx!=fy){
  121. fa[fx]=fy;tot++;
  122. add(x,y,e[i].z);
  123. add(y,x,e[i].z);
  124. if(tot==n-) break;
  125. }
  126. }
  127. for(int i=;i<=n;i++){
  128. if(size[i]==){
  129. dfs(i);dfs_(i,);
  130. }
  131. }
  132. build(,,n);
  133. scanf("%d",&qx);
  134. for(int i=;i<=qx;i++){
  135. int x,y;
  136. scanf("%d%d",&x,&y);
  137. if(f(x)!=f(y))printf("-1\n");
  138. else
  139. query_mn(x,y);
  140. }
  141. return ;
  142. }

AC

NOIP2013DAY1题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 基于jQuery和Bootstrap的手风琴垂直菜单

    在线演示 本地下载

  2. MySQL数据库表分区功能详解

    1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...

  3. Asp.net Core, 基于 claims 实现权限验证 - 引导篇

    什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://w ...

  4. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  5. 文件(2)--IO流

    IO流 输入流和输出流 Java中的IO流根据功能划分为:输入流和输出流.输入流:用于读取数据.输出流:用于写出数据.输入输出的参照方向是根据我们的程序的. 字节流和字符流 Java中的IO流根据处理 ...

  6. SPFA算法 - Bellman-ford算法的进一步优化

    2017-07-27  22:18:11 writer:pprp SPFA算法实质与Bellman-Ford算法的实质一样,每次都要去更新最短路径的估计值. 优化:只有那些在前一遍松弛中改变了距离点的 ...

  7. Service的理解

    转自 原文 Service的理解 Service是什么?Service是一种可以在后台运行相关任务的组件.没有界面.其存在的线程是主线程,一般会通过启动子线程来执行耗时操作.Service有什么用?可 ...

  8. Java通过JDBC操作Hive

    http://www.cnblogs.com/netbloomy/p/6688670.html 0.概述 使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询.更新等操作.然而Hiv ...

  9. 转 : Java的版本特性与历史

    Java Versions, Features and History This article gives you a highlight of important features added i ...

  10. Linux 设备驱动之 UIO 机制

    一个设备驱动的主要任务有两个: 1. 存取设备的内存 2. 处理设备产生的中断 对于第一个任务.UIO 核心实现了mmap()能够处理物理内存(physical memory),逻辑内存(logica ...