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之路--MySQL多表查询
一 介绍 我们在写项目的时候一般都会建一个数据库,数据库里面会存很多的表,不可能把所有的数据都放在一张表里,因为分表来存数据节省空间,数据的组织结构更清晰,解耦和程度更高,但是这些表本质上还不是一个整 ...
- supervisor /var/run/supervisor/supervisor.sock not found 或者/tmp/supervisor.sock not found
刚按装完supervisor,这时候用supervisorctr -c supervisor.conf 会报错: /var/run/supervisor/supervisor.sock not fou ...
- 二、kubernetes环境搭建
主要内容 1.环境准备(2主机) 2.安装流程 3.问题分析 4.总结 环境配置(2主机) 系统:CentOS 7.3 x64 网络:局域网(VPC) 主机: master:172.16.0.17 m ...
- 为AI提供数据:构建2017数据创新的总结
本周在微软年度大会上,我们正在讨论组织如何依靠开发人员创造突破性的经验.随着大数据,云和人工智能的融合,创新与破坏正在加速,从未见过.数据是这一融合核心的关键战略资产.当结合云的无限计算能力和机器学习 ...
- ES6函数增强
函数参数可以拥有默认值.调用函数时,如果没有进行相应的实参传递,参数就会使用默认值.怎么给参数提供默认值呢?很简单,声明函数时候,给形参赋一个值就可以了,这个值就是参数的默认值. // num2拥有默 ...
- qt 在窗口上画框
在窗口w上面画个黄色的框:在窗口上添加一个label,然后在label上画框 QLabel label(&w); label.setScaledContents(true); QPixmap ...
- .net core 2.0 配置Session
本文章为原创文章,转载请注明出处 配置Session 在Startup.cs文件的ConfigureServices方法中添加session services.AddSession(); 在Start ...
- int,String转换
int -> String 第一种方法:s=i+""; //会产生两个String对象 第二种方法:s=String.valueOf(i); //直接使用String类的静态 ...
- mysql 自带的性能压力测试工具
mysqlslap -h127.0.0.1 -uroot -p --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate ...
- BZOJ2127happiness——最小割
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...