牛客周赛R166(max型瓶颈最短路,前后缀DP合并)

C 小月的长廊

树状数组板子题

cpp 复制代码
#include <bits/stdc++.h>
 
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0);
#define endl "\n"
typedef long long ll;
 
const int N=600005;
 
int n,p;
int a[N];
int l[N],r[N];
 
int lowbit(int x) {
	return (x&(-x));
}
 
void update(int x,int v){
	while(x <= N-10){
		a[x]+=v;
		x+=lowbit(x);
	}
}
 
int sum(int x){
	int res=0;
	while(x>0){
		res+=a[x];
		x-=lowbit(x);
	}
	return res;
}
 
void solve()
{
	cin>>n>>p;
    vector<int> all;
	for(int i=1;i<=n;i++){
		cin>>l[i]>>r[i];
        all.push_back(l[i]);
        all.push_back(r[i]);
        all.push_back(r[i]+1);
	}
    sort(all.begin(),all.end());
    all.erase(unique(all.begin(),all.end()),all.end());
    auto get=[&](int x){
        return lower_bound(all.begin(),all.end(),x)-all.begin()+1;
    };
    memset(a,0,sizeof a);
	for(int i=1;i<=n;i++){
        int L=get(l[i]);
        int R=get(r[i]+1);
        update(L,1);
        update(R,-1);
	}
    int ans=0;
    for(int i=1;i<=n;i++){
        int dl=sum(get(l[i]));
        int dr=sum(get(r[i]));
        if(abs(dl-dr)>=p )ans++;
    }
	cout<<ans;
}
int main()
{
	IOS
	int T=1;
	while(T--) solve();
	return 0;
}

E 小月的时差

max型瓶颈最短路:

  • 优先队列 Dijkstra:按当前瓶颈值从小到大取点;O((n+m)logn)

  • 或者二分答案 + BFS/DFS 判断连通性;O((n+m)logV)

  • 或者按点权排序后用并查集。O(m α(n) + n log n)

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

#define int long long
const int N=2e5+5; 
int n,m,a,b,ss,tt;
int s1[N],s2[N],val[N],dis[N];
vector<int>e[N];

void bfs1(int s){
	for(int i=1;i<=n;i++) dis[i]=0;
	queue<int>q;
	q.push(s);
	s1[s]=0;
	dis[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto v:e[u]){
			if(!dis[v]){
				dis[v]=1;
				s1[v]=s1[u]+1;
				q.push(v);
			}
		}
	}
}

void bfs2(int s){
	for(int i=1;i<=n;i++) dis[i]=0;
	queue<int>q;
	q.push(s);
	s2[s]=0;
	dis[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(auto v:e[u]){
			if(!dis[v]){
				dis[v]=1;
				s2[v]=s2[u]+1;
				q.push(v);
			}
		}
	}
}

signed main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>m>>a>>b>>ss>>tt;
    for(int i=1;i<=m;i++){
    	int u,v;
    	cin>>u>>v;
    	e[u].push_back(v);
    	e[v].push_back(u);
	}
	bfs1(a);
	bfs2(b);
	
	for(int i=1;i<=n;i++){
		val[i]=abs(s1[i]-s2[i]);
		dis[i]=1e9+7;
	}
	dis[ss]=val[ss];
	
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;
	pq.push({dis[ss],ss});
	
	while(!pq.empty()){
		auto [d,u]=pq.top();pq.pop();
		if(d!=dis[u])continue;
		for(int v:e[u]){
			int nd=max(dis[u],val[v]);
			if(nd<dis[v]){
				dis[v]=nd;
				pq.push({dis[v],v});
			}
		}
	}
	cout<<dis[tt];
	
	return 0;
}

F 小月的订单

前后缀DP合并

相关推荐
Tisfy1 小时前
LeetCode 3644.排序排列:不对则与(脑筋急转弯)
数据结构·算法·leetcode·题解·位运算
lisw052 小时前
分岔论揭示演化突变密码
开发语言·算法·数学建模
aqiu1111113 小时前
C++ TopK:使用 nth_element 快速求最小 K 个数(蓝桥杯 / LeetCode 可用)
算法
Suprman3 小时前
平面排版问题的数学建模与算法设计
算法·数学建模·排序算法·排版套料
FPGA信号处理3 小时前
【应用随机过程】:更新过程与马尔可夫链入门
算法·概率论
重生之小比特3 小时前
【算法拾光】二分查找|在排序数组中查找元素的第一个和最后一个位置 + 搜索旋转排序数组
数据结构·算法·排序算法
吴可可1233 小时前
DXF与AAMA格式转换模块推荐
算法
重生之小比特3 小时前
【算法拾光】二分查找|搜索旋转排序数组 + 寻找旋转排序数组中的最小值
算法
YukiRinLL3 小时前
查找与排序算法:复杂度、稳定性
数据结构·算法·排序算法