春季第八次
5.1
1[ABC195B] Many Oranges
确定枚举范围即可
需要在给定的限制条件下找到满足条件的最优解或可行解的范围
2[ABC196C] Doubled
枚举1e6即可 然后判断 有点像构造
3[ABC256C] Filling 3x3 array 有点像构造爆搜
直接dfs(x) 一次构造出三个数字
4
[ABC256D] Union of Interval
利用差分和前缀和解决区间覆盖问题
几个区间合并和几个区间合并后的空集
0(n)
include<bits/stdc++.h>
using namespace std;
define int long long
const int N=2e5+10;
int a[N];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
a[l]++;
a[r]--;
}
int pre=0;
for(int i=1;i<=200000;i++){
a[i]+=a[i-1];
if(a[i]>0){
if(pre==0)pre=i;
}
else {
if(pre)cout<<pre<<" "<<i<<endl;
pre=0;
}
}
}
include<bits/stdc++.h>
using namespace std;
define int long long
const int N=2e5+10;
int a[N];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
a[l]++;
a[r]--;
}
int pre=0;
int flag=0;
for(int i=1;i<=20000;i++){
a[i]+=a[i-1];
if(a[i]==0){
if(!flag){
flag=1;
pre=i;
}
}
else {
if(flag){
cout<<pre<<" "<<i<<endl;
flag=0;
}
}
}
// 处理最后一个gap,如果最后的区间一直到200000都是gap
if(inGap && pre != 0) {
cout << pre << " " << 200001 << endl; // 假设区间可以到200000
}
}
/*
3
10 20
20 30
40 50
*/
5[ABC256E] Takahashi's Anguish 基环树森林
include<bits/stdc++.h>
using namespace std;
define int long long
const int N=2e5+10;
int a[N]; // 存储每个人应该得到糖果的下一个人的编号
int c[N]; // 存储每个人的烦恼值
int vis[N]; // 访问标记数组,用于标记每个人被访问的循环编号
signed main(){
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i]; // 输入每个人的下一个人的编号
for (int i = 1; i <= n; i++) cin >> c[i]; // 输入每个人的烦恼值
int ans = 0;
for (int i = 1; i <= n; i++) {
if (vis[i]) continue; // 如果这个人已经被访问过,则跳过
int u = i;
while (1) {
vis[u] = i; // 标记当前人u为已访问,并记录是在第i个循环中访问的
u = a[u]; // 移动到下一个人
if (vis[u]) { // 如果下一个人已经被访问过
if (vis[u] == i) { // 并且是在当前循环中被访问过,说明找到了一个环
int now = c[u]; // 初始化最小烦恼值为环的起点的烦恼值
for (int v = a[u]; v != u; v = a[v]) { // 遍历环中的其他人
now = min(now, c[v]); // 更新最小烦恼值
}
ans += now; // 将环的最小烦恼值加到总答案中
}
break; // 无论是否找到环,都应该退出循环
}
}
}
cout << ans << endl; // 输出最终的答案
return 0;
}
把环上的数全都标记完,检测到已经标记的点,再进入vis[u]==i跑一遍环上最小值

浙公网安备 33010602011771号