Codeforces Round 308 (div 2)

来源:互联网 发布:access数据库的优点 编辑:程序博客网 时间:2024/06/05 10:42

总体叙述:

12’43签到第一题。没什么好说的,求n个矩阵的面积。

44’35第二题完成。由于思路卡断,积分因此有所下降。题意大概是求n以内所有数字位数和,比如1有一位,44有两位。中间出现思路错误的重大失误,开了一个整形数组,想用类似数位dp去统计,然后发现情况巨多巨繁杂。榜上很多人很快过了,说明这题应该没那么难。发现直接除1010就好。原谅我这段时间字符串做得多-_-

中途去看了下第四题,感觉可以做但是比较麻烦。C题做得人多先做C

C题卡死。题意是给一个w和一个m。问是否能用w100次方以内m的幂通过加减运算获得m。很快的想到存在一个n使得wn+1次方剪去前面n个幂的和大于m时,根据等比数列的性质,n+1次方包括它后面的数都不用取了。不要问我是怎么想到的,我只是不想用数组来存大数,太麻烦啦啦啦。WA了两次后发现与其麻烦的讨论从最后一个数还是倒数第二个数开始取,不如直接穷举从哪个数开始取。懒人效应,复杂度1e4小的很。最后的关键卡死,没有想到有些数可以不取。最后发现的时候已经有些慌乱,想不出对策。今早随便一敲,只需要用贪心让每次ansm差的绝对值越来越小就可以了。草草草草草。。。

赛后准备AD

刚刚AD:怎一个草字了得,穷举就能过。。。

A(赛中)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <algorithm>

#include <iostream>

#include <string>

using namespace std;

int main()

{

    int n;

    while(scanf("%d",&n) != EOF){

        int x1,x2,y1,y2;

        int ans = 0;

        for(int i=0; i<n; i++){

            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

            ans += (x2-x1+1) * (y2-y1+1);

        }

        printf("%d\n",ans);

    }

    return 0;

}

B(赛中)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <algorithm>

#include <iostream>

#include <queue>

using namespace std;

typedef long long ll;

ll fi_down(int a)

{

    ll temp = 1;

    while(temp <= a)

        temp *= 10;

    temp = temp / 10;

    temp -= 1;

    return temp;

}

ll fi_dig(int a)

{

    ll ans = 0;

    ll temp = 1;

    while(temp <= a){

        temp *=10;

        ans++;

    }

    return ans;

}

int main()

{

    int n;

    while(scanf("%d",&n) != EOF){

        ll ans = 0;

        while(n){

            ll temp = fi_down(n);

            ll dig = fi_dig(n);

//            printf("temp = %d,dig = %d\n",temp,dig);

            ans += dig * (n - temp);

            n = temp;

        }

        cout << ans<<endl;

    }

    return 0;

}

C(赛后)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <algorithm>

#include <iostream>

#include <limits>

using namespace std;

typedef long long ll;

ll data[100+5];

ll zheng(ll a)

{

    if(a < 0)

        return -a;

    return a;

}

int main()

{

    ll uup = 1e18;

    data[0] = 1;

    int w,m;

    while(scanf("%d%d",&w,&m) != EOF){

        int n = 0;

        ll t1 = w;

        ll t2 = 1;

        while(t1 - (1.0*(1 - t2)/(1-w)) <= m && n+2<=100){

//            printf("first is %I64d,second is %I64d\n",t1,(1-t2)/(1-w));

//            printf("m = %d\n",m);

            data[++n] = t1;

            t1 *= w;

            t2 *= w;

        }

        if(t1 <= uup)

            data[++n] = t1;

//        printf("data\n");

//        for(int i=0; i<=n; i++)

//            printf("%I64d  ",data[i]);

//        printf("\n");

        int flag = 0;

        int ff = 1;

        ll ans = 0;

        for(int j=n; j>=0; j--){

            ff = 1;

            ans = 0;

//            printf("\nj = %d\n",j);

//            ans = data[j];

//            if(j == 0 && ans == w){

//                flag = 1;

//                break;

//             }

            for(int i=j; i>=0; i--){

                if(zheng(ans + ff*data[i] - m) >= zheng(ans - m))

                    continue;

                ans += ff*data[i];

//                printf("for %d,ans = %I64d,ff = %d\n",i,ans,ff);

                if(ans > m)

                    ff = -1;

                else if(ans < m)

                    ff = 1;

                else {

                    flag = 1;

                    break;

                }

            }

            if(flag)

                break;

        }

        if(flag)

            printf("YES\n");

        else

            printf("NO\n");

    }

    return 0;

}

D(赛后)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

const int MAXN = 2000+5;

typedef long long ll;

struct D

{

    int x,y;

}dd[MAXN];

//vector<int>mm;

//int vis[MAXN][MAXN];

bool valid(D a,D b,D c)

{

//    if(b.x == c.x){

//        if(a.x == b.x)

//            return true;

//        return false;

//    }

//    if(a.x == b.x)

//        return false;

    int k1 = (a.y - b.y) * (b.x - c.x);

    int k2 = (b.y - c.y) * (a.x - b.x);

    if(k1 == k2)

        return true;

    return false;

}

int main()

{

    int n;

    while(scanf("%d",&n) != EOF){

//        memset(vis,0,sizeof(vis));

        for(int i=0; i<n; i++)

            scanf("%d%d",&dd[i].x,&dd[i].y);

        ll ans = 0;

        for(int i=0; i<n; i++)

            for(int j=i+1; j<n; j++)

                for(int k = j+1; k<n; k++)

                    if(!valid(dd[i],dd[j],dd[k])){

//                        printf("i = %d,j = %d,k = %d\n",i,j,k);

                        ans++;

                    }

//        for(int i=0; i<n; i++){

//            for(int j=i+1; j<n; j++){

//                if(vis[i][j] == 0){

//                    mm.clear();

//                    mm.push_back(i);

//                    mm.push_back(j);

//                    for(int k = j+1; k<n; k++){

//                        if(valid(dd[i],dd[j],dd[k])){

//                            mm.push_back(k);

//                        }

//                    }

//                    for(int i=0; i<mm.size(); i++){

//                        for(int j=i+1; j<mm.size(); j++){

//                            int t1 = mm[i];

//                            int t2 = mm[j];

//                            vis[t1][t2] = vis[t2][t1] = 1;

//                        }

//                    }

////                    printf("check i = %d, j = %d\n",i,j);

////                    for(int i=0; i<mm.size(); i++)

////                        printf("%d ",mm[i]);

////                    printf("\n");

//                    ll tt = mm.size();

//                    ans += tt * (tt-1) / 2 * (n - tt);

//                }

//            }

//        }

        printf("%I64d\n",ans);

    }

    return 0;

}

 

Codeforces Round 308 (div 2)

总体叙述:

12’43签到第一题。没什么好说的,求n个矩阵的面积。

44’35第二题完成。由于思路卡断,积分因此有所下降。题意大概是求n以内所有数字位数和,比如1有一位,44有两位。中间出现思路错误的重大失误,开了一个整形数组,想用类似数位dp去统计,然后发现情况巨多巨繁杂。榜上很多人很快过了,说明这题应该没那么难。发现直接除1010就好。原谅我这段时间字符串做得多-_-

中途去看了下第四题,感觉可以做但是比较麻烦。C题做得人多先做C

C题卡死。题意是给一个w和一个m。问是否能用w100次方以内m的幂通过加减运算获得m。很快的想到存在一个n使得wn+1次方剪去前面n个幂的和大于m时,根据等比数列的性质,n+1次方包括它后面的数都不用取了。不要问我是怎么想到的,我只是不想用数组来存大数,太麻烦啦啦啦。WA了两次后发现与其麻烦的讨论从最后一个数还是倒数第二个数开始取,不如直接穷举从哪个数开始取。懒人效应,复杂度1e4小的很。最后的关键卡死,没有想到有些数可以不取。最后发现的时候已经有些慌乱,想不出对策。今早随便一敲,只需要用贪心让每次ansm差的绝对值越来越小就可以了。草草草草草。。。

赛后准备AD

刚刚AD:怎一个草字了得,穷举就能过。。。

A(赛中)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <algorithm>

#include <iostream>

#include <string>

using namespace std;

int main()

{

    int n;

    while(scanf("%d",&n) != EOF){

        int x1,x2,y1,y2;

        int ans = 0;

        for(int i=0; i<n; i++){

            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

            ans += (x2-x1+1) * (y2-y1+1);

        }

        printf("%d\n",ans);

    }

    return 0;

}

B(赛中)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <algorithm>

#include <iostream>

#include <queue>

using namespace std;

typedef long long ll;

ll fi_down(int a)

{

    ll temp = 1;

    while(temp <= a)

        temp *= 10;

    temp = temp / 10;

    temp -= 1;

    return temp;

}

ll fi_dig(int a)

{

    ll ans = 0;

    ll temp = 1;

    while(temp <= a){

        temp *=10;

        ans++;

    }

    return ans;

}

int main()

{

    int n;

    while(scanf("%d",&n) != EOF){

        ll ans = 0;

        while(n){

            ll temp = fi_down(n);

            ll dig = fi_dig(n);

//            printf("temp = %d,dig = %d\n",temp,dig);

            ans += dig * (n - temp);

            n = temp;

        }

        cout << ans<<endl;

    }

    return 0;

}

C(赛后)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <algorithm>

#include <iostream>

#include <limits>

using namespace std;

typedef long long ll;

ll data[100+5];

ll zheng(ll a)

{

    if(a < 0)

        return -a;

    return a;

}

int main()

{

    ll uup = 1e18;

    data[0] = 1;

    int w,m;

    while(scanf("%d%d",&w,&m) != EOF){

        int n = 0;

        ll t1 = w;

        ll t2 = 1;

        while(t1 - (1.0*(1 - t2)/(1-w)) <= m && n+2<=100){

//            printf("first is %I64d,second is %I64d\n",t1,(1-t2)/(1-w));

//            printf("m = %d\n",m);

            data[++n] = t1;

            t1 *= w;

            t2 *= w;

        }

        if(t1 <= uup)

            data[++n] = t1;

//        printf("data\n");

//        for(int i=0; i<=n; i++)

//            printf("%I64d  ",data[i]);

//        printf("\n");

        int flag = 0;

        int ff = 1;

        ll ans = 0;

        for(int j=n; j>=0; j--){

            ff = 1;

            ans = 0;

//            printf("\nj = %d\n",j);

//            ans = data[j];

//            if(j == 0 && ans == w){

//                flag = 1;

//                break;

//             }

            for(int i=j; i>=0; i--){

                if(zheng(ans + ff*data[i] - m) >= zheng(ans - m))

                    continue;

                ans += ff*data[i];

//                printf("for %d,ans = %I64d,ff = %d\n",i,ans,ff);

                if(ans > m)

                    ff = -1;

                else if(ans < m)

                    ff = 1;

                else {

                    flag = 1;

                    break;

                }

            }

            if(flag)

                break;

        }

        if(flag)

            printf("YES\n");

        else

            printf("NO\n");

    }

    return 0;

}

D(赛后)

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <iostream>

#include <algorithm>

#include <vector>

using namespace std;

const int MAXN = 2000+5;

typedef long long ll;

struct D

{

    int x,y;

}dd[MAXN];

//vector<int>mm;

//int vis[MAXN][MAXN];

bool valid(D a,D b,D c)

{

//    if(b.x == c.x){

//        if(a.x == b.x)

//            return true;

//        return false;

//    }

//    if(a.x == b.x)

//        return false;

    int k1 = (a.y - b.y) * (b.x - c.x);

    int k2 = (b.y - c.y) * (a.x - b.x);

    if(k1 == k2)

        return true;

    return false;

}

int main()

{

    int n;

    while(scanf("%d",&n) != EOF){

//        memset(vis,0,sizeof(vis));

        for(int i=0; i<n; i++)

            scanf("%d%d",&dd[i].x,&dd[i].y);

        ll ans = 0;

        for(int i=0; i<n; i++)

            for(int j=i+1; j<n; j++)

                for(int k = j+1; k<n; k++)

                    if(!valid(dd[i],dd[j],dd[k])){

//                        printf("i = %d,j = %d,k = %d\n",i,j,k);

                        ans++;

                    }

//        for(int i=0; i<n; i++){

//            for(int j=i+1; j<n; j++){

//                if(vis[i][j] == 0){

//                    mm.clear();

//                    mm.push_back(i);

//                    mm.push_back(j);

//                    for(int k = j+1; k<n; k++){

//                        if(valid(dd[i],dd[j],dd[k])){

//                            mm.push_back(k);

//                        }

//                    }

//                    for(int i=0; i<mm.size(); i++){

//                        for(int j=i+1; j<mm.size(); j++){

//                            int t1 = mm[i];

//                            int t2 = mm[j];

//                            vis[t1][t2] = vis[t2][t1] = 1;

//                        }

//                    }

////                    printf("check i = %d, j = %d\n",i,j);

////                    for(int i=0; i<mm.size(); i++)

////                        printf("%d ",mm[i]);

////                    printf("\n");

//                    ll tt = mm.size();

//                    ans += tt * (tt-1) / 2 * (n - tt);

//                }

//            }

//        }

        printf("%I64d\n",ans);

    }

    return 0;

}

 

0 0
原创粉丝点击