最后一场多校模拟赛,好像是信心赛??不过考的不行。。最近难题比较多,对题目的难度把握不够好,经常出现简单题跳过的现象。

100+100+20+40

T1 签到题(qiandao)

如果一个点的度数不是 c 的倍数,那么它的贡献至少为 1。我们一定可以构造出一种方案,使得度数是 c 的倍数的点的贡献为 0,其余的点的贡献为 1。这可以简单网络流证明,留给读者练习。

整了会这个二分图,推了好多个例子,貌似按照上面的说法都能调整出来。然后尝试着打了这10行代码,大样例一发带过。心里还是很虚但是并不会其他办法。现在正在尝试证明。

#include<bits/stdc++.h>
#define N 1000500
using namespace std;
int c,k,n,m,du1[N],du2[N],ans;
signed main()
{ freopen("qiandao.in","r",stdin);
freopen("qiandao.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&k,&c);
for(int i=1;i<=k;++i)
{ int u,v;scanf("%d%d",&u,&v);
++du1[u];++du2[v];
}
for(int i=1;i<=n;++i)if(du1[i]%c)++ans;
for(int i=1;i<=m;++i)if(du2[i]%c)++ans;
printf("%d\n",ans);
}

T2 M 弟娃(magic)

考虑对于一对点,将哪些点作为根会使这对点产生贡献。现在假定 1 为实际根,分两种情况:若这两个点不是祖先儿子关系,则将根选在两个点的子树里时,这对点会产生贡献;若这两个点是祖先儿子关系,令深度较深的点为 x,较浅的为 y,y 在这条链上的儿子为 z,则将根选在 x 的子树里,或是不在 z 的子树里时,这对点会产生贡献。求出 dfs 序,相当于我们只需要支持区间加,全局 max 即可。

这题读完题基本上就会了,但是思路上一个小细节调了会。

#include<bits/stdc++.h>
#define N 300500
using namespace std;
inline int read()
{ int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int n,m,q,head[N],dep[N],top[N],siz[N],fa[N],dfn[N],son[N],tot,cnt,f[N][18];
const int jie=17;
struct jj
{int to,nxt;}bian[N<<1];
struct segment_Tree
{int tag,maxn;}tree[N<<2];
inline void add(int u,int v)
{ bian[++tot].to=v;
bian[tot].nxt=head[u];
head[u]=tot;
}
void dfs1(int x,int ff)
{ fa[x]=f[x][0]=ff;son[x]=-1;siz[x]=1;dep[x]=dep[ff]+1;dfn[x]=++cnt;
for(int i=1;i<=jie and f[x][i-1];++i)f[x][i]=f[f[x][i-1]][i-1];
for(int i=head[x];i;i=bian[i].nxt)
{ int v=bian[i].to;
if(v==ff)continue;
dfs1(v,x);
siz[x]+=siz[v];
if(son[x]==-1 or siz[son[x]]<siz[v])son[x]=v;
}
}
inline int LCA(int x,int y)
{ if(dep[x]<dep[y])swap(x,y);
for(int i=jie;i>=0;--i)if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
for(int i=jie;i>=0;--i)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return fa[x];
}
inline int get(int x,int y)
{ for(int i=jie;i>=0;--i)if(dep[f[y][i]]>dep[x])y=f[y][i];
return y;
}
#define int register int
inline void pushup(int x)
{tree[x].maxn=max(tree[x<<1].maxn,tree[x<<1|1].maxn);}
inline void pushdown(int x)
{ tree[x<<1].maxn+=tree[x].tag;
tree[x<<1].tag+=tree[x].tag;
tree[x<<1|1].maxn+=tree[x].tag;
tree[x<<1|1].tag+=tree[x].tag;
tree[x].tag=0;
}
void update(int x,int l,int r,int L,int R,int val)
{ if(l>=L and r<=R)
{ tree[x].maxn+=val;
tree[x].tag+=val;
return ;
}
if(tree[x].tag!=0)pushdown(x);
int mid=(l+r)>>1;
if(mid<R)update(x<<1|1,mid+1,r,L,R,val);
if(mid>=L)update(x<<1,l,mid,L,R,val);
pushup(x);
}
signed main()
{ freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
n=read();q=read();
for(int i=1;i<n;++i)
{ int u,v;
u=read();v=read();
add(u,v);add(v,u);
}
dfs1(1,0);
for(int i=1;i<=q;++i)
{ int x,y;
x=read();y=read();
int lca=LCA(x,y);
if(x==y)update(1,1,n,1,n,1);
else
if(lca==x)
{
update(1,1,n,dfn[y],dfn[y]+siz[y]-1,1);
update(1,1,n,1,n,1);
int del=get(x,y);
update(1,1,n,dfn[del],dfn[del]+siz[del]-1,-1);
}
else
if(lca==y)
{ update(1,1,n,dfn[x],dfn[x]+siz[x]-1,1);
update(1,1,n,1,n,1);
int del=get(y,x);
update(1,1,n,dfn[del],dfn[del]+siz[del]-1,-1);
}
else
{ update(1,1,n,dfn[x],dfn[x]+siz[x]-1,1);
update(1,1,n,dfn[y],dfn[y]+siz[y]-1,1);
}
printf("%d\n",tree[1].maxn);
}
}

T3 变异大老鼠(arrest)

考虑 SPT 上树形 dp。fi,j 表示在以 i 为根的子树中,总共放了 j 个警察,逮捕到杨吞天的最大概率。枚举当前节点放几个警察正常树形 dp 转移。

难度判断错误,读题忽略了路径唯一,自己把题目想复杂了,其实就是个傻逼背包。


#include<bits/stdc++.h>
using namespace std;
int dis[310][310],n,m,num,tong[310][310],cnt;
double gai[310],ans[310][310],dp[310][310],tmp[310][310],lst,lin[310][310],base[310][310],ds[310];
vector<int>p[310],pp[310];
bool vis[310];
inline void dfs(int x,int fa)
{ for(int i=1;i<=num;++i)dp[x][i]=ans[x][i];
for(int i=0;i<=num;++i)tmp[x][i]=0;
for(auto i:pp[x])
{ dfs(i,x);
for(int j=0;j<=num;++j)lin[x][j]=tmp[x][j];
for(int k=0;k<=num;++k)for(int j=0;j+k<=num;++j)lin[x][j+k]=max(lin[x][j+k],tmp[x][j]+dp[i][k]);
for(int j=0;j<=num;++j)tmp[x][j]=lin[x][j];
}
if(pp[x].size())
{
for(int i=0;i<=num;++i)lin[x][i]=dp[x][i];
for(int i=0;i<=num;++i)for(int j=0;j+i<=num;++j)lin[x][i+j]=max(lin[x][i+j],dp[x][i]+(1-ans[x][i])*tmp[x][j]/(1.0*pp[x].size()));
for(int i=0;i<=num;++i)dp[x][i]=lin[x][i];
}
}
signed main()
{ freopen("arrest.in","r",stdin);
freopen("arrest.out","w",stdout);
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(base,0x3f3f3f3f,sizeof(base));
scanf("%d%d%d",&n,&m,&num);
for(int i=1;i<=m;++i)
{ int u,v,w;scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=base[u][v]=base[v][u]=min(dis[u][v],w);
if(u!=v)tong[u][v]=tong[v][u]=1,p[u].push_back(v),p[v].push_back(u);
}
for(int i=1;i<=n;++i)
{ dis[i][i]=0;base[i][i]=0;
for(int j=1;j<=num;++j)scanf("%lf",&ans[i][j]);
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i!=j and j!=k and i!=k and dis[i][j]>dis[i][k]+dis[k][j])
{ dis[i][j]=dis[j][i]=dis[i][k]+dis[k][j];
}
gai[1]=1;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(dis[1][j]+base[i][j]==dis[1][i] and i!=j and tong[i][j])
{ if(j==1 and base[i][j]!=dis[i][j])continue;
pp[j].push_back(i);
}
dfs(1,0);
for(int i=0;i<=num;++i)lst=max(lst,dp[1][i]);
printf("%.6lf\n",lst);
}

T4 朝鲜时蔬(vegetable)

玄学,每个点解法不同。

#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
#define inv12 83333334
using namespace std;
int n,m,k,ans=1;
inline int qpow(int a,int b)
{ int base=1;
while(b)
{ if(b&1)base=base*a%mod;
a=a*a%mod;
b>>=1;
}
return base;
}
inline int pow1(int x){return x%mod*((x+1)%mod)%mod*(2*x%mod+1)%mod;}
signed main()
{ freopen("vegetable.in","r",stdin);
freopen("vegetable.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&k);
if(m==k)
{ for(int i=1;i<=k;++i)ans=ans*((n-i+1)%mod)%mod;
for(int i=k;i;--i)ans=ans*qpow(i,mod-2)%mod;
printf("%lld\n",ans);return 0;
}
if(m==2 and k==1)
{ ans=0;
for(int l=1,r;l<=n;l=r+1)
{ r=n/(n/l);
ans=(ans+((r-l+1)%mod)*(n/l%mod)%mod)%mod;
}
printf("%lld\n",(ans-n%mod+mod)%mod);return 0;
}
if(m==3 and k==1){printf("%lld\n",(n/3)%mod);return 0;}
if(m==4 and k==1)
{ if(n<=5)printf("%lld\n",1ll);
else
{ ans=0;for(int i=2;i<=7;++i)
{ if(i==6)continue;
ans=(ans+n/(3*i))%mod;
}ans=(ans+n/10)%mod;
printf("%lld\n",ans);
}
return 0;
}
if(m==4 and k==2)
{ if(n<=6)cout<<1<<endl;
if(n==7)cout<<3<<endl;
if(n==8)cout<<6<<endl;
if(n==9)cout<<9<<endl;
if(n==10)cout<<10<<endl;
if(n>=11)cout<<(n/11+n/29)%mod<<endl;
return 0;
}
if(m==3 and k==2)
{ ans=0;
for(int l=1,r;l<=n;l=r+1)
{ r=n/(n/l);int tmp=0;
int zhi1=(l-1)/2,zhi2=(r-1)/2;
if(!(l&1))tmp=(tmp+zhi1)%mod,zhi1++;
if(r&1)tmp=(tmp+zhi2)%mod,--zhi2;
if(zhi1<=zhi2)
tmp=(tmp+(zhi1+zhi2)%mod*((zhi2-zhi1+1)%mod)%mod)%mod;
ans=(ans+tmp*(n/l%mod)%mod)%mod;
}
printf("%lld\n",ans);return 0;
}
if(m==4 and k==3)
{ ans=0;
for(int l=1,r;l<=n;l=r+1)
{ r=n/(n/l);int tmp=0;
tmp=(tmp+(pow1(r)-pow1(l-1)+mod)%mod*inv12%mod*2%mod)%mod;
tmp=(tmp-((l+r)%mod)*((r-l+1)%mod)%mod*inv12%mod*6%mod*6%mod+mod)%mod;
tmp=(tmp+(r-l+1)%mod*5%mod)%mod;
tmp=(tmp+((r/2)-(l+1)/2+1)%mod*3%mod)%mod;
tmp=(tmp+(r/3-(l+2)/3+1)%mod*4%mod)%mod;
tmp=tmp*inv12%mod;
ans=(ans+tmp*((n/l)%mod)%mod)%mod;
}
if(n==4)ans=1;if(n==5)ans=5;
printf("%lld\n",ans);return 0;
}
}

NOIP 模拟 七十一的更多相关文章

  1. NOIP 模拟 七十七

    100+60+95+30; T4 一个变量打错挂了40.. T1 最大或 考虑从高到低枚举的二进制位,然后和的对应二进制位进行比较.如果两 者相同,那么不论怎么选择,,答案在这个位置上的值一定和在这个 ...

  2. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  3. NOIP 模拟七 考试总结

    T1匹配 签到大水题,这里有hash,kmp,ac自动机,还有后缀数组,后缀自动机任您挑选. 不过这个数据范围有些坑啊,re就很不爽.做法我还是比较倾向hash的,毕竟不论神魔字符算法,hash大都能 ...

  4. Nescafe #29 NOIP模拟赛

    Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...

  5. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  6. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

  7. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  8. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  9. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

随机推荐

  1. Oracle数据库 —— DML完结

    时间:2016-8-18 01:17 ----------------------------------------------------------------------------停下休息的 ...

  2. git 使用代理出现 LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 错误

    删除代理即可. 具体操作如下: 1. git config --global --list     查看git配置 发现其中有 http.https.XXXXXX.proxy 和 https.http ...

  3. Linux系统的ssh与sshd服务

    当主机中开启openssh服务,那么就对外开放了远程连接的接口 ssh为openssh服务的客户端,sshd为openssh服务的服务端 远程管理工具ssh具有数据加密传输.网络开销小以及应用平台范围 ...

  4. 【开发工具】Postman保姆级入门教程

    目录 一.简单使用 1. 创建命名空间 2. 创建新集合 3. 按模块整理接口 二.使用环境变量 1. 创建环境与环境变量 2. 使用环境变量 3. 登录后自动更新环境变量 转载请注明出处 一.简单使 ...

  5. python 加速运算

    原文链接:https://blog.csdn.net/qq_27009517/article/details/103805099 一.加速查找 1.用set而非list import time dat ...

  6. 源码编译安装 LNMP及论坛

    一.安装Nginx服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 1.安装依赖包 yum -y install ...

  7. 有关类朋友圈设计(3) -- 数据库设计&现有技术&流程设计

    在写之前,先说说当前的系统架构吧 spring cloud + zuul + eureka + oauth2 + redis + rabbitMq 这个系统是由我搭建的,当时采用的springClou ...

  8. windows环境下永久修改pip镜像源的方法

    在windows环境下修改pip镜像源的方法 (1)在windows文件管理器中,输入 %APPDATA% (2)会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pi ...

  9. sql语句异常向数据库插入数据报错

    在php编程向数据库插入数据时报如下错误: [Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...

  10. PTA——c++类与对象

    对于给定的一个字符串,统计其中数字字符出现的次数. 类和函数接口定义: 设计一个类Solution,其中包含一个成员函数count_digits,其功能是统计传入的string类型参数中数字字符的个数 ...