代码风格,习惯

这两段代码展示了C++中的编译器优化技巧和高效数据结构的使用。第一段利用并行优化和自定义编译参数实现图的并查集算法,优化了边的存储和查找。第二段通过匿名函数和排序处理数组,实现了根据特定条件筛选和赋值的解决方案。这些技巧在算法竞赛和实际编程中都有广泛应用。
摘要由CSDN通过智能技术生成

摘录的别人的代码,有些是从cf里面摘录下来的,不记得是谁的了,抱歉

原文章

#pragma GCC optimize("-Ofast","-funroll-all-loops")
//将括号里的字符串带入编译参数,相当于可以自定义编译参数。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,m,res[N],ans,f[N],sz[N];
vector<pair<int,int> > v[N];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
signed main(){
	cin>>n>>m;
	for(int i=1,a,b,c;i<n;i++)	scanf("%lld %lld %lld",&a,&b,&c),v[c].push_back({a,b});
//在for里面就把a,b,c给定义了
//这里用vector存边不得不说很巧妙,v[c]代表以c为权值的边集合,
//再用pair存边的两个端点,不得不说这数据结构设计得十分牛掰
	for(int i=1;i<=n;i++)	f[i]=i,sz[i]=1;
	for(int i=1;i<=2e5;i++){
		for(auto j:v[i]){//这个我也表示学到了学到了
			int x=find(j.first),y=find(j.second);
			ans+=sz[x]*sz[y];	f[x]=y,sz[y]+=sz[x];
		}
		res[i]=ans;
	}
	for(int i=1,x;i<=m;i++)	scanf("%lld",&x),printf("%lld ",res[x]);
	//在for里面定义变量x,这样子就不用在scanf前面加一行x的定义了
	//学到了学到了
	return 0;
}

#include <bits/stdc++.h>
using i64 = long long;
//相当于typedef起别名,用i64替代long long
void solve() {
    int n, k;
    std::cin >> n >> k;
    std::vector<int> a(n), cnt(n);
    //括号n开辟空间n并初始化为0
    std::vector<int> p;
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
        a[i]--;
        cnt[a[i]]++;
        if (cnt[a[i]] <= k) {
            p.push_back(i);
        }
    }
    while (int(p.size()) % k != 0) {
        p.pop_back();
    }
    std::sort(p.begin(), p.end(), [&](int i, int j) { return a[i] < a[j]; });
    //C++11新特性匿名函数
    //让无序字符串有序,方便处理,同时记录每个数组原始下标即可
    std::vector<int> ans(n);
    //前n个初始化为0
    for (int i = 0; i < int(p.size()); i++) {
        ans[p[i]] = i % k + 1;
    }
    for (int i = 0; i < n; i++) {
        std::cout << ans[i] << " \n"[i == n - 1];
//i==n-1为真,表达式为1,输出字符串“ \n”[1],即'\n'并且" \n"[0]=' ';
    }
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int t;
    std::cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marhoosh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值