NOIP 模拟 七十一
最后一场多校模拟赛,好像是信心赛??不过考的不行。。最近难题比较多,对题目的难度把握不够好,经常出现简单题跳过的现象。
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 模拟 七十一的更多相关文章
- NOIP 模拟 七十七
100+60+95+30; T4 一个变量打错挂了40.. T1 最大或 考虑从高到低枚举的二进制位,然后和的对应二进制位进行比较.如果两 者相同,那么不论怎么选择,,答案在这个位置上的值一定和在这个 ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- NOIP 模拟七 考试总结
T1匹配 签到大水题,这里有hash,kmp,ac自动机,还有后缀数组,后缀自动机任您挑选. 不过这个数据范围有些坑啊,re就很不爽.做法我还是比较倾向hash的,毕竟不论神魔字符算法,hash大都能 ...
- Nescafe #29 NOIP模拟赛
Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 2019.7.29 NOIP模拟测试10 反思总结【T2补全】
这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
随机推荐
- uwp 自定义语音识别规则
xml code ---------------------------------------------------- <Page x:Class="MyApp.MainPage ...
- 互斥锁(Lock)
转载至:https://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷 synchronized是java中的一个关键字,也就 ...
- ArcGIS图层添加字段出现:“定义了过多字段”
首先,我图层数据格式为mdb,也就是Access数据库 Access一个表最大支持255个字段,可是我的才添加第一个字段就出现"定义了过多字段"的错误 打开ArcMap添加字段也是 ...
- SpringCloud之网关zuul
1.微服务网关介绍和使用场景 1)什么是网关 API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控.缓存.限流等功能 统一接入 智 ...
- struts2思想学习(一)
OOP 面向对象编程 AOP 面向切面编程 而在struts2 处处体现了面向切面编程的思想(动态代理最典型)! 拦截器其实也是面向切面编程!拦截器切断了所有请求到action的操作 并做了很多的前提 ...
- ES6扩展——对象的扩展(简洁表示法与属性名表达式)
1.简洁表达法. 当属性名与属性值相同时,可省略属性值:例如:{name : name}可以写成 {name} 属性方法中,可省略冒号与function,直接 属性名(){}即可.例如{say : f ...
- Mac 安装 Android commandlinetools 各种报错的问题
https://developer.android.com/studio/releases/platform-tools commandlinetools-mac 下载地址 解压后直接运行 sdkma ...
- 剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下 ...
- Java并发知识总结,超详细!
首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...
- Springcloud轻松上手
Springcloud技术分享 Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来 ...