牛客练习赛47 C线段树,D简单图上dp,E启发式合并

题目链接

选了一场牛客远古场复现一下,感觉遇到了很多原题

战绩

A,B,水题  C线段树,D简单图上dp,E启发式合并

C-DongDong跳一跳

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=2e5+10;
int n,m;
ll mx[4*N],x[N],y[N],X[4*N],len;
int get(ll x)
{
    return lower_bound(X+1,X+1+len,x)-X;
}
void up(int id,int l,int r,int pos,ll val)
{
    if(l==r){
        mx[id]=max(mx[id],val);
        return ;
    }
    int mid=l+r>>1;
    if(pos<=mid) up(id<<1,l,mid,pos,val);
    else up(id<<1|1,mid+1,r,pos,val);
    mx[id]=max(mx[id<<1],mx[id<<1|1]);
}
ll qu(int id,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr) return mx[id];
    ll ans=0;
    int mid=l+r>>1;
    if(ql<=mid) ans=qu(id<<1,l,mid,ql,qr);
    if(qr>mid) ans=max(ans,qu(id<<1|1,mid+1,r,ql,qr));
    return ans;
}
int main()
{
	cin>>n>>m;
	rep(i,1,n) {
        cin>>x[i]>>y[i];
        X[++len]=x[i];
        X[++len]=x[i]-m;
        X[++len]=x[i]+m;
	}
	sort(X+1,X+1+len);
	len=unique(X+1,X+1+len)-X-1;
	ll ans=0;
	rep(i,1,n){
        int l=get(x[i]-m);
        int r=get(x[i]+m);
        ll res=qu(1,1,len,l,r);
        //rintf("i:%d res:%lld\n",i,res);
        ans=max(ans,res+y[i]);
        up(1,1,len,get(x[i]),res+y[i]);
	}
	printf("%lld\n",ans);
}

D-DongDong坐飞机

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=1e4+10;
const ll inf=0x3f3f3f3f3f3f3f3f;
vector<int>G[N];
vector<ll>val[N];
int n,m,k;
ll dp[N][20],vis[N];
void bfs()
{
    memset(dp,inf,sizeof(dp));
	dp[1][0]=0;
	queue<int>que;que.push(1);

	while(que.size()){
        int u=que.front();que.pop();
        for(int i=0;i<G[u].size();++i){
            int v=G[u][i],w=val[u][i];

            int flag=0;
            for(int j1=0;j1<=k;j1++){
                if(dp[u][j1]==inf) continue;
                if(dp[u][j1]+w<dp[v][j1]) {
                    dp[v][j1]=min(dp[v][j1],dp[u][j1]+w);
                    flag=1;
                }
                if(dp[u][j1]+w/2<dp[v][j1+1]) {
                    dp[v][j1+1]=min(dp[v][j1+1],dp[u][j1]+w/2);
                    flag=1;
                }

            }
            if(flag)que.push(v);
        }
	}
}
int main()
{
	cin>>n>>m>>k;
	rep(i,1,m)
	{
	    int u,v;
	    ll w;
	    scanf("%d%d%lld",&u,&v,&w);
	    G[u].push_back(v);
	    val[u].push_back(w);
	}
	bfs();
	ll ans=inf;
	for(int i=0;i<=k;++i) ans=min(ans,dp[n][i]);
	if(ans==inf) ans=-1;
	printf("%lld\n",ans);
	return 0;
}

E-DongDong数颜色

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=1e5+10;
set<int>st[N];
vector<int>G[N];
int n,a[N],col[N],m,ans[N];
void dfs(int u,int fa)
{
    for(int v:G[u]){
        if(v==fa) continue;
        dfs(v,u);
        if(st[u]<st[v]){
            for(int t:st[v]) st[u].insert(t);
        }
        else{
            swap(st[u],st[v]);
            for(int t:st[v]) st[u].insert(t);
        }
    }
    ans[u]=st[u].size();
}
int main()
{
	cin>>n>>m;
	rep(i,1,n) cin>>col[i],st[i].insert(col[i]);
	rep(i,1,n-1)
	{
	    int u,v;
	    scanf("%d%d",&u,&v);
	    G[u].push_back(v);
	    G[v].push_back(u);
	}
	dfs(1,-1);
	while(m--)
    {
        int x;
        scanf("%d",&x);
        printf("%d\n",ans[x]);
    }
    return 0;
}
发布了498 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/104953715