您的位置:首页 > 其它

AtCoder Regular Contest 090

2018-01-28 22:51 405 查看
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
,val
;
///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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  atcoder regular