2018年4月28日训练日记

本文回顾了一次编程比赛的经历,详细介绍了团队合作的过程与技术挑战。特别提到了使用Java解决问题的策略,以及如何通过二分法高效解决难题。此外,还分享了利用set进行值更新的高级技巧。

  周五带伤回来的第一次比赛其实感觉并不好,全场就用java在划水了,都是队友给说的思路,除了自己出了一个水题,全场都在伤口炸裂的痛苦之中。总之学了java还是有用的,但是这场比赛的效果其实并不怎么好,虽然出了七道题,但又两三道都是听到别的队讨论我们也就往那个方向想才出来的。

  但是周六换了中文题之后立马不一样了,各种高效率的配合,g题窑子没做出来,讲了一遍题意之后,一会我就1a了,然后最近看的二分也起到了大的作用,f题明显一眼就看出来是个二分了,虽然正解好像不是二分,但是确实是一个经典的二分题目,然后就是e题和世东打了个配合,我出思路,他出代码,然后b题又和窑子打了个配合,这个题目其实不简单,一开始我们想的是矩阵快速幂,然后我们分开推了矩阵,我是正向找加了多少,他是逆向找减少了多少,最终都推出了合理的矩阵, 然后发现矩阵快速幂不能解决问题,首先结构体内开不了怎么大的数组,其次,复杂度明显不够用,但是样例明显可以过。然后窑子在他的矩阵里发现了规律,是一个杨辉三角,又是一顿配合,逆元加组合数打表,最后出了这个题。最后k题思路对了,可能再多给一会就出来了,总之这场比赛还是比较舒服的一次,比其他队多两到三道题。老纪用set很六,他那个东西我也打算学学,值的修改真的做不到那么天马行空,虽然他每次都得现查资料,我一次学会他就行了,这里拓下老纪的代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 8000000000000
#define ll long long
#define mod 1000000007
using namespace std;
ll nian[100010], v[100010];
set< pair<ll,ll> > st;
vector<pair<ll,ll> > G[100010];
void init()
{
    for(int i=0;i<100010;i++)
    {
        G[i].clear();
        nian[i]=v[i]=0;
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m,i;
        cin>>n>>m;
        init();
        st.clear();
        for(i=0;i<m;i++)
        {
            ll x,y,z;
            cin>>x>>y>>z;
            G[x].push_back(pair<ll,ll>(y,z));
            G[y].push_back(pair<ll,ll>(x,z));
            nian[x]+=z;
            nian[y]+=z;
        }
        for(i=1;i<=n;i++)
            st.insert(pair<ll, ll>(nian[i], i));
        ll ans=0;
        while(!st.empty())
        {
            set< pair<ll,ll> >::iterator it=st.begin();
            pair<ll,ll> now=*it;
            st.erase(it);
            ans=max(ans,now.first);
            ll x=now.second;
            v[x]=1;
            for(i=0;i<G[x].size();i++)
            {
                pair<ll,ll> food=G[x][i];
                if(v[food.first])
                    continue;
                ll u=food.first;
                it=st.lower_bound(pair<ll,ll>(nian[u],u));
                st.erase(it);
                nian[u]-=food.second;
                st.insert(pair<ll,ll>(nian[u],u));
            }
        }
        cout<<ans<<endl;
    }
}
  这个应该是f题正解的思路,贪心,当时是想到了,但是不会更新就没这样写,我什么时候才能怎么优秀的使用这个玩意,虽然大一学c++的时候感觉这都是常规操作啊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值