目录

  • 2018.11.2 正睿停课训练 Day15

    • A 郁闷的小G(二分)
    • B 小G的树(树形DP)
    • C 数的距离(思路)
    • 考试代码
      • B
      • C


2018.11.2 正睿停课训练 Day15

时间:3.5h
期望得分:100+20+20
实际得分:100+20+0

比赛链接

A 郁闷的小G(二分)

题目链接

//二分。
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
typedef long long LL;inline LL read()
{LL now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline bool Check(LL x,LL a,LL b,LL c,LL d,LL e)
{if(a<x) b-=x-a;if(e<x) d-=x-e;if(b<0||d<0) return 0;LL tmp=b+d;if(c<x) c+=tmp;return c>=x;
}int main()
{LL a=read(),b=read(),c=read(),d=read(),e=read();LL l=0,r=2e18,mid,ans=0;while(l<=r)if(Check(mid=l+r>>1,a,b,c,d,e)) ans=mid,l=mid+1;else r=mid-1;printf("%lld\n",ans);return 0;
}/*
2 2 1 2 2
100 100 100 0 0
*/

B 小G的树(树形DP)

题目链接

求树的直径需要用到子树最长链与子树内的最大直径,都存下来就好了。
\(f[i][j][k]\)表示当前为点\(i\),\(i\)子树最长链长度为\(j\),\(i\)子树内最大直径为\(k\),的概率(直径不一定过点\(i\))。
转移\(O(n^4)\)就行了。
概率\(\frac 12\)可以最后乘,也就是两种可能的概率都算做\(1\)。同时存的数不会超过\(2^{60}\),所以可以用longlong。
最后乘\(\frac{1}{2^{n-1}}\),因为每条边的概率都乘了\(2\)。

//0ms   1080kb
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=62;int Enum,H[N],nxt[N<<1],to[N<<1],D[N];
LL f[N][N<<1][N<<1];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void AE(int u,int v)
{to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void Merge(int x,int v,int d1,int d2,int d3,int d4)
{static LL g[N<<1][N<<1];LL (*fx)[N<<1]=f[x],(*fv)[N<<1]=f[v];LL tmp,tmp2;for(int a=0; a<=d1; ++a)for(int b=a; b<=d2; ++b)if((tmp=fx[a][b]))for(int c=0; c<=d3; ++c)for(int d=c; d<=d4; ++d){if(!fv[c][d]) continue;tmp2=tmp*fv[c][d];g[std::max(a,c+1)][std::max(std::max(b,d),a+c+1)]+=tmp2,g[std::max(a,c+2)][std::max(std::max(b,d),a+c+2)]+=tmp2;}int l1=std::max(d1,d3+2),l2=std::max(std::max(d2,d4),d1+d3+2);for(int i=0; i<=l1; ++i)for(int j=i; j<=l2; ++j) fx[i][j]=g[i][j], g[i][j]=0;
}
int DFS(int x,int fa)
{int mxd=0,dia=0; f[x][0][0]=1;for(int i=H[x],v,d; i; i=nxt[i])if((v=to[i])!=fa){d=DFS(v,x), Merge(x,v,mxd,dia,d,D[v]);dia=std::max(dia,std::max(D[v],mxd+d)), mxd=std::max(mxd,d);}return D[x]=dia, mxd+2;
}int main()
{int n=read();for(int i=1; i<n; ++i) AE(read(),read());int d=DFS(1,1);double ans=0;for(int i=0; i<=d; ++i)for(int j=i; j<=D[1]; ++j) ans+=1.0*f[1][i][j]*j;printf("%.10lf\n",ans/(1ll<<n-1));return 0;
}

C 数的距离(思路)

题目链接

原题:HDU5812。

对于\(dis(x,y)\),把\(x,y\)质因数分解后(令\(x=\prod_{i=1}^k p_i^{a_i},y=\prod_{i=1}^k p_i^{b_i}\)),则\(dis(x,y)=\sum_{i=1}^k |a_i-b_i|\)。
实际上我们可以去掉\(x,y\)公共的部分,即令\(f(x)=x的质因子个数\),则\(dis(x,y)=f(\frac{x}{\gcd(x,y)})+f(\frac{y}{\gcd(x,y)})\)。
\(f\)可以线性筛预处理,即\(f(\frac{x}{\gcd(x,y)})\)可以直接得到。然后我们可以枚举\(x\)的约数\(d\)作为\(\gcd(x,y)\),然后求\(\min\{f(\frac yd)\}(y在集合中)\)。

不妨在插入\(y\)时,也枚举\(y\)的每个约数\(d\),然后更新\(g(d)=\min\{g(d),f(\frac yd)\}\)。\(g(d)\)表示\(f(\frac yd)(y在集合中)\)的最小值。
这样就可以\(O(1)\)求\(\min\{f(\frac yd)\}\)了。

但是还有删除操作,我们需要维护\(g(d)\)的最小值。
注意到\(f(x)\)不会超过\(20\),且我们只关心\(f(\frac yd)\)的大小,所以可以用\(cnt[d][t]\)表示\(g(d)\)中满足\(g(d)=t\)的\(y\)的个数,用一个二进制数\(s[d]\)表示\(g(d)\)中每个值的存在性。这样就可以\(O(1)\)更新\(g(d)\),并在查询时直接用位运算找到最小的\(g(d)\)。
(事实上用不到\(f\)数组,因为只需要在枚举约数的时候算下个数就行了)

质因数种类是最多\(7\)个,但不代表就是\(2,3,5,7,11,13,17\)这些啊。。
可以处理出每个数的一个质因数\(p\),\(n\)每次直接除\(p[n]\),就不用枚举质数了。

另外看到这个就想到\(k\)维曼哈顿距离。。最大好像能做吧(就是复杂度有点大),求最小距离是不是不能做啊。。

//646ms 87836kb
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=1e6+3,INF=1e9;//P[7]={2,3,5,7,11,13,17};int Opt,Ans,A[7],P[7],p[N],cnt[N][20],s[N];//A[N][7],P[N][7] //卡我内存还行
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
void Init(const int n)
{static int P[N>>3];static bool not_P[N];for(int cnt=0,i=2; i<=n; ++i){if(!not_P[i]) P[++cnt]=i, p[i]=i;for(int j=1,v; j<=cnt&&(v=i*P[j])<=n; ++j){not_P[v]=1, p[v]=P[j];if(!(i%P[j])) break;}}
}
int Div(int x)
{int lim=-1,cnt;while(x!=1){P[++lim]=p[x], cnt=0;while(!(x%P[lim])) ++cnt, x/=P[lim];A[lim]=cnt;}return lim;
}
void DFS(int x,int sum,int d)
{if(x==-1){switch(Opt){case 0: if(++cnt[d][sum]==1) s[d]^=1<<sum; break;case 1: if(--cnt[d][sum]==0) s[d]^=1<<sum; break;case 2: if(s[d]) Ans=std::min(Ans,sum+__builtin_ctz(s[d])); break;}return;}for(int i=0; i<=A[x]; ++i)DFS(x-1,sum+A[x]-i,d), d*=P[x];
}int main()
{Init(1000000);for(int x,tot=0,Q=read(); Q--; ){Opt=read()-1, x=read();if(Opt==2)if(tot) Ans=INF;else {puts("-1"); continue;}else if(cnt[x][0]^Opt) continue;DFS(Div(x),0,1);switch(Opt){case 0: ++tot; break;case 1: --tot; break;case 2: printf("%d\n",Ans==INF?-1:Ans); break;}}return 0;
}

考试代码

B

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define eps 1e-10
typedef long long LL;
const int N=64;int n,Enum,H[N],nxt[N<<1],to[N<<1],dgr[N];
double f[N][N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void AE(int u,int v)
{++dgr[v], to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;++dgr[u], to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
int DFS(int x,int fa)
{if(dgr[x]==1&&x!=fa)for(int i=0; i<=2*n; ++i) f[x][i]=1;for(int i=H[x],v; i; i=nxt[i])if((v=to[i])!=fa){DFS(v,x);for(int d=1; d<=2*n; ++d){if(f[x][d]<eps) f[x][d]=1;f[x][d]*=(f[v][d-1]*0.5+(d>1?f[v][d-2]*0.5:0));}}for(int i=0; i<=2*n; ++i) printf("f[%d][%d]=%.5lf\n",x,i,f[x][i]);
}int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);n=read();for(int i=1; i<n; ++i) AE(read(),read());double ans=0; int cnt=0;for(int x=1; x<=n; ++x){if(dgr[x]>1) continue;++cnt;for(int i=1; i<=n; ++i){f[i][0]=0;for(int j=1; j<=2*n; j+=4) f[i][j]=f[i][j+1]=f[i][j+2]=f[i][j+3]=0;f[i][2*n-2]=f[i][2*n-1]=f[i][2*n]=0;}printf("\nnow:%d\n",x);DFS(x,x);for(int i=1; i<=2*n; ++i) ans+=(f[x][i]-f[x][i-1])*i, printf("ans+=%.5lf*%d=%.5lf\n",f[x][i]-f[x][i-1],i,(f[x][i]-f[x][i-1])*i);}printf("%.10lf\n",ans);printf("%.10lf\n",ans/cnt);return 0;
}/*
5
1 2 2 3 3 4 4 5
4
1 2 1 3 1 4
7
1 2 2 3 3 4 3 5 4 6 4 7
*/

C

#include <set>
#include <queue>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e6+5,P[7]={2,3,5,7,11,13,17};//7int A[N][7],L[N],R[N];
bool vis[N],ins[N];
std::multiset<int> st[130];
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void Div(int x)
{vis[x]=1;for(int s=x,i=0; i<7; ++i)if(!(x%P[i])){int cnt=1; x/=P[i];while(!(x%P[i])) ++cnt, x/=P[i];A[s][i]=cnt;}
}int main()
{
//  freopen("ex_number1.in","r",stdin);
//  freopen(".out","w",stdout);int Q=read(); const int all=1<<7;
//  for(int s=0; s<all; ++s) st[s].insert(-1),st[s].insert(100000000);for(int x,tot=0,ed=0; Q--; ){switch(read()){case 1:{if(ins[x=read()]) break;ins[x]=1, ++tot;if(!vis[x]) Div(x);R[ed]=x, L[x]=ed, ed=x;break;}case 2:{if(!ins[x=read()]) break;ins[x]=0, --tot;L[R[x]]=L[x], R[L[x]]=R[x];if(x==ed) ed=L[x];break;}case 3: {x=read();if(!tot) {puts("-1"); break;}if(!vis[x]) Div(x);int *a=A[x],ans=1e9;for(int i=R[0]; ; i=R[i]){int sum=0;for(int j=0; j<7; ++j) sum+=std::abs(a[j]-A[i][j]);ans=std::min(ans,sum);if(i==ed) break;}printf("%d\n",ans);break;}}}
//  return 0;for(int x,tot=0,ed=0; Q--; ){switch(read()){case 1:{if(ins[x=read()]) break;ins[x]=1, ++tot;if(!vis[x]) Div(x);int *a=A[x];printf("A[%d]: ",x); for(int i=0; i<7; ++i) printf("%d ",a[i]); puts("");for(int s=0; s<all; ++s){int sum=0;for(int i=0; i<7; ++i)sum+=(s>>i&1?a[i]:-a[i]);st[s].insert(sum);printf("Insert(%d,%d)\n",s,sum);}break;}case 2:{if(!ins[x=read()]) break;ins[x]=0, --tot;int *a=A[x];for(int s=0; s<all; ++s){int sum=0;for(int i=0; i<7; ++i)sum+=(s>>i&1?a[i]:-a[i]);
//                  printf("Delete(%d)\n",sum);st[s].erase(st[s].find(sum));}break;}case 3: {x=read();if(!tot) {puts("-1"); break;}if(!vis[x]) Div(x);int *a=A[x],ans=0;printf("A[%d]: ",x); for(int i=0; i<7; ++i) printf("%d ",a[i]); puts("");for(int s=0; s<all; ++s){int sum=0;for(int i=0; i<7; ++i)sum+=(s>>i&1?a[i]:-a[i]);
//                  std::multiset<int>::iterator it=st[s].upper_bound(sum);ans=std::max(ans,std::max(*st[s].rbegin()-sum,sum-*st[s].begin()));printf("s:%d sum:%d big:%d ",s,sum,*st[s].rbegin());printf("small:%d\n",*st[s].begin());
//                  ans=std::min(ans,*it-sum);
//                  printf("s:%d sum:%d big:%d ",s,sum,*it);
//                  ans=std::min(ans,sum-*(--it));
//                  printf("small:%d\n",*it);}printf("%d\n",ans);break;}}}return 0;
}/*
12
3
1 20
1 15
3 30
1 30
3 30
2 10
3 27
1 15
2 15
2 20
2 30
3 5
*/

转载于:https://www.cnblogs.com/SovietPower/p/9900210.html

11.2 正睿停课训练 Day15相关推荐

  1. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  2. 2019金华正睿集训总结

    emmm-蒟蒻第一次出来集训,也是2019年noip(现在应该叫csp的说)前最后一次外出集训- 感觉压力好大啊-毕竟才学了不到一年啊- 但不管怎样,接下来几天要好好加油啊! DAY1 仅自己用的链接 ...

  3. 省选模拟赛(正睿的最后一场)

    省选模拟赛(正睿的最后一场!!) 比赛时间安排 与正解的差距 T1 比赛时间安排 7.30-7.40 t1 能拿10分dfs,n=0的情况或许可以找规律 t2 看不懂 t3 暴力挺好写的,求lca太麻 ...

  4. 8.8 正睿暑期集训营 Day5

    目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...

  5. 9.29 正睿提高6

    目录 2018.9.29 正睿提高6 A B C 考试代码 B C 2018.9.29 正睿提高6 时间:3.5h(实际) 期望得分:100+30+1 实际得分:100+20+0 比赛链接 T3想了一 ...

  6. 2021/9/12正睿10测Day.3

    半个小时左右大概看完了题,主要刚开始的时候吃了些东西. 这是第三次打正睿的十连,也是头一次在打正睿的十连遇到捆绑测试,对于我这种骗分狗来说首先心态上就很折磨,有些 subtask 只给了其中一两个量的 ...

  7. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  8. 8.6 正睿暑期集训营 Day3

    目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...

  9. 正睿多校联盟训练Week6

    并没有参加 Problem A.阿瓦分蛋糕输入文件: cake.in 输出文件: cake.out 时间限制: 1 second 空间限制: 512 megabytes 阿瓦为了庆祝自己自己成长为了一 ...

最新文章

  1. SVN迁移历史日志记录笔记
  2. Action Framework- Table PPFSFMLRU
  3. js的三元表达式用来替换表格中的颜色
  4. Linux下chkconfig命令介绍
  5. oraclejobs_Oracle Scheduler Jobs
  6. 浏览器 重定向次数限制_在浏览器输入URL到页面渲染的整个流程是如何的?都有哪些步骤?...
  7. oracle表修改语句怎么写,Oracle修改表结构语句
  8. oracle for aix 7,ORACLE 11.2.0.2 RAC for AIX 7.1
  9. android pdf阅读器推荐,Android最强PDF阅读器 十款软件大PK
  10. 关于vs2017如何配置和运行龙书DX9案例
  11. 电商与ERP集成方案
  12. 用android手机测量身高,教你如何使用小米手机测量自己的身高!
  13. 电子计算机硬件是由哪五个部分构成,计算机硬件系统由哪五个基本部分组成?...
  14. linux邮件客户端配置文件,在Deepin V20下配置Evolution邮件客户端,添加新邮箱全过程...
  15. Qt编写水波进度条控件
  16. 数据库作业——汽车租赁系统
  17. **xxchat系统之线程池实时监控方案(Jmx远程后台监控、暂停、启用)
  18. TCP应用层主要协议
  19. USB之Cyusb3014开发经验总结 (十八)2022-04-17
  20. led数码显示控制plc实验_实验三LED数码显示控制PLC实验报告.doc

热门文章

  1. Cocos2d-x编程中的runOnUiThread方法和runOnGLThread方法剖析
  2. php判断直线相交,zoj 1158 判断2线段完全相交
  3. Win7系统删除微软拼音
  4. 关于Nginx的一些优化(突破十万并发)。
  5. mysql数据库调优知识复习
  6. 用T-SQL修改数据库的恢复模型
  7. 2018-05-16树莓派如何开启UART串口
  8. 如何使用GDAL重采样图像
  9. C# WPD PortableDeviceApiLib获取便携设备列表
  10. 小程序开发之各种弹出框选择框汇总