T1

给你一棵树,要求增加最少的边权是的从根到每一个叶子的长度相等

不能改变原有的最大长度

这是一个贪心:尽可能往深度小的边增加

先预处理出 \(mx_i\) 表示从 \(i\) 到叶子的最大长度

然后 \(\text{dfs}\) ,传入一个 \(top\) 表示最大不能超过 \(top\)

对于一条边,分为两种情况

  1. 是最大路径的边,只是 \(top\) 减少了这条边权
  2. 不是最大路径的边,需要增加 \(top-mx_v-len_i\) , \(top\) 变为 \(mx_v\)
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
typedef long long LL;
int n,cnt,lst[N],nxt[N<<1],to[N<<1];
LL qz[N<<1],mx[N],ans;
inline void Ae(int fr,int go,int vl) {
to[++cnt]=go,qz[cnt]=1LL*vl;
nxt[cnt]=lst[fr],lst[fr]=cnt;
}
void pre(int u,int f) {
for(int i=lst[u],v;i;i=nxt[i])
if((v=to[i])^f) {
pre(v,u);
mx[u]=max(mx[u],mx[v]+qz[i]);
}
}
void dfs(int u,int f,LL top) {
for(int i=lst[u],v;i;i=nxt[i])
if((v=to[i])^f) {
if(mx[v]+qz[i]==mx[u])dfs(v,u,top-qz[i]);
else ans+=top-mx[v]-qz[i],dfs(v,u,mx[v]);
}
}
int main() {
scanf("%d",&n);
for(int i=1,u,v,w;i<n;i++) {
scanf("%d%d%d",&u,&v,&w);
Ae(u,v,w),Ae(v,u,w);
}
pre(1,0);
dfs(1,0,mx[1]);
printf("%lld",ans);
}

T2

一个图中有 \(k\) 个关键点,现在需要从 1 到 \(n\) 往返一次,问在时间不超过 \(t\) 的前提下最多能经过多少关键点

满足经过关键点最多的同时时间最少,不能往返输出 \(-1\)

\(k\le 15\) 果断状压。

设 \(f_{s,i}\) 为过了关键点状态为 \(s\),最后在 \(i\) 的最小时间

要经过起点和重点,于是把 1 和 \(n\) 加入关键点

因为走的最优方案肯定是走最短路,先预处理出关键点之间的最短路 \(dis\)

然后转移是 \(f_{s\cup j,j}=f_{s,i}+dis_{i,j}\)

最后处理答案,枚举状态 \(s\) ,枚举最后的点 \(i\) ,看 \(f_{s,i}+dis_{1,i}\le t\)

然后一波 \(lowbit\) 分解,一波比较

#include<bits/stdc++.h>
using namespace std;
const int N=10005,M=50005;
int n,m,K,T,cnt,p[25],x[N],lst[N],nxt[M<<1],to[M<<1],vis[N];
int D[N],dis[20][20],qz[M<<1],f[300005][20],ans1,ans2;
struct poi {
int nw,vl; poi() { } poi(int _nw,int _vl):nw(_nw),vl(_vl) { }
inline bool operator<(poi o) const { return o.vl<vl; }
};
priority_queue<poi>q;
inline void Ae(int fr,int go,int vl) {
to[++cnt]=go,qz[cnt]=vl,nxt[cnt]=lst[fr],lst[fr]=cnt;
}
inline void dijk(int st) {
memset(D,100,sizeof(D));
memset(vis,0,sizeof(vis));
D[st]=0,q.push(poi(st,0));
register int u;
while(!q.empty()) {
u=q.top().nw,q.pop();
if(vis[u])continue; vis[u]=1;
for(int i=lst[u],v;i;i=nxt[i])
if(D[u]+qz[i]<D[v=to[i]]) {
D[v]=D[u]+qz[i];
q.push(poi(v,D[v]));
}
}
}
int main() {
for(int i=0;i<=20;i++)p[i]=1<<i;
scanf("%d%d%d%d",&n,&m,&K,&T);
for(int i=1,u,v,w;i<=m;i++) {
scanf("%d%d%d",&u,&v,&w);
Ae(u,v,w),Ae(v,u,w);
}
for(int i=1;i<=K;i++)scanf("%d",&x[i]);
x[0]=1,x[++K]=n;
for(int i=0;i<=K;i++) {
dijk(x[i]);
for(int j=0;j<=K;j++)
dis[i][j]=D[x[j]];
}
memset(f,100,sizeof(f));
f[1][0]=0;
for(int s=0;s<p[K+1];s++)
for(int i=0;i<=K;i++) if(s&p[i])
for(int j=0;j<=K;j++) if(!(s&p[j]))
f[s|p[j]][j]=min(f[s|p[j]][j],f[s][i]+dis[i][j]);
ans2=2100000000;
for(int s=0,tot,o;s<p[K+1];s++) {
if((s&p[0]) && (s&p[K])) {
tot=0,o=s;
while(o)++tot,o-=o&-o;
for(int i=0;i<=K;i++) {
if(f[s][i]+dis[i][0]<=T) {
if(tot>ans1)ans1=tot,ans2=f[s][i]+dis[i][0];
else if(tot==ans1 && f[s][i]+dis[i][0]<ans2)
ans2=f[s][i]+dis[i][0];
} }
}
}
if(ans2>=2100000000)puts("-1");
else printf("%d %d",ans1-2,ans2);
}

T3

题目大意:问对于 \(k\) 在 \(A\) 中异或最大值的位置,任意一个即可

板题!!!(对于我这种思维菜鸡来说)

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,tot,ch[N*80][2],id[N*80];
inline void ins(int p,int v) {
register int u=0,s;
for(int i=31;~i;i--) {
s=v>>i&1;
if(!ch[u][s])
ch[u][s]=++tot;
u=ch[u][s];
}
id[u]=p;
}
inline int ask(int v) {
register int u=0,s;
for(int i=31;~i;i--) {
s=v>>i&1;
if(ch[u][s^1])
u=ch[u][s^1];
else u=ch[u][s];
}
return id[u];
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1,x;i<=n;i++) {
scanf("%d",&x);
ins(i,x);
}
for(int i=1,x;i<=m;i++) {
scanf("%d",&x);
printf("%d\n",ask(x));
}
}

总结

  1. 贪心要多想
  2. 果断的决策: \(n\) 特别小一类的用状压
  3. 板子一定不能挂

2021.05.05【NOIP提高B组】模拟 总结的更多相关文章

  1. 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)

    5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms   ...

  2. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  3. JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间

    5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms  Memo ...

  4. 2021.06.05【NOIP提高B组】模拟 总结

    T1 题意:给你一个 \(n\) 个点 \(n\) 条边的有向图, 求每个店经过 \(K\) 条边后的边权和.最小边权 \(K\le 10^{10}\) 考试时:一直想着环,结果一直不知道怎么做 正解 ...

  5. [JZOJ5817] 【NOIP提高A组模拟2018.8.15】 抄代码

    Description J 君是机房的红太阳,每次模拟她总是 AK 虐场.然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君 ...

  6. [JZOJ5818] 【NOIP提高A组模拟2018.8.15】 做运动

    Description 一天,Y 君在测量体重的时候惊讶的发现,由于常年坐在电脑前认真学习,她的体重有了突 飞猛进的增长. 幸好 Y 君现在退役了,她有大量的时间来做运动,她决定每天从教学楼跑到食堂来 ...

  7. 【NOIP提高A组模拟2018.8.14】 区间

    区间加:差分数组修改 O(n)扫描,负数位置单调不减 #include<iostream> #include<cstring> #include<cstdio> # ...

  8. [jzoj 5782]【NOIP提高A组模拟2018.8.8】 城市猎人 (并查集按秩合并+复杂度分析)

    传送门 Description 有n个城市,标号为1到n,修建道路花费m天,第i天时,若gcd(a,b)=m-i+1,则标号为a的城市和标号为b的城市会建好一条直接相连的道路,有多次询问,每次询问某两 ...

  9. [jzoj 5781]【NOIP提高A组模拟2018.8.8】秘密通道 (最短路)

    传送门 Description 有一副nm的地图,有nm块地,每块是下列四种中的一种: 墙:用#表示,墙有4个面,分别是前面,后面,左面,右面. 起点:用C表示,为主角的起点,是一片空地. 终点:用F ...

随机推荐

  1. vue项目处理dpr和多屏幕适配问题

    <!DOCTYPE html> <html style="font-size:37.5px"> <head> <meta charset= ...

  2. Leetcode541/151之String与char数组与StringBuffer

    String与char数组与StringBuffer 通常情况下遇到删除字符或者反转字符串时需要将String转为char数组或者StringBuffer String与char数组 char [] ...

  3. LC-707

    设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针/引用.如果要使用双向链表,则还需要一个属性 ...

  4. 基于Apache Hudi在Google云构建数据湖平台

    自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品.多年来数据以多种方式存储在计算机中, ...

  5. 帝国CMS网站地图生成插件

    可以生成电脑端也可以生成手机端的地图XML. 安装方法: 这个帝国sitemap插件的安装跟其他插件的安装方式一样,介于可能有人不会安装帝国的插件,就写一下吧,以后你们如果碰到帝国插件也可以参考这个. ...

  6. [Where is My Chicken Soup] 鸡汤来咯

    20岁的年纪安逸不是好的选择.尝试突破自己,你的本事不止你现在的样子. 保持适当的焦虑,它会一直鞭策你进步. 失败的原因有很多,并不代表你真的不行.但如果自己真就这么放弃了,那你才是真的不行.

  7. github ations 入门使用

    在使用之前,我们了解一下什么是 Github Actions. 在 GitHub Actions 的仓库中自动化.自定义和执行软件开发工作流程. 您可以发现.创建和共享操作以执行您喜欢的任何作业(包括 ...

  8. ASP.NET Web 应用 Docker踩坑历程

    听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...

  9. 在jupyterlab中实现实时协同功能

    1 简介 当你在使用jupyter时,有没有想象过如果我们可以把正在编写代码的jupyter界面共享给其他人,使得别人可以在其他地方实时看到与你同步的jupyter界面,这样一来无论是与他人沟通代码逻 ...

  10. XCTF练习题---WEB---command_execution

    XCTF练习题---WEB---command_execution flag:cyberpeace{69383c056080bd6cd649578894d1d377} 解题步骤: 1.观察题目,打开场 ...