2018 ACM 网络选拔赛 青岛赛区
一些题目的代码被网站吞了……
Problem B. Red Black Tree
http://acm.zju.edu.cn/onlinejudge/searchProblem.do?contestId=1&titlefrom=0&authorfrom=0&sourcefrom=0&query=The+2018+ACM-ICPC+Asia+Qingdao+Regional+Contest%2C+Online
http://acm.zju.edu.cn/pcpst/index.html
http://acm.zju.edu.cn/contest-materials/qdol2018/qdol2018_problems.pdf
注意是找祖先(红色孩子节点无效)!
先按照花费对节点从大到小进行排序,依次增加一个点,这个点的花费采用从该点到所有新加入点的最近公共祖先的距离,直到遇到花费不可减少,则停止。
注意maxlen!
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+;
const double minv=1e-;
const ll inf=1e18; vector<pair<int,ll> >e[maxn];
int r[maxn],dep[maxn<<],p[maxn<<],lef[maxn],er[],point[maxn],ind,f[maxn<<][];
ll cost[maxn],len[maxn];
bool vis[maxn]; void dfs(int d,ll c,ll l,int deep)
{
vis[d]=;
if (r[d]==)
c=;
cost[d]=c;
len[d]=l;
dep[++ind]=deep;
p[ind]=d;
lef[d]=ind;
vector<pair<int,ll> >::iterator j;
for (j=e[d].begin();j!=e[d].end();j++)
if (!vis[j->first])
{
dfs(j->first,c+j->second,l+j->second,deep+);
dep[++ind]=deep;
p[ind]=d;
}
} int cmp(int a,int b)
{
return cost[a]>cost[b];
} int main()
{
int t,n,m,q,u,v,d,deep,i,j,k;
ll w,result,maxlen;
for (i=;i<=;i++)
er[i]=<<i;
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d",&n,&m,&q);
for (i=;i<=n;i++)
{
r[i]=;
vis[i]=;
e[i].clear();
}
for (i=;i<=m;i++)
scanf("%d",&d),r[d]=;
for (i=;i<n;i++)
{
scanf("%d%d%lld",&u,&v,&w);
e[u].push_back({v,w});
e[v].push_back({u,w});
}
ind=;
dfs(,,,);
for (j=;j<=ind;j++)
f[j][]=j;
deep=(int)(log(ind)/log()+minv);
for (i=;i<=deep;i++)
for (j=,k=er[i-]+;j<=ind-er[i]+;j++,k++)
f[j][i]=(dep[f[j][i-]]<dep[f[k][i-]])?f[j][i-]:f[k][i-];
while (q--)
{
scanf("%d",&m);
for (i=;i<=m;i++)
scanf("%d",&point[i]);
sort(point+,point+m+,cmp);
if (m==)
result=;
else
{
result=cost[point[]];
d=point[];
}
maxlen=len[point[]];
for (i=;i<=m;i++)
{
u=lef[d];
v=lef[point[i]];
if (u>v)
swap(u,v);
deep=(int)(log(v-u+)/log()+minv);
d=(dep[f[u][deep]]<dep[f[v-er[deep]+][deep]])?f[u][deep]:f[v-er[deep]+][deep];
d=p[d];
maxlen=max(maxlen,len[point[i]]);
w=maxlen-len[d];
if (i==m || w>=cost[point[i+]])
{
result=min(result,w);
break;
}
result=min(result,cost[point[i+]]);
}
printf("%lld\n",result);
}
}
return ;
}
/*
10
10 2 100
7 10
1 2 3
1 3 4
1 4 1
2 5 1
3 6 2
5 7 3
3 8 2
4 9 3
9 10 10
5 1 2 3 4 5 */
另外:
对花费采用二分
参见 https://blog.csdn.net/qq_40993793/article/details/82762766,
每次询问O( klog(w*n) ),(其中排序那块我没看懂,这里的时间复杂度没有算排序)
sum(k)<=2e6,n<=1e5,w<=1e9,
因此log(w*n)=47,maxtime=9.4*10^7,存在超时的可能性(虽然假设的有点。。。)。不太推荐。。。
在zoj测试时,超时了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+;
const double minv=1e-;
const ll inf=1e18; vector<pair<int,ll> >e[maxn];
int red[maxn],dep[maxn<<],p[maxn<<],lef[maxn],er[],point[maxn],ind,f[maxn<<][];
ll cost[maxn],len[maxn];
bool vis[maxn]; void dfs(int d,ll c,ll l,int deep)
{
vis[d]=;
if (red[d]==)
c=;
cost[d]=c;
len[d]=l;
dep[++ind]=deep;
p[ind]=d;
lef[d]=ind;
vector<pair<int,ll> >::iterator j;
for (j=e[d].begin();j!=e[d].end();j++)
if (!vis[j->first])
{
dfs(j->first,c+j->second,l+j->second,deep+);
dep[++ind]=deep;
p[ind]=d;
}
} int cmp(int a,int b)
{
return cost[a]>cost[b];
} int main()
{
int t,n,m,q,u,v,g,d,deep,i,j,k,l;
ll w,result,r;
bool use;
for (i=;i<=;i++)
er[i]=<<i;
scanf("%d",&t);
while (t--)
{
scanf("%d%d%d",&n,&m,&q);
for (i=;i<=n;i++)
{
red[i]=;
vis[i]=;
e[i].clear();
}
for (i=;i<=m;i++)
scanf("%d",&d),red[d]=;
for (i=;i<n;i++)
{
scanf("%d%d%lld",&u,&v,&w);
e[u].push_back({v,w});
e[v].push_back({u,w});
}
ind=;
dfs(,,,);
for (j=;j<=ind;j++)
f[j][]=j;
deep=(int)(log(ind)/log()+minv);
for (i=;i<=deep;i++)
for (j=,k=er[i-]+;j<=ind-er[i]+;j++,k++)
f[j][i]=(dep[f[j][i-]]<dep[f[k][i-]])?f[j][i-]:f[k][i-];
while (q--)
{
l=; r=;
scanf("%d",&g);
for (i=;i<=g;i++)
{
scanf("%d",&point[i]);
r=max(r,cost[point[i]]);
}
while (l<=r)
{
m=(l+r)>>;
use=;
for (i=;i<=g;i++)
if (cost[point[i]]>m)
{
if (!use)
{
use=;
d=point[i];
continue;
}
u=lef[d];
v=lef[point[i]];
if (u>v)
swap(u,v);
deep=(int)(log(v-u+)/log()+minv);
d=(dep[f[u][deep]]<dep[f[v-er[deep]+][deep]])?f[u][deep]:f[v-er[deep]+][deep];
d=p[d];
if (len[point[]]-len[d]>m)
break;
}
if (i==g+)
r=m-;
else
l=m+;
}
printf("%lld\n",l);
}
}
return ;
}
/*
10
10 2 100
7 10
1 2 3
1 3 4
1 4 1
2 5 1
3 6 2
5 7 3
3 8 2
4 9 3
9 10 10
5 1 2 3 4 5 */
2018 ACM 网络选拔赛 青岛赛区的更多相关文章
- 2018 ACM 网络选拔赛 北京赛区
A Saving Tang Monk II #include <bits/stdc++.h> using namespace std; ; struct node { int x,y,z, ...
- 2018 ACM 网络选拔赛 徐州赛区
A. Hard to prepare #include <cstdio> #include <cstdlib> #include <cmath> #include ...
- 2018 ACM 网络选拔赛 焦作赛区
A. Magic Mirror #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- 2018 ACM 网络选拔赛 沈阳赛区
B. Call of Accepted #include <cstdio> #include <cstdlib> #include <cmath> #include ...
- 2018 ACM 网络选拔赛 南京赛区
A. An Olympian Math Problem #include <cstdio> #include <cstdlib> #include <cmath> ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】
Tree and Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
随机推荐
- html5调用手机摄像头(图片可多选 限pc)
html5自带的 input file=”” ,纯html5,并且不涉及到js ,就可以实现.代码如下: <input type="file" accept="im ...
- Percona-xtrabackup 使用详解与原理
现在有个需求需要对使用 innodb 的数据库进行热备.网上查了很多工具皆推荐 Percona-xtrabackup 于是就仔细了解调研一番. 我们可以前往 https://www.percona.c ...
- python学习笔记(8)--random库的使用
伪随机数:采用梅森旋转算法生成的伪随机序列中元素 使用random库 一.基本随机函数 随机数需要一个种子,依据这个种子通过梅森旋转算法产生固定序列的随机数.seed(a=None) 初始化给定的随 ...
- 莫烦theano学习自修第七天【回归结果可视化】
1.代码实现 from __future__ import print_function import theano import theano.tensor as T import numpy as ...
- 在delphi中生成GUID/自动获取临时表名......
什么是 GUID ? 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装.在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID. GUID 的格式为 ...
- 三、checkedListBoxControl
一.checkedListBoxControl的使用全选 private void InitDate() { CheckedListBoxItem[] itemArr = { new CheckedL ...
- 百度云虚拟主机配置 Thinkphp5.1
材料 服务器:百度云虚拟主机(nginx+php7.0+linux) Thinkphp 5.1 问题 百度云默认目录为/webroot,但是我们的需求是将项目存放到/webroot/public下面. ...
- spring的作用是减低耦合,从编译器降低,例如不直接通过new方式 而是通过工厂方式获取对象
spring的作用是减低耦合,从编译器降低,例如不直接通过new方式 而是通过工厂方式获取对象
- Nginx split_client模块
一般用户AB测试根据比例调用指定的接口 默认编译进nginx Syntax: split_clients string $variable { ... } Default: — Context: h ...
- 【数学建模】day01-线性规划问题
线性规划问题是在一组线性约束条件下,求线性目标函数最大/最小值的问题.这些约束条件有不等式约束.等式约束以及边界约束,这和中学讲的线性规划无异. 此类问题的MATLAB标准形式为: 其中,max问 ...