NOIP模拟赛8
今天又爆零啦。。。
T1
题目描述
#define goodcatdog gcd
#define important i
#define judge j
神说 每个梦想就是一轮月亮,高高地孤寂地挂在清冷的夜空。为了让月亮不再孤独,灯神给她找了好多好多伴儿。现在天空上就有n轮月亮啦!
月亮在天上跟相邻的伙伴玩够以后,就开始想要去找其他月亮玩,灯神为了让月亮变得更聪明,下了一个规定:若两个月亮编号分别为important和judge,若important ,judge满足goodcatdog(important,judge)>β,则important,judge就可以联通。
现在来了一个垃圾神叫J乌拉,他想知道编号为x的月亮和编号为y的月亮是否联通,聪明的你能帮帮它吗????
输入描述
第一行为一个数T,表明有T组测试数据
四个个数n,β,x,y;
输出描述
若x,y联通,输出YeS,否则输出No
样例输入
1
12 2 8 9
样例输出
YeS
并查集,考场上写双向宽搜算错空间,然后炸了,哈哈哈
AC代码丢了。。
T2 [USACO12FEB]附近的牛Nearby Cows
https://www.luogu.org/problem/show?pid=3047
树形DP
dfs只需要预处理子树
然后对于每个点,一路向上至根节点
父节点扩展k=父节点子树扩展k-子节点子树扩展k-1
所以只管子树即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #define N 100001 using namespace std; int n,m; int front[N],to[N<<1],nxt[N<<1],tot,from[N<<1]; int dp[N][21],fa[N]; void add(int u,int v) { to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; } void dfs(int x,int f) { fa[x]=f; for(int i=front[x];i;i=nxt[i]) if(to[i]!=f) { dfs(to[i],x); for(int j=1;j<=m;j++) dp[x][j]+=dp[to[i]][j-1]; } } void cal(int now) { int ans=dp[now][m]; int k=m-1; while(k>=0 && fa[now]) { ans+=dp[fa[now]][k]; if(k) ans-=dp[now][k-1]; k--;now=fa[now]; } printf("%d\n",ans); } int main() { //freopen("young.in","r",stdin); //freopen("young.out","w",stdout); scanf("%d%d",&n,&m); int u,v; for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v); for(int i=1;i<=n;i++) scanf("%d",&dp[i][0]); dfs(1,0); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]+=dp[i][j-1]; for(int i=1;i<=n;i++) cal(i); }
T3 [POI2007]天然气管道Gaz
http://www.lydsy.com/JudgeOnline/problem.php?id=1108
只能往南和往东
所以在有解的前提下,怎么连都一个样
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> using namespace std; int main() { int n,x,y; long long ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); ans-=x; ans+=y; } for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); ans+=x; ans-=y; } printf("%lld",ans); }