https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=33%2C83


T1:玩具谜题

题解:

沙茶模拟

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=1e5+5,INF=1e9+5;
typedef long long ll;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m,a,s;
struct toy{int d;char s[15];
}t[N];
int main(){n=read();m=read();    for(int i=0;i<n;i++){t[i].d=read();scanf("%s",t[i].s);}int now=0;while(m--){ //printf("now %d\n",now);a=read();s=read();if(t[now].d==0){if(a==0) now=(now-s+n)%n;else now=(now+s)%n;}else{if(a==0) now=(now+s)%n;else now=(now-s+n)%n;}}printf("%s",t[now].s);return 0;
}

mengbier


T2:天天爱跑步

题解:

现在基本上能想出思路,但是写了三节课...............

对于一个点j,能被他观察到的也就是他的子树中 ds-dj=wj或者dt-dj=len(s,t)-wj

就是 ds=dj+wj或dt-len(s,t)=dj-wj

只有j是改变的,然后只要找每个点的子树中满足那两个条件的端点个数就可以了

统计个数直接开个权值数组,遇到s或t就加,遇到lca就减(之外的节点不可能被这个lca的s和t贡献了)

对于一条路线,在S和T分别打两个tag,并在lca处回收tag

因为一个节点会被多次,所以每个节点u开一个链表,保存有那些s是u,那些t是u,那些lca是u

但是这样lca(s,t)这个点就不会受到s或t的贡献了(加了后又回收了),所以把s或t的回收放在fa[lca]就可以了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=3e5+5,M=3e5+5,INF=1e9+5,B=3e5+2;
typedef long long ll;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n,m,u,v,w[N],s,t;
struct edge{int v,ne;
}e[M<<1];
int cnt,h[N];
inline void ins(int u,int v){cnt++;e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
struct thing{int w,ne;
}e1[N],e2[N],e3[N],e4[N];
int cnt1,cnt2,cnt3,cnt4,h1[N],h2[N],h3[N],h4[N];
inline void ins1(int u,int v,int w){cnt1++;e1[cnt1].w=w;e1[cnt1].ne=h1[u];h1[u]=cnt1;cnt3++;e3[cnt3].w=w;e3[cnt3].ne=h3[v];h3[v]=cnt3;
}
inline void ins2(int u,int v,int w){cnt2++;e2[cnt2].w=w;e2[cnt2].ne=h2[u];h2[u]=cnt2;cnt4++;e4[cnt4].w=w;e4[cnt4].ne=h4[v];h4[v]=cnt4;
}
int vis[N],deep[N],fa[N][21];
void dfs(int u){vis[u]=1;for(int j=1;j<=20;j++)fa[u][j]=fa[fa[u][j-1]][j-1];for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(vis[v]) continue;fa[v][0]=u;deep[v]=deep[u]+1;dfs(v);    }
}
int lca(int x,int y){if(deep[x]<deep[y]) swap(x,y);int bin=deep[x]-deep[y];for(int i=0;i<=20;i++) if((1<<i)&bin) x=fa[x][i];for(int i=20;i>=0;i--)if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}if(x==y) return x;else return fa[x][0];
}
int c1[N<<1],c2[N<<1];
int ans[N];
void dfsSol(int u,int fa){int p1=w[u]+deep[u],p2=deep[u]-w[u]+B;ans[u]-=c1[p1]+c2[p2];for(int i=h[u];i;i=e[i].ne) if(e[i].v!=fa) dfsSol(e[i].v,u);for(int i=h1[u];i;i=e1[i].ne) c1[e1[i].w]++;for(int i=h3[u];i;i=e3[i].ne) c1[e3[i].w]--;for(int i=h2[u];i;i=e2[i].ne) c2[e2[i].w]++;for(int i=h4[u];i;i=e4[i].ne) c2[e4[i].w]--;ans[u]+=c1[p1]+c2[p2];
}
int main(){freopen("in.txt","r",stdin);n=read();m=read();for(int i=1;i<=n-1;i++) u=read(),v=read(),ins(u,v);for(int i=1;i<=n;i++) w[i]=read();dfs(1);for(int i=1;i<=m;i++){s=read();t=read();int a=lca(s,t),len=deep[s]+deep[t]-deep[a]-deep[a];ins1(s,fa[a][0],deep[s]);ins2(t,a,deep[t]-len+B);//printf("lca %d %d %d %d %d\n",i,s,t,a,len);
    }dfsSol(1,0);for(int i=1;i<n;i++) printf("%d ",ans[i]);printf("%d",ans[n]);
}

天天是谁


T3:换教室

题解:

真的是道好水的DP:f[i][j][0/1]表示到了时间段i申请了j次,转移看这次和上次申请成不成功行了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int NN=2005,N=305;
const double INF=1e9+5;
typedef long long ll;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int tn,tm,n,m,c[NN],d[NN],g[N][N],u,v,w;
double k[NN];
void floyd(){for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}double f[NN][NN][2];
void dp(){for(int i=1;i<=tn;i++)for(int j=0;j<=tm;j++) f[i][j][0]=f[i][j][1]=INF;f[0][0][0]=0;for(int i=1;i<=tn;i++)for(int j=0;j<=tm;j++){//printf("hi %d %d %.2f %.2f\n",i,j,f[i][j][0],f[i][j][1]);f[i][j][0]=min(f[i-1][j][0]+g[c[i-1]][c[i]],f[i-1][j][1]+g[d[i-1]][c[i]]*k[i-1]+g[c[i-1]][c[i]]*(1-k[i-1]));if(j>0) f[i][j][1]=f[i-1][j-1][0]+g[c[i-1]][d[i]]*k[i]+g[c[i-1]][c[i]]*(1-k[i]);if(j>1) f[i][j][1]=min(f[i][j][1],f[i-1][j-1][1]+k[i-1]*(g[d[i-1]][d[i]]*k[i]+g[d[i-1]][c[i]]*(1-k[i]))+(1-k[i-1])*(g[c[i-1]][d[i]]*k[i]+g[c[i-1]][c[i]]*(1-k[i])));}double ans=INF;for(int j=0;j<=tm;j++) ans=min(ans,min(f[tn][j][0],f[tn][j][1])); printf("%.2f",ans);
}
int main(){//freopen("in.txt","r",stdin);tn=read();tm=read();n=read();m=read();for(int i=1;i<=tn;i++) c[i]=read();for(int i=1;i<=tn;i++) d[i]=read();for(int i=1;i<=tn;i++) scanf("%lf",&k[i]);for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) g[i][j]=g[j][i]=INF;for(int i=1;i<=m;i++){u=read();v=read();w=read();if(u!=v) g[u][v]=g[v][u]=min(g[u][v],w);}floyd();dp();
}

啦啦啦期望

NOIP2016DAY1题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

  10. 第五届合肥工业大学宣城校区程序设计大赛题解

    问题 A: 小问题 时间限制: 1 Sec  内存限制: 128 MB  Special Judge 题目描述 林喵喵特别喜欢解决女孩子们提出的问题. 于是, 有一天殷老师问了林喵喵一个小问题. 给出 ...

最新文章

  1. 利用存储过程来实现分页性能比较
  2. win10 输入法不见了、繁体 问题解决
  3. ASM_PREFERRED_READ_FAILURE_GROUPS
  4. shell获取git最近一次提交信息_Git修改commit提交信息
  5. 吴恩达机器学习 -- 多变量线性回归
  6. php java 单点登录_php实现多站点共用session实现单点登录的方法详解
  7. 生成验证码图片的Java代码
  8. LeetCode 第 32 场双周赛(983/2957,前33.2%)
  9. idea代码回滚_IDEA远程仓库版本回滚
  10. linux下ffmpeg的使用方法
  11. 机器学习算法(1)——贝叶斯估计与极大似然估计与EM算法之间的联系
  12. Django主从数据库分离配置
  13. Python实现查询12306火车票信息
  14. 华为云ModelArts 3.0助力行业AI高效落地
  15. “Chart“ 图表控件基本操作
  16. 设备划分冲突域和广播域
  17. 论文阅读笔记 | Transformer系列——Focal Transformer
  18. Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
  19. pytoch矩阵乘法torch.bmm
  20. SANGFOR SCSA——linux系统基础

热门文章

  1. Linux-软件包管理-rpm命令管理-安装-卸载
  2. 再学 GDI+[65]: 路径画刷(5) - SetGammaCorrection
  3. android动画 底部弹窗 效果
  4. Eclipse安装Tomcat插件全攻略
  5. 应邀参加51CTO专家座谈门诊——驱动开发技术探析【2008.11.20在线】
  6. 信用卡是超前消费的一种手段
  7. ipv4反向路由配置
  8. Android 多媒体开发学习之撕衣服
  9. Android下最简单的Camera应用APP
  10. android bionic memcpy 汇编源码解析