D1T1:把方向和朝向异或一下,在mod n意义下+1s或-1s。

  1. #include<cstdio>
  2. const int N=1e5+5;
  3. int n,m,j,k,v,s[N];
  4. char t[N][11];
  5. int main(){
  6. scanf("%d%d",&n,&m);
  7. for(int i=0;i<n;++i)
  8. scanf("%d%s",s+i,t[i]);
  9. while(m--){
  10. scanf("%d%d",&j,&k);
  11. (v+=j^s[v]?k:n-k)%=n;
  12. }
  13. puts(t[v]);
  14. }

D1T2:设i的深度为d[i],点i的答案是满足s[j]在其子树中,d[s[j]]==d[i]+w[i],且lca[j]在其子树外或等于i的j的个数,加上t[j]在其子树中,d[lca[j]]*2-d[s[j]]==d[i]-w[i],且lca[j]在其子树外(s[j]在子树外)的j的个数。考虑差分链,++a[s[i]],--a[lca[j]的父亲],++b[t[j]],--b[lca[j]],那么查询子树中对应的a的和和b的和就是答案。通过dfs序,转化为查询区间中等于一个数的数的权和,那么差分询问,设查询[l,r],答案就是r处的答案减去l-1处的答案。

  1. #include<cstdio>
  2. const int N=3e5+5;
  3. struct edge{
  4. int v;edge*s;
  5. }e[N*2];
  6. edge*o=e,*h[N];
  7. void ins(int u,int v){
  8. edge s={v,h[u]};
  9. *(h[u]=o++)=s;
  10. }
  11. typedef int arr[N];
  12. arr d,p,r,c,y,l,q,z[4];
  13. void dfs1(int u){
  14. r[u]=1;
  15. for(edge*i=h[u];i;i=i->s)
  16. if(i->v^p[u]){
  17. d[i->v]=d[p[i->v]=u]+1;
  18. dfs1(i->v);
  19. r[u]+=r[i->v];
  20. if(r[c[u]]<r[i->v])
  21. c[u]=i->v;
  22. }
  23. }
  24. void dfs2(int u,int f){
  25. static int n2;
  26. l[u]=++n2,y[u]=f;
  27. if(c[u])dfs2(c[u],y[u]);
  28. for(edge*i=h[u];i;i=i->s)
  29. if(i->v^p[u]&&i->v^c[u])
  30. dfs2(i->v,i->v);
  31. }
  32. int lca(int s,int t){
  33. while(y[s]^y[t]){
  34. if(d[y[s]]<d[y[t]])
  35. s^=t,t^=s,s^=t;
  36. s=p[y[s]];
  37. }
  38. return d[s]<d[t]?s:t;
  39. }
  40. struct foo{
  41. int z,x,y;foo*s;
  42. }e2[N*4];
  43. foo*o2=e2,*h2[N],*h3[N];
  44. #define ins2(v,...){\
  45. foo e={__VA_ARGS__,v};\
  46. *(v=o2++)=e;\
  47. }
  48. struct bar{
  49. int x,y;bar*s;
  50. }e3[N*4];
  51. bar*o3=e3,*h4[N],*h5[N];
  52. #define ins3(v,...){\
  53. bar e={__VA_ARGS__,v};\
  54. *(v=o3++)=e;\
  55. }
  56. int n,m,s,t;
  57. int main(){
  58. scanf("%d%d",&n,&m);
  59. for(int i=1;i<n;++i){
  60. scanf("%d%d",&s,&t);
  61. ins(s,t),ins(t,s);
  62. }
  63. dfs1(1),dfs2(1,1);
  64. for(int i=1;i<=n;++i){
  65. scanf("%d",&s);
  66. int x=l[i]-1,y=x+r[i];
  67. ins2(h2[x],i,d[i]+s,-1);
  68. ins2(h2[y],i,d[i]+s,+1);
  69. ins2(h3[x],i,d[i]-s,-1);
  70. ins2(h3[y],i,d[i]-s,+1);
  71. }
  72. while(m--){
  73. scanf("%d%d",&s,&t);
  74. int i=lca(s,t),j=p[i];
  75. int x=d[s],y=d[i]*2-x;
  76. ins3(h4[l[s]],x,+1);
  77. ins3(h4[l[j]],x,-1);
  78. ins3(h5[l[t]],y,+1);
  79. ins3(h5[l[i]],y,-1);
  80. }
  81. for(int i=1;i<=n;++i){
  82. for(bar*j=h4[i];j;j=j->s)
  83. z[0][j->x]+=j->y;
  84. for(bar*j=h5[i];j;j=j->s)
  85. z[3][j->x]+=j->y;
  86. for(foo*j=h2[i];j;j=j->s)
  87. q[j->z]+=z[0][j->x]*j->y;
  88. for(foo*j=h3[i];j;j=j->s)
  89. q[j->z]+=z[3][j->x]*j->y;
  90. }
  91. for(int i=1;i<=n;++i)
  92. printf("%d ",q[i]);
  93. }

D1T3:设f[i][j][2]表示前i节课,申请了j次,第i节课有没有申请的期望。floyd预处理两点间最短路。讨论所有情况,按概率加权直接转移。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using std::min;
  5. const int N=2005;
  6. int n,m,v,e,a,b,w;
  7. int c[N],d[N],z[305][305];
  8. double p[N],f[N][N][2];
  9. template<class T>
  10. void eq1(T&a,T b){a=b<a?b:a;}
  11. int main(){
  12. scanf("%d%d%d%d",&n,&m,&v,&e);
  13. for(int i=1;i<=n;++i)
  14. scanf("%d",c+i);
  15. for(int i=1;i<=n;++i)
  16. scanf("%d",d+i);
  17. for(int i=1;i<=n;++i)
  18. scanf("%lf",p+i);
  19. memset(z,63,sizeof z);
  20. for(int i=1;i<=v;++i)
  21. z[i][i]=0;
  22. while(e--){
  23. scanf("%d%d%d",&a,&b,&w);
  24. eq1(z[a][b],w);
  25. eq1(z[b][a],w);
  26. }
  27. for(int k=1;k<=v;++k)
  28. for(int i=1;i<=v;++i)
  29. for(int j=1;j<=v;++j)
  30. eq1(z[i][j],z[i][k]+z[k][j]);
  31. for(int i=1;i<=n;++i)
  32. for(int j=0;j<=m;++j)
  33. f[i][j][0]=f[i][j][1]=1e18;
  34. f[1][0][0]=f[1][1][1]=0;
  35. for(int i=2;i<=n;++i){
  36. f[i][0][0]=f[i-1][0][0]+z[c[i-1]][c[i]];
  37. for(int j=1;j<=i;++j){
  38. f[i][j][0]=min(f[i-1][j][0]+z[c[i-1]][c[i]],f[i-1][j][1]+z[c[i-1]][c[i]]*(1-p[i-1])+z[d[i-1]][c[i]]*p[i-1]);
  39. f[i][j][1]=min(f[i-1][j-1][0]+z[c[i-1]][c[i]]*(1-p[i])+z[c[i-1]][d[i]]*p[i],f[i-1][j-1][1]+z[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])+z[d[i-1]][c[i]]*p[i-1]*(1-p[i])+z[c[i-1]][d[i]]*(1-p[i-1])*p[i]+z[d[i-1]][d[i]]*p[i-1]*p[i]);
  40. }
  41. }
  42. double ans=1e18;
  43. for(int j=0;j<=m;++j)
  44. eq1(ans,min(f[n][j][0],f[n][j][1]));
  45. printf("%.2f\n",ans);
  46. }

D2T1:预处理$[\binom{i}{j}\equiv0\pmod{k}]$的二维前缀和。

  1. #include<cstdio>
  2. const int N=2005;
  3. int t,p,n,m;
  4. int c[N][N],s[N][N];
  5. int main(){
  6. scanf("%d%d",&t,&p);
  7. for(int i=0;i<N;++i){
  8. c[i][0]=1;
  9. for(int j=1;j<=i;++j)
  10. c[i][j]=(c[i-1][j]+c[i-1][j-1])%p;
  11. }
  12. for(int i=1;i<N;++i)
  13. for(int j=1;j<N;++j){
  14. s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
  15. if(j<=i)s[i][j]+=!c[i][j];
  16. }
  17. while(t--){
  18. scanf("%d%d",&n,&m);
  19. printf("%d\n",s[n][m]);
  20. }
  21. }

D2T2:先从大到小排序,若q=0,考虑每次把分成的两个数压进两个队列,那么压进去的数一定不大于上次压进对应队列的数。容易验证若q!=0仍然成立。

  1. #include<algorithm>
  2. #include<cstdio>
  3. #include<functional>
  4. using namespace std;
  5. const int M=7e6+5;
  6. int q1[M],q2[M],q3[M];
  7. int m,q,u,v,t;
  8. int a1,b1,a2,b2,a3,b3;
  9. inline int pop(){
  10. return a1!=b1&&(a2==b2||q1[a1]>=q2[a2])&&(a3==b3||q1[a1]>=q3[a3])?q1[a1++]:a2!=b2&&(a1==b1||q2[a2]>=q1[a1])&&(a3==b3||q2[a2]>=q3[a3])?q2[a2++]:q3[a3++];
  11. }
  12. int main(){
  13. scanf("%d%d%d%d%d%d",&b1,&m,&q,&u,&v,&t);
  14. for(int i=0;i<b1;++i)
  15. scanf("%d",q1+i);
  16. sort(q1,q1+b1,greater<int>());
  17. for(int i=1;i<=m;++i){
  18. int j=pop()+(i-1)*q;
  19. int k=1ll*j*u/v;
  20. q2[b2++]=max(k,j-k)-i*q;
  21. q3[b3++]=min(k,j-k)-i*q;
  22. if(i%t==0)
  23. printf(i==t?"%d":" %d",j);
  24. }
  25. puts("");
  26. for(int i=1;i<=b1+m;++i){
  27. int j=pop()+m*q;
  28. if(i%t==0)
  29. printf(i==t?"%d":" %d",j);
  30. }
  31. }

D2T3:先枚举两只猪,算出对应抛物线能打掉哪些猪。f[S]表示状态为S的最小步数,显然可以O(n^2)转移。考虑到每只猪都要打掉,因此只用考虑某一只没被打掉的猪和其他猪一起被打掉的情况,就可以O(n)转移了。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<utility>
  5. #define x first
  6. #define y second
  7. using std::pair;
  8. typedef double real;
  9. typedef pair<real,real>vec;
  10. const real eps=1e-8;
  11. int in(vec a,vec l){
  12. return fabs(l.x*a.x*a.x+l.y*a.x-a.y)<eps;
  13. }
  14. const int N=18;
  15. vec a[N];
  16. void eq1(int&a,int b){
  17. a=b<a?b:a;
  18. }
  19. int q,n,e[N][N],f[1<<N];
  20. int main(){
  21. scanf("%d",&q);
  22. while(q--){
  23. memset(e,0,sizeof e);
  24. scanf("%d%*d",&n);
  25. for(int i=0;i<n;++i)
  26. scanf("%lf%lf",&a[i].x,&a[i].y);
  27. for(int i=0;i<n;++i){
  28. e[i][i]=1<<i;
  29. for(int j=i+1;j<n;++j){
  30. vec s=a[i],t=a[j];
  31. real a1=s.x*s.x,b1=s.x,c1=s.y;
  32. real a2=t.x*t.x,b2=t.x,c2=t.y;
  33. real d=a1*b2-a2*b1;
  34. if(fabs(d)>eps){
  35. real x=(c1*b2-c2*b1)/d;
  36. if(x<-eps){
  37. vec l(x,(a1*c2-a2*c1)/d);
  38. for(int k=0;k<n;++k)
  39. e[i][j]|=in(a[k],l)<<k;
  40. }
  41. }
  42. }
  43. }
  44. for(int i=1;i<1<<n;++i)
  45. f[i]=n;
  46. for(int i=0;i<1<<n;++i){
  47. int j=__builtin_ctz(~i);
  48. for(int k=j;k<n;++k)
  49. eq1(f[i|e[j][k]],f[i]+1);
  50. }
  51. printf("%d\n",f[(1<<n)-1]);
  52. }
  53. }

NOIP2016题解的更多相关文章

  1. Noip2016题解&总结

    原文放在我的uoj博客上,既然新开了blog,那就移过来了 玩具谜题(toy) 送分题.没有什么好说的. 直接按照题目的要求模拟即可. 标准的noip式day1T1. #include<cstd ...

  2. [NOIP补坑计划]NOIP2016 题解&做题心得

    感觉16年好难啊QAQ,两天的T2T3是不是都放反了啊…… 场上预计得分:100+80+100+100+65+100=545(省一分数线280) ps:loj没有部分分,部分分见洛咕 题解: D1T1 ...

  3. noip2016题解汇总

    [uoj#260]玩具谜题 传送门 http://uoj.ac/problem/260 分析 模拟. int n,m; int dir[N]; char nam[N][L]; int a[M],s[M ...

  4. NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...

  5. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  6. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  7. 「NOIP2016」天天爱跑步 题解

    (声明:图片来源于网络) 「NOIP2016」天天爱跑步 题解 题目TP门 题目 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  8. noip2016十连测题解

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

  9. [题解]noip2016普及组题解和心得

    [前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内 ...

随机推荐

  1. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序

    物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...

  2. android 帧动画,补间动画,属性动画的简单总结

      帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果.其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建ani ...

  3. Android 急速发布项目到 JitPack

    转载请标明出处: http://www.cnblogs.com/zhaoyanjun/p/5942616.html 出自[赵彦军博客] 2016/10/09 前言:以前写过一篇 Android stu ...

  4. iOS网络2——NSURLSession使用详解

    原文在此 一.整体介绍 NSURLSession在2013年随着iOS7的发布一起面世,苹果对它的定位是作为NSURLConnection的替代者,然后逐步将NSURLConnection退出历史舞台 ...

  5. IDEA 中scala 程序运行时的错误:报错 test is already defined as object test

    解决办法:在 创建main文件夹和scala文件夹的时候,注意src与这两个文件夹不能同时设置为resources,否则就会产生报错,解决办法将src文件夹的resources取消,右键.

  6. Scala变量(三)

    变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间. 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中.因此,通过给变量分配不同的数据类型,你 ...

  7. SQL 语法总结

    学了一个月的java,开始有入门的感觉.这段时间接触到了java的JDBC, 发现学习这部分的内容还是要有SQL的基础,于是花费了几天时间学习了一下SQL语法,并将其总结于下. 选择数据 SELECT ...

  8. [已解决]Windows10 系统下HDMI 显示器 没有声音输出的奇怪问题

    今天想用一下显示器自带的喇叭,忽然发现声音输出选项里HDMI的声音设备没了.之前开始使用这台显示器的时是用过一段时间的. 百度了一番,没发现什么线索.后来去谷歌找到这么一段文字: I'm not su ...

  9. [原创]自己动手实现React-Native下拉框控件

    因项目需要,自己动手实现了一个下拉框组件,最近得空将控件独立出来开源上传到了Github和npm. Github地址(求Star 求Star 求Star 

  10. 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。

    安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...