链接
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
*/