Codeforces Round #743 (Div. 2) 总结B,C

链接
B
题目要求;
对于b组数中的每一个x,在a中找所有比x小的数的最小权值
模拟办法:
扫b,对于a,一直加到所有小于b的条件的,优先队列维护最小值

/*new year!*/
#include <iostream>
#include <cstring>
#include <string>
#include<map>
#include<queue>
#include<set>
#include<algorithm>
#include<stack>
#include<cmath>
#include<vector>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define cd(a) scanf("%d", &a)
#define ll long long
#define PII pair<int, int>
#define _for(i, a, b) for (int i = a; i < b; i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define ms(a,b) memset(a, b, sizeof a)
#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) a / gcd(a, b) * b
#define INF 0x3f3f3f3f
using namespace std;
const int N = 2e5+10,mod=1e9+7;

int dis[N];

void sov(){
	int n;
	cin >> n;
	For(i, 1, n) {
		int t;
		cin >> t;
		dis[t] = i;
	};
	int ans = INF;
	int now =1;
	priority_queue<int,vector<int>,greater<int>> pq;
	For(i, 1, n) {
		int t;
		cin >> t;
		while(now<t){
			pq.push(dis[now]);
			now += 2;
		}
		int smd = pq.top();
		ans = min(ans, smd - 1 + i - 1);
	}
	cout << ans << endl;
}	


signed main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif

	int OvO;
	cin >> OvO;
	while(OvO--){
		sov();
	}

	return 0;
}

C
拓扑排序,稍微修改一下
什么时候会需要下一次呢?
我现在要加的下一个t要是比我用来更新的u,要小,那它就在下一次
样例图
:
在这里插入图片描述

/*new year!*/
#include <iostream>
#include <cstring>
#include <string>
#include<map>
#include<queue>
#include<set>
#include<algorithm>
#include<stack>
#include<cmath>
#include<vector>
#define debug(a) cout<<#a<<"="<<a<<endl;
#define cd(a) scanf("%d", &a)
#define ll long long
#define PII pair<int, int>
#define _for(i, a, b) for (int i = a; i < b; i++)
#define For(i, a, b) for (int i = a; i <= b; i++)
#define foR(i, b, a) for (int i = b; i >= a; i--)
#define ms(a,b) memset(a, b, sizeof a)
#define gcd(a, b) __gcd(a, b)
#define lcm(a, b) a / gcd(a, b) * b
#define INF 0x3f3f3f3f
using namespace std;
const int N = 2e5+10,mod=1e9+7;

int n,du[N];
int ans;
vector<int> e[N];

bool tp(){
  
  int cnt = 0;
  priority_queue<int, vector<int>, greater<int>> q,nq;
  
  for (int i = 1; i <= n;i++){
  	if(!du[i]){
  		q.push(i);
  		cnt++;
  	}
  }

  while(!q.empty()){
  	int u = q.top();
  	q.pop();
  	for(auto t:e[u]){
  		if(--du[t]==0){
  			cnt++;
  			if(t<u){
  				nq.push(t);
  			}else{
  				q.push(t);
  			}
  		}
  	}
  	if(q.empty()&&!nq.empty()){
  		ans++;
  		q = nq;
  		while(!nq.empty())
  			nq.pop();
  	}
  }
  
  return cnt == n;
}

void sov(){
  ans = 1;
  
  cin >> n;
  For(i, 1, n) e[i].clear();
  For(i,1,n){
  	int k;
  	cin >> k;
  	du[i] = k;
  	For(j,1,k){
  		int v;
  		cin >> v;
  		e[v].push_back(i);
  	}
  }
  
  if(tp()){
  	cout << ans << endl;
  }else
  	puts("-1");
}	


signed main(){
  #ifndef ONLINE_JUDGE
  freopen("in.txt","r",stdin);
  #endif

  int OvO;
  cin >> OvO;
  while(OvO--){
  	sov();
  }

  return 0;
}
/*
2
-1
1
2
5
8
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值