10.2 正睿国庆集训测试1

目录

  • 2018.. Test

    • 总结
    • A 陈太阳与取模
    • B 陈太阳与路径(树形DP)
    • C 陈太阳与开关
    • 考试代码
      • B
      • C

2018.. Test

时间:3.5h
期望得分:100+50+20
实际得分:40+45+20

比赛链接

总结

感觉自己是个zz

A 陈太阳与取模

题目链接

\[\begin{aligned}c\%x&\equiv (c\%A)\%x\\c\%x&\equiv (c-\lfloor\frac ca\rfloor*a)\%x\\c\%x&\equiv c\%x-\lfloor\frac ca\rfloor*a\%x\\(\lfloor\frac ca\rfloor*a)\%x&\equiv 0\end{aligned}\]

即\(x\)应是\(\lfloor\frac ca\rfloor*a\)的约数。
\(c\in[l,r]\),如果\(\frac la=\frac ra\)那么\(x\)可以是\(\lfloor\frac ca\rfloor\times a\)的约数;
否则至少存在\(\lfloor\frac la\rfloor\times a\)和\((\lfloor\frac la\rfloor+1)\times a\),\(x\)只能是\(a\)的约数。
然后求约数个数就好了。。

//
#include <cmath>
#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;
}
void Div(LL x)
{
    LL ans=1;
//  for(int i=2,lim=sqrt(x); i<=lim; ++i)
    for(int i=2; 1ll*i*i<=x; ++i)
        if(!(x%i))
        {
            int cnt=1;
            while(!(x%i)) x/=i, ++cnt;
            ans*=cnt;
        }
    if(x!=1) ans<<=1ll;
    printf("%lld\n",ans);
}
void Work()
{
    LL L=read(),R=read(),A=read();
    if(A>R) return (void)puts("-1");
    L/A==R/A ? Div(L/A*A) : Div(A);
}

int main()
{
//  freopen("ex_modulo3.in","r",stdin);
    for(int T=read(); T--; Work());
    return 0;
}

B 陈太阳与路径(树形DP)

题目链接

因为随机树的高度是有保证的,Prufer序列生成的随机树最大深度的期望为\(O(sqrt n)\),平均深度为\(O(\log n)\)。
所以我们可以用两次复杂度为\(O(n*dep)\)的树形DP求出每个点的答案。这样空间复杂度也是\(O(n*dep)\)的。
DP数组的有用大小只与深度有关,可以用vector或者指针动态分配内存。另外以直径的中点为根深度就可以/2。
这样最终复杂度大概就是\(O(n\log n)\)。

另外可以用长链剖分做,对于每一条长链维护一个DP数组,第二遍DFS时只需要将非长链合并到长链上。
这样任何树都能做,复杂度\(O(n)\)。
——by dls

//
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 200000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=5e5+5;

int Enum,H[N],nxt[N<<1],to[N<<1],fa[N],pre[N],dis[N],dep[N];
int pool[30000000],*Now=pool,*F[N],*G[N];
LL ans[N];
char IN[MAXIN],*SS=IN,*TT=IN,OUT[6000000],*O=OUT;

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 print(LL x)
{
    if(x>9) print(x/10);
    *O++ = x%10+'0';
}
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;
}
int BFS(int s)
{
    static int q[N];
    int h=0,t=1;
    q[0]=s, dis[s]=pre[s]=0;
    while(h<t)
    {
        int x=q[h++];
        for(int i=H[x],v; i; i=nxt[i])
            if((v=to[i])!=pre[x])
                dis[v]=dis[x]+1, pre[v]=x, q[t++]=v;
    }
    return q[t];
}
void DFS0(int x)
{
    int tmp=0;
    for(int i=H[x],v; i; i=nxt[i])
        if((v=to[i])!=fa[x])
            fa[v]=x, DFS0(v), tmp=std::max(tmp,dep[v]+1);
    dep[x]=tmp;
    F[x]=Now, Now+=tmp+1, G[x]=Now, Now+=tmp+1;
}
void DFS1(int x)
{
    int *f=F[x]; LL res=0;
    for(int i=H[x],v; i; i=nxt[i])
        if((v=to[i])!=fa[x])
        {
            DFS1(v); int *fv=F[v];
            for(int j=0; j<=dep[v]; ++j)
                res+=1ll*f[j]*fv[j], f[j]+=fv[j];
        }
    for(int i=dep[x]; i; --i) f[i]=f[i-1];
    f[0]=1, ans[x]=res;
}
void DFS2(int x)
{
    int *g=G[x],*gf=G[fa[x]],*f=F[x],*ff=F[fa[x]];
    if(x!=1)
    {
        for(int i=1; i<=dep[x]; ++i)
        {
            g[i]=gf[i-1]+ff[i-1];
            if(i>=2) g[i]-=f[i-2];
            ans[x]+=1ll*g[i]*f[i];
        }
    }
    for(int i=H[x],v; i; i=nxt[i])
        if((v=to[i])!=fa[x]) DFS2(v);
}

int main()
{
//  freopen("ex_diameter3.in","r",stdin);
//  freopen("my.out","w",stdout);

    int n=read();
    for(int i=1; i<n; ++i) AE(read(),read());

    int s=BFS(1), rt=BFS(s), d=dis[rt]>>1;
    while(dis[rt]>d) rt=pre[rt];
    DFS0(rt), DFS1(rt), DFS2(rt);

    for(int i=1; i<n; ++i) print(ans[i]+1), *O++=' '; print(ans[n]+1);
    fwrite(OUT,O-OUT,1,stdout);

    return 0;
}

C 陈太阳与开关

题目链接

考试代码

B

为什么就是跑得比zzx慢。。(虽然一个分吧)

#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 200000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=5e5+5;

int Enum,H[N],nxt[N<<1],to[N<<1],dgr[N],f[N],numx[N],num[N],Maxd;
LL ans[N];
char IN[MAXIN],*SS=IN,*TT=IN,OUT[6000000],*O=OUT;

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 print(LL x)
{
    if(x>9) print(x/10);
    *O++ = x%10+'0';
}
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;
}
void DFS0(int x,int fa)
{
    int tmp=0;
    for(int i=H[x],v; i; i=nxt[i])
        if((v=to[i])!=fa)
            DFS0(v,x), tmp=std::max(tmp,f[v]);
    f[x]=tmp+1;
}
//void DFS1(int x,int fa)
//{
//  if(dgr[x]==1) {fi[x]=0, se[x]=N; return;}
//  int f=N,s=N;
//  for(int i=H[x],v; i; i=nxt[i])
//      if((v=to[i])!=fa)
//      {
//          DFS1(v,x);
//          if(fi[v]<f) s=f, f=fi[v], pos[x]=v;
//          else s=std::min(s,fi[v]);
//      }
//  ::f[x]=fi[x]=f+1, se[x]=s+1;
//}
//void DFS2(int x,int fa)
//{
//  for(int i=H[x],v; i; i=nxt[i])
//      if((v=to[i])!=fa)
//      {
//          if(pos[x]==v) f[v]=std::min(se[x]+1,f[v]);
//          else f[v]=std::min(fi[x]+1,f[v]);
//          DFS2(v,x);
//      }
//}
void DFS3(int x,int fa,int d,int dep)
{
    Maxd=std::max(Maxd,d);
    ++num[d], ++d;
    if(!--dep) return;
    for(int i=H[x]; i; i=nxt[i])
        if(to[i]!=fa) DFS3(to[i],x,d,dep);
}

int main()
{
    freopen("ex_diameter2.in","r",stdin);
    freopen("my.out","w",stdout);

    int n=read();
    for(int i=1; i<n; ++i) AE(read(),read());

    DFS0(1,1);
//  DFS1(1,1), DFS2(1,1);
//  for(int i=1; i<=n; ++i) printf("f[%d]=%d fi[%d]=%d se[%d]=%d\n",i,f[i],i,fi[i],i,se[i]);
    for(int x=1; x<=n; ++x)
        if(dgr[x]==1) ans[x]=1;
        else
        {
            LL res=1; int tmp=f[x]-1; Maxd=1;
            for(int i=H[x]; i; i=nxt[i])
            {
                DFS3(to[i],x,1,tmp);
                for(int j=1; j<=Maxd&&num[j]; ++j)
                    res+=1ll*numx[j]*num[j], numx[j]+=num[j], num[j]=0;
            }
            for(int i=1; i<=tmp; ++i) numx[i]=0;
            ans[x]=res;
        }
    for(int i=1; i<n; ++i) print(ans[i]), *O++=' '; print(ans[n]);
    fwrite(OUT,O-OUT,1,stdout);

    return 0;
}

C

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod 1000000007
typedef long long LL;
const int N=1e5+5;

int n,Enum,H[N],nxt[N<<1],to[N<<1];
bool mp[21][21],rev0[21],vis0[21];

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;
}
int DFS0(int x)
{
    int res=1; vis0[x]=1;
    for(int i=1; i<=n; ++i)
        if(!vis0[i] && (rev0[x]^rev0[i]^mp[x][i])) res+=DFS0(i);
    return res;
}
bool Check()
{
    memset(vis0,0,sizeof vis0);
    return DFS0(1)==n;
}
void Subtask1()
{
    memset(mp,0,sizeof mp);
    for(int x=1; x<=n; ++x)
        for(int i=H[x]; i; i=nxt[i]) mp[x][to[i]]=1;

    int ans=1,all=(1<<n)-1;
    for(int s=1; s<=all; ++s)
    {
        for(int i=0; i<n; ++i) if(s>>i&1) rev0[i+1]=1;
        ans+=Check();
        for(int i=0; i<n; ++i) if(s>>i&1) rev0[i+1]=0;
    }
    printf("%d\n",ans);
}
void Work()
{
    Enum=0, memset(H,0,sizeof H);

    n=read();
    for(int i=1; i<n; ++i) AE(read(),read());
    if(n<=20) {Subtask1(); return;}

}

int main()
{
//  freopen("ex_trigger1.in","r",stdin);
//  freopen(".out","w",stdout);

    for(int T=read(); T--; Work());
    return 0;
}

原文地址:https://www.cnblogs.com/SovietPower/p/9737888.html

时间: 2024-08-03 08:48:06

10.2 正睿国庆集训测试1的相关文章

正睿OI国庆DAY2:图论专题

正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力说做法是dfs 首先两个点一定在点双联通分量里 点双是简单环,只有两条,不存在 猜测其他情况存在三条 双联通分量分解 输出情况可以用dfs树判,讨论非树边覆盖情况 内包含 下面分叉连到上面 相交 输出点即可 BFS/例题 BFS树没有跳跃边 计数/动态规划有用吧 树上bfs序好像可以判断距离? 边权

【2016北京集训测试赛(八)】 crash的数列

Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多点数列套着来加速转移呢? 但是发现好像太多数列套起来是可以烦死人的...... 我们就采用嵌套两次吧,记原数列为A,第一层嵌套为B,第二层嵌套为C. 我们其实可以发现一些规律,对于Ci,它对应了B中i的个数:对于Bi,它对应了A中i的个数. 稍加处理即可,我们一边计算一边模拟数列的运算,同时可以计算

10个免费的跨浏览器测试工具推荐

10个免费的跨浏览器测试工具推荐 在多个平台上测试多种流利器不但是很困难的——它几乎不可能的,因为没有那些好的测试工具.今天我们为大家提供很多涉及到浏览器测试的选择,并且告诉你那些“顶级的浏览器测试工具”,你应该使用哪一个… 这前10名的免费跨浏览器测试工具没有特定的顺序,因为他们对于任何特定的设备都有同样有效.如果你手动去测试,可能既困难又耗费时间.因为你只能不断的安装更多的浏览器在你的设备上. 1.Browsera Browsera可以测试和报告在您的网站上的跨浏览器而已的差异和脚本错误.B

盘点前 10 名的免费跨浏览器测试工具

原文: http://www.oschina.net/news/53246/free-cross-browser-testing-tools 在多个平台上测试多种浏览器不但是很困难的 – 它几乎不可能的,因为没有那些好的测试工具.今天,我们就为大家提供很多涉及到跨浏览器测试的选择,并且告诉你那些“顶级的浏览器测试工具”,你应该使用哪一个. 这前10名的免费跨浏览器测试工具没有特定的顺序,因为他们对于任何特定的设备都同样有效.如果你手动去测试,可能既困难又耗费时间.因为你只能不断的安装更多的浏览器

9.22 正睿提高4

目录 2018.9.22 正睿提高5 A 数组计数(DP) B 旅行(思路) C 进化(思路 二进制拆分) 考试代码 B C 2018.9.22 正睿提高5 时间:3.5h 期望得分:100+80+30 实际得分:100+80+30 比赛链接 T2一直以为类似某道虚树题(SDOI2015)..到最后只想写暴力(写了暴力也该想到了啊 但是已经在划水了). A 数组计数(DP) 题目链接 DP.前缀和优化一下就行了. 刚开始滚动数组又少清空了mmp.. #include <cstdio> #inc

黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试)

黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试) 2017-03-12 03:46:24 by SemiconductorKING PS:刚刚装好黑苹果,来记录一篇折腾过程(手动滑稽) 说说准备工作: 1.TransMac.exe(写苹果镜像文件到U盘的工具) 2.clover文件(我这里提供一个已经调试好的已注入驱动的可以直接给venue11 Pro 7130用的clover) 3.苹果镜像文件(我给的是社区压缩打包过的,它自带一个clover,装完后和官方的

正睿OI DAY3 杂题选讲

正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n\leq k^2\) 暴力 \(n\geq k^2\),找点x,求直线l经过x,且点数最多,点数\(\geq k+1\),递归,否则再找一个 One Point Nine Nine 现在平面上有\(n\)个点,已知有一个常数\(D\). 任意两点的距离要么\(\leq D\),要么\(\geq 1.

[北京集训测试赛(五)/HDU5299]圆圈游戏(Circles game)-树上删边-圆的扫描线

Problem 遗产 题目大意 一个平面上n个圆,任两个圆只会相离或包含,给出每个圆位置与半径. alice&&bob轮流取圆,每取一个就可以取出这个圆以及被这个圆包含的圆. 没圆取的人输,alice先取,问谁有必胜策略. Solution Method #1 首先我们考虑一个暴力一点的写法: 先将圆半径从小到大排序,然后枚举两个圆,判断是否包含关系. 如果包含的话就将大圆连一条边到小圆. 很容易发现,这样执行完以后得到了一棵树. 我们接下来要做的事情就变成了: 每个人可以轮流从树上删除一

[issue] [iOS 10] 升级后无法真机测试 Could not find Developer Disk Image

说明:更新了手机的到了iOS 10.0.2.真机调试时候提示"Could not find Developer Disk Image" 并且之前就下载了Xcode8,但是没有安装Xcode8.因为项目快结束了,依旧使用的Xcode7.3,准备迭代版本开发在更新使用Xcode8.但是真机调试依然要测试iOS 10的. 下面显示抽取了iOS 10磁盘图片步骤 找到Xcode8,右键显示包内容 找到iOS10 的镜像文件 如果没有的话,可以直接从网盘的下载,我已经上传到网盘上了 链接: ht