春季第八次

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跑一遍环上最小值

posted @ 2024-05-01 14:03  爱吃湫鰍的喵酱  阅读(43)  评论(0)    收藏  举报