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 SMTP 发送邮件 阿里企业邮箱、163邮箱 及535错误
class SendEmail(object): def __init__(self, type, to_addr): self.to_addr = to_addr self.sys_date = t ...
- Ubuntu16.04网络不能访问解决办法
问题: 系统重启后,网络不能正常使用,加载网络配置失败,且重启网络时也提示错误. 解决方法: 在定位的过程中发现是配置中的网络设备号与实际设备号不符. 1.查看网络配置中的配备号: vi /etc ...
- python工具使用笔记
1.pip pip是Python官方推荐的包管理工具,在doc界面直接使用pip或者pip3命令即可,例如安装gensim: C:\Users\kayan.sjc>pip3 install -- ...
- linux Vi使用
前言 在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式vi编辑器有3种模式:命令模式.输入模式.末行模式. ...
- 实验吧 WEB 貌似有点难
错误!你的IP不在允许列表之内! 提示:代码审计 这个提示可谓是非常良心了,一看源代码是一个识别ip地址的东西,如果IP为1.1.1.1那么就会得到KEY. 第一个if是判断是否有client-ip ...
- 创建iview框架的项目
http://www.cnblogs.com/jf-67/p/8479176.html 在使用‘vue init webpack my-project’创建项目时,出现了错误 npm ERR! cod ...
- kubernetes job的原理
job例子: apiVersion: batch/v1 #job的apiVersion kind: Job #资源类型为job metadata: labels: name: busybox name ...
- Matplotlib学习---用matplotlib画箱线图(boxplot)
箱线图通过数据的四分位数来展示数据的分布情况.例如:数据的中心位置,数据间的离散程度,是否有异常值等. 把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分 ...
- Power Stations HDU - 3663
我为什么T了.... Power Stations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 【XSY2730】Ball 多项式exp 多项式ln 多项式开根 常系数线性递推 DP
题目大意 一行有\(n\)个球,现在将这些球分成\(k\) 组,每组可以有一个球或相邻两个球.一个球只能在至多一个组中(可以不在任何组中).求对于\(1\leq k\leq m\)的所有\(k\)分别 ...