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 ...
随机推荐
- 利用Python制作简单的小程序:IP查看器
前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固 ...
- python数据结构与算法第十四天【二分查找】
1.二分查找的原理 对于已经排序的列表进行最快速度的查找 2. 代码实现 (1)递归实现 def binary_search(alist, item): if len(alist) == 0: ret ...
- Python——Flask框架——数据库
一.数据库框架 Flask-SQLAlchemy (1)安装: pip install flask-sqlalchemy (2)Flask-SQLAlchemy数据库URL 数据库引擎 URL MyS ...
- hdu-1711(kmp)
题意:给你两串数字,问你第二串数字第一次出现在第一串数字的位置,没有输出-1: 解题思路:其是就是字符串匹配,就是这里是数字匹配,把char数组改成int型就可以了: 代码: #include< ...
- Nginx memcached应用层反向代理
L:105 Module ngx_http_memcached_module 模块默认编译进Nginx
- Clear Linux 为脚本语言提供更高的性能
导读 Clear Linux的领先性能不仅限于C/C++应用程序,而且PHP,R和Python等脚本语言也有很大的提升速度.在一篇新的博客文章中,英特尔的一位开发人员概述了他们对Python的一些性能 ...
- mysql-语法大全
DDL语句 库 创建 create database 库名 charset utf8; 删除 drop database 库名; 修改 alter database 库名 charset latin; ...
- 贝叶斯定理推导(Bayes' Theorem Induction)
这里用Venn diagram来不严谨地推导一下贝叶斯定理. 假设A和B为两个不相互独立的事件. 交集(intersection): 上图红色部分即为事件A和事件B的交集. 并集(union): ...
- hdu 1540 Tunnel Warfare(Treap)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 思路:三种操作: D摧毁一个点 R重建最晚被修改的那个点 Q询问点x联通的点有多少个 逆向思维,D操 ...
- 洛谷P4891 序列(势能线段树)
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...