cf419 (div2)3/5

因为这场比赛是在寝室打的,所以写法都挺蠢的。。。不过也是我第一次过了cf5题时的三题,虽然感觉c题是我打的这几场里最简单的c题。

A:用的最蠢的办法

直接+,程序自己判断进位,然后判断回文。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int check(int m,int n)
{
    char s[10],v[10];
    int num = 0;
    s[num++] = m/10+'0', s[num++] = m%10 + '0';
        s[num++] = n/10 +'0', s[num++] = n%10 + '0';
    s[num] = '\0';

    for(int i = 0; i < num; i++)
        v[i] = s[num-i-1];
    v[num] = '\0';
    if(strcmp(s,v) == 0 )return 1;
    else return 0;
}
int main()
{
    int m,n;
    scanf("%d:%d",&m,&n);
    int temp = 0;
    for(int i = 0; i < 2400*60; i++)
    {
        if(check(m,n))
        { temp = i; break;}

        //else n++;
        n++;
        if(n == 60) m++, n = 0;
        if(m == 24) m = 0;
    }
    printf("%d\n", temp);
    return 0;
}


B: 我是用的线段树维护,只能保证不超时,实际上线段树还写搓了一次,tle了,后10分钟我把我的代码锁了去看别人的代码,发现别人的代码意外的简洁,之后会学习。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 2e5+10;
int data[maxn][2];
int num[maxn << 2];
int tag[maxn << 2];
int v[maxn << 2];
int n,k,q;

void add(int al,int ar,int id,int l,int r)
{
    if(ar < l || al > r) return;
    if(l >= al && r <= ar )
    {
        tag[id] += 1;
        num[id] += (r-l+1);
        return;
    }
    int m = l+r>>1;
    if(tag[id])
    {
        num[id << 1] += (m-l+1)*tag[id];
        num[id << 1|1] += (r-m)*tag[id];

        tag[id << 1] += tag[id];
        tag[id << 1 | 1] += tag[id];

        tag[id] = 0;
    }

    if(al <= m) add(al,ar, id<<1,l,m);
    if(ar > m) add(al,ar,id<<1|1,m+1,r);

    num[id] = num[id<<1] + num[id<<1|1];
}


int use(int id,int l,int r)
{
    if(l == r)
    {
        if(num[id] >= k)
            v[id] = 1;
        else v[id] = 0;
        return 1;
    }
    int m = l+r>>1;


    if(tag[id])
    {
        num[id << 1] += (m-l+1)*tag[id];
        num[id << 1|1] += (r-m)*tag[id];

        tag[id << 1] += tag[id];
        tag[id << 1 | 1] += tag[id];

        tag[id] = 0;
    }

    use(id<<1,l,m);
    use(id<<1|1,m+1,r);

    v[id] = v[id<<1] + v[id<<1|1];


}
int qu(int ql,int qr,int id,int l,int r)
{
    if(qr < l || ql > r) return 0;
    if(l >= ql && r <= qr ) return v[id];
    int m = l+r>>1;

    int ans = 0;
    if(ql <= m)  ans += qu(ql,qr,id<<1,l,m);
    if(qr > m) ans += qu(ql,qr,id<<1|1,m+1,r);

    return ans;
}
int main()
{

    scanf("%d%d%d",&n,&k,&q);
    int r = maxn;
    for(int i = 0; i < n ; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b,1,1,r);

        //r = max(r,b);
    }
    r = maxn;
    //for(int i = 0; i < n; i++)
    //    add(data[i][0],data[i][1],1,1,r);

    use(1,1,r);
    for(int i = 0; i < q; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",qu(a,b,1,1,r));
    }
    return 0;
}



C:讲真我自己都是蒙的,不知道自己的思路在哪里,我的做法大致是先看每行的最小值,然后每行减去这个最小值,之后看列。 对列也要进行一遍。在第一遍交的时候被hack了,这个hack也提醒了我行和列如果优先考虑列的情况,如果不是这个hack,我可能直接就去睡觉了。当然这也就导致代码写的特别。。丑。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 105;
const int inf = 0x3f3f3f3f;
int g[maxn][maxn],h[maxn][maxn],g1[maxn][maxn];
int row[maxn][2],col[maxn][2];
int ansr[maxn][2], ansc[maxn][2];
int main()
{
    //freopen("D://in.txt","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
        scanf("%d",&g[i][j]);
    memcpy(g1,g,sizeof(g));

    int ans1 = 0;
    for(int i = 1; i <= n; i++)
    {
        int imin = inf;
        for(int j = 1; j <= m; j++)
            imin = min(imin,  g[i][j]);
        for(int j = 1; j <= m; j++)
            g1[i][j] -= imin;
        row[i][0] = imin;
        ans1 += imin;
    }
    for(int j = 1; j <= m; j++)
    {
        int imin = inf;
        for(int i = 1; i <= n; i++)
            imin = min(imin, g1[i][j]);
        col[j][0] = imin;
        ans1 += imin;
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
            h[i][j] += row[i][0];
    }
    for(int j = 1 ; j <= m; j++)
    for(int i = 1 ; i <= n; i++)
        h[i][j] += col[j][0];
    int mark = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(h[i][j] != g[i][j])
                {mark = 1;break;}
        }
        if(mark) break;
    }

    int ans2 = 0,flag = 0;
    memcpy(g1,g,sizeof(g));
    memset(h,0,sizeof(h));
    for(int j = 1; j <= m; j++)
    {
        int imin = inf;
        for(int i = 1; i <= n; i++)
            imin = min(imin,  g[i][j]);
        for(int i = 1; i <= n; i++)
            g1[i][j] -= imin;
        col[j][1] = imin;
        ans2 += imin;
    }
    for(int i = 1; i <= n; i++)
    {
        int imin = inf;
        for(int j = 1; j <= m; j++)
            imin = min(imin, g1[i][j]);
        row[i][1] = imin;
        ans2 += imin;
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
            h[i][j] += row[i][1];
    }
    for(int j = 1 ; j <= m; j++)
    for(int i = 1 ; i <= n; i++)
        h[i][j] += col[j][1];
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(h[i][j] != g[i][j])
                {flag = 1;break;}
        }
        if(flag) break;
    }

    if(mark && flag) printf("-1\n");
    else if(!mark && flag)
    {
        cout<<ans1<<endl;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < row[i][0]; j++)
                cout<<"row "<<i<<endl;
        }
        for(int j = 1; j <= m; j++)
            for(int i = 0; i < col[j][0]; i++ )
                cout<<"col "<<j<<endl;
    }
    else if(mark && !flag)
    {
        cout<<ans2<<endl;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < row[i][1]; j++)
                cout<<"row "<<i<<endl;
        }
        for(int j = 1; j <= m; j++)
            for(int i = 0; i < col[j][1]; i++ )
                cout<<"col "<<j<<endl;
    }
    else
    {
        int id = ans1 > ans2 ? 1 : 0;
        cout<<min(ans1,ans2)<<endl;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < row[i][id]; j++)
                cout<<"row "<<i<<endl;
        }
        for(int j = 1; j <= m; j++)
            for(int i = 0; i < col[j][id]; i++ )
                cout<<"col "<<j<<endl;
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值