AtCoder Regular Contest 090

C - Candies
链接:https://arc090.contest.atcoder.jp/tasks/arc090_a
题意:求矩形左上角到右下角的最大元素和(走动路径只能是向右或者向下)
分析:dfs,也可以是dp

【dfs】代码:

#include <bits/stdc++.h>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define pb push_back
#define IO ios::sync_with_stdio(false)
#define fre freopen("in.txt","r",stdin)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
const double PI=acos(-1.0);
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const int MOD=1e8;
const int N=13;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1};
vector<vector<int> >vec;
int n;
int dfs(int i, int j)
{
    if (i == 2 || j == n) return 0;
    else if (i == 1 && j == n-1) return vec[i][j];
    else return max(dfs(i+1,j),dfs(i,j+1))+vec[i][j];
}
int main()
{
    //fre;
    IO;
    vector<int>a;
    int x;
    while(cin >> n)
    {
        rep(i,0,2)
        {
            rep(j,0,n)
            {
                cin >> x;
                a.pb(x);
            }
            vec.pb(a);
            a.clear();
        }
        cout<<dfs(0,0)<<endl;
        vec.clear();
    }
    return 0;
}

D - People on a Line
链接 :https://arc090.contest.atcoder.jp/tasks/arc090_b
题意:给定N个人(N个人位于x轴上,坐标范围[0,1e9]),M条信息,
信息格式:Li Ri Di 意思是编号为Ri的人距离编号为Li的人Di(Ri在Li右侧)
问给出的信息是否合法?
N范围是[1,1e5] ,M范围是[1,2e5]

分析: 感觉这英文原文怕也是谷歌百度的。。 虽然还能看懂
看到题目,第一感觉几何。。 想着证三点是否在同一直线。 数据大了,不行把OoO
换个思路,可以是一个森林,(不一定是树) 然后找根,并查集,好像可以OoO
这里比裸并查集多一个权值,也就是题中的距离。。 用一个数组记录权值
写法和并查集有些区别,因为加了一个权
拙见。。 部分参考代码。
【加权并查集】
代码:

#include <bits/stdc++.h>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define pb push_back
#define IO ios::sync_with_stdio(false)
#define fre freopen("in.txt","r",stdin)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
const double PI=acos(-1.0);
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const int MOD=1e8;
const int N=1e5+5;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1};
ll n,m;
ll fa[N],val[N];
///fa[i]表示i的根节点
ll Find(ll x)///递归找根结点  并计算权值
{
    if(fa[x]==-1) return x;///fa[x]==-1 表示该节点无父节点
    ll root=Find(fa[x]);
    val[x]+=val[fa[x]];
   // cout<<"x="<<x<<"  root="<<root<<endl;
    return fa[x]=root;
}
int main()
{
    //fre;
    IO;
    while(cin>>n>>m)
    {
        mem(fa,-1);
        rep(i,1,m+1)
        {
            ll u,v,w;
            cin>>u>>v>>w;
            ll tmp1=Find(u);
            ll tmp2=Find(v);
         //   cout<<"tmp1="<<tmp1<<"  tmp2="<<tmp2<<endl;
            if(tmp1!=tmp2)
            {
                val[tmp1]=val[v]-w-val[u];
                fa[tmp1]=tmp2;///u的根节点置为 v的根节点
            }
            else if(val[v]-val[u]!=w)///不满足题意
            {
                cout<<"No\n";
                return 0;
            }
        }
        cout<<"Yes\n";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值