abc183 51nod

2020.11.15写下我atcoder第一次和开始刷51nod的第一篇blog

51nod:3143 整装待发!
这个题会卡精度好恶心,主要是切比雪夫距离和曼哈顿距离之间的转换
将一个点(x,y)的坐标变为(x+y,x−y)后,原坐标系中的曼哈顿距离 = 新坐标系中的切比雪夫距离
将一个点(x,y)的坐标变为((x+y)/2,(x−y)/2) 后,原坐标系中的切比雪夫距离 = 新坐标系中的曼哈顿距离

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
double a[N],b[N],c[N],d[N];
int q[N],w[N];
int main()
{
    int n;
    //cin>>n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        double x,y;
        //cin>>x>>y;
        scanf("%lf%lf",&x,&y);
        q[i]=x;
        w[i]=y;
        a[i]=(x+y)/2;//排序求中位数的曼哈顿距离
        c[i]=(x+y)/2;
        b[i]=(x-y)/2;//排序求中位数的曼哈顿距离
        d[i]=(x-y)/2;
    }
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    double  x,y;
    ll sum=0;
    if(n%2==1)
    {
        x=a[n/2];
        y=b[n/2];
    }
    else
    {
        x=(a[n/2]+a[n/2+1])/2;
        y=(b[n/2]+b[n/2+1])/2;
    }
    if((x==(int)(x))&&(y==int(y)))//恰好中位数是整数
    {

        for(int i=1; i<=n; i++)
        {
            sum+=(abs(c[i]-x)+abs(d[i]-y));
        }
        //cout<<sum<<endl;
        printf("%lld",sum);
    }
    else
    {
        ll ans1=0,ans2=0,ans3=0,ans4=0;//不是整数的四种情况
        int a=x+y,b=x-y;
        for(int i=1; i<=n; i++)
        {
            ans1+=max(abs(q[i]-(int)a),abs(w[i]-(int)b));
        }
        for(int i=1; i<=n; i++)
        {
            ans2+=max(abs(q[i]-(int)a-1),abs(w[i]-(int)b));
        }
        for(int i=1; i<=n; i++)
        {
            ans3+=max(abs(q[i]-(int)a-1),abs(w[i]-(int)b-1));
        }
        for(int i=1; i<=n; i++)
        {
            ans4+=max(abs(q[i]-(int)a),abs(w[i]-(int)b-1));
        }
        sum=min(min(min(ans1,ans2),ans3),ans4);
        //cout<<sum<<endl;
        printf("%lld",sum);
    }
    return 0;
}

atcoder 183
F启发式合并只要用个map记录每个组几班的有多少个然后合并的时候把小的往大的合并就好了

#include<bits/stdc++.h>
#define fp(i,a,b) for(int i=a;i<=b;i++)
typedef long long ll;
typedef double dl;
using namespace std;

const int N=2e5+7;
const ll M=1e9+7;
const int INF=0x3f3f3f3f;

int f[N],c[N],sz[N];
map<int,int> ve[N];

int find(int x)
{
    if(f[x]!=x)
    f[x]=find(f[x]);
    return f[x];
}

void merge(int x, int y) 
{
    x = find(x), y = find(y);
    if (x == y) return;
    if (sz[x] > sz[y]) swap(x, y);
    f[x] = y;
    for (auto i : ve[x])
        ve[y][i.first] += i.second;
    ve[x].clear();
    sz[y] += x;
}
void solve()
{
    int n,q;
    scanf("%d%d",&n,&q);    
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=n;i++) 
    {
        scanf("%d",&c[i]);
        sz[i]=1;
        ve[i][c[i]]++;
    }
    for(int i=1;i<=q;i++)
    {
        int op,x,y;
        scanf("%d%d%d",&op,&x,&y);
        if(op==1)
        {
            merge(x,y);
        }
        else {
            int z=find(x);
            cout << ve[z][y] << endl;
        }
    }
}

int main()
{
    //ios::sync_with_stdio(0);
    //cin.tie(0),cout.tie(0);
    //int T; scanf("%d",&T)
    //for(int i=1;i<=T;i++)
        solve();
}
全部评论

相关推荐

点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务