当前位置: 首页 > news >正文

Codeforces Round 1000 (Div. 2)

AB 略

C

在一棵树上删除两点,使得这棵树的连通块最多。深度搜索遍历这棵树,记录此时遍历的所有点的最大的度数,和最大度数点的数量。然后每遍历一个点就假设这个点作为第二个断点,此时如果之前最大的度数的点不是唯一且是父节点,那么答案就是两者加和-1,否则-2

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,du[N],maxn,k,ans;
int ver[N*2],head[N],Next[N*2],tot;
void init()
{
    maxn=tot=k=ans=0;
    for(int i=1;i<=2*n;i++)
    ver[i]=Next[i]=0;
    for(int i=1;i<=n;i++)
    head[i]=du[i]=0;
}
void add(int x,int y)
{
    du[x]++;
    ver[++tot]=y;
    Next[tot]=head[x],head[x]=tot;
}
void dfs(int x,int fa)
{
    for(int i=head[x];i;i=Next[i])
    {
        int y=ver[i];
        if(y==fa) continue;
        if(du[x]==maxn&&k==1) ans=max(ans,du[y]+maxn-2);
        else ans=max(ans,du[y]+maxn-1);
        if(du[y]==maxn) k++;
        if(du[y]>maxn) maxn=du[y],k=1;
        dfs(y,x);
    }
}
void solve()
{
    cin>>n;
    init();
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y),add(y,x);
    }
    maxn=du[1],k=1;
    dfs(1,-1);
    cout<<ans<<endl;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solve();
}

D

问题转化为在数组a b上删数,每次可以选择一个数组删去上面的两个点,差值累加,并删去另一个数组一个点,问对于每次操作的最大累加差值是多少。先将a b排序,每次删去两个数时一定删首尾的,我们记a b数组累加操作删数的前缀和为sa sb。假设执行x次操作,有i次删累加删a,那么答案是 sa[i]+sb[x-i]。随着i的增加,sa递减,而sb递增,由此可见答案单峰,用三分即可在log时间内判断出每个x的最大值。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n,m,a[N],b[N],sa[N],sb[N],ans,O;
void init()
{
    ans=0;
}
int sanfen(int x,int l,int r)
{
    int val=0,vall=0;
    val=max(sa[l]+sb[x-l],sa[r]+sb[x-r]);
    if(r-l<=2)
    {
        if(r-l==2) vall=sa[l+1]+sb[x-(l+1)];    
        return max(vall,val);
    }
    while(r-l>2)
    {
        int mid=(l+r)/2;
        int midd=(mid+r)/2;
        if(sa[mid]+sb[x-mid]>sa[midd]+sb[x-midd]) {r=midd;val=max(val,sa[mid]+sb[x-mid]);}
        else {l=mid;val=max(val,sa[midd]+sb[x-midd]);}
    }
    return val;
}
void solve()
{
    cin>>n>>m;
    init();
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=m;i++)
    cin>>b[i];
    sort(b+1,b+m+1);
    for(int i=1;i<=n/2;i++)
    sa[i]=sa[i-1]+a[n-i+1]-a[i];
    for(int i=1;i<=m/2;i++)
    sb[i]=sb[i-1]+b[m-i+1]-b[i];
    int nn=n,mm=m;
    while(nn&&mm)
    {
        if(nn==1&&mm==1) break;
        if(nn>=mm) nn-=2,mm-=1;
        else nn-=1,mm-=2;
        ans++;
    }
    cout<<ans<<endl;
    for(int i=1;i<=ans;i++)
    {
        cout<<sanfen(i,max(O,2*i-m),min(n-i,i))<<" ";
    }
    cout<<endl;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solve();
}

相关文章:

  • 激光干涉仪学习
  • mac 卸载流氓软件安全助手
  • TypeScript 中的 infer 关键字用途
  • C++11QT复习 (十六)
  • C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避
  • mnggiflab-gif压缩功能更新
  • C++学习之本地套接字libevent
  • C++ :特殊类设计
  • 空值处理操作符
  • 如何深刻理解Reactor和Proactor
  • MySQL学习笔记四
  • 城电科技 | 太阳能花怎么选择?光伏太阳花的应用场景在哪里?
  • 用 HTML、CSS 和 jQuery 打造多页输入框验证功能
  • ES:geoip_databases
  • AWS SNS深度解析:构建高可用、可扩展的云原生消息通信解决方案
  • 基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)
  • 在PPT中同时自动播放多个视频的方法
  • AI智慧共治新未来——社会综合治理智慧化系统
  • 关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格
  • 十四届蓝桥杯Java省赛 B组(持续更新..)
  • 淘宝优惠群的网站是怎么做/网上推广方式
  • 网站外链平台/平台运营
  • 找个做网站的/西安网络推广运营公司
  • 行业门户网站建站/seo排名推广
  • 如何做网站ppt/市场营销培训
  • 网站推广的优化/上海seo网络优化