Wannafly挑战赛3

B


#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e18 + 10;
LL n, m, k;
LL num[qq];
 
int main(){
    scanf("%lld%lld%lld", &n, &m, &k);
    for(int i = 1; i <= n; ++i) {
        scanf("%lld", num + i);
    }
    double dis = k * 1.0 / 1000;
    sort(num + 1, num + 1 + n);
    LL minx = ceil(dis / (num[n] + m) * 60 * 60), maxn = ceil(dis / (num[1] + m) * 3600);
    printf("%lld %lld\n", minx, maxn);
    return 0;
}


C

观察(ai, aj)可知就两种关系ai <= aj,ai > aj,最初我的思路是分两部分,第一部分固定ai,统计所有ai > aj的贡献,第二部分固定aj,统计所有ai <= aj的贡献,本以为multiset可以完成这个操作,问了学长才知道不可以,得写任意平衡树,弱鸡不会啊,看题解才发现这个顺序是无意义的,排序之后统计出所有情况即可

#include<bits/stdc++.h>
 
#define LL long long
 
using namespace std;
const int qq = 1e5 + 10;
int num[qq];
int getNum(int x) {
    if(x == 0)  return 10;
    int ans = 1;
    int tmp = x;
    while(tmp > 0) {
        ans *= 10;
        tmp /= 10;
    }
    return ans - x;
}
int getDigit(int x) {
    if(x == 0)  return 1;
    int ans = 0;
    while(x > 0) {
        ans++;
        x /= 10;
    }
    return ans;
}
 
int main() {
    int n;  scanf("%d", &n);
    LL b = 0;
    for(int i = 0; i < n; ++i) {
        scanf("%d", num + i);
        b += 1LL * (n - i - 1) * (getDigit(num[i]));
    }
    LL a = 0;
    sort(num, num + n);
    for(int i = n - 1; i > 0; --i) {
        int k = lower_bound(num, num + i, getNum(num[i])) - num;
        int x = (i - k), y = (i - x);
        a += (getDigit(num[i]) + 1LL) * x;
        a += (getDigit(num[i]) * 1LL) * y;
    }
//  printf("%lld %lld\n", a, b);
    printf("%lld\n", a - b);
}

D

n^2的预处理n^3的枚举

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
 
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)   memset(a, b, sizeof a)
#define REP(i, x, n)    for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 505 + 10;
const LL INF = 1e18 + 10;
 
char ct[qq][qq];
int X[qq][qq], O[qq][qq];
int x[4], y[4];
int dx[4] = {1, -1, 1, -1};
int dy[4] = {1, 1, -1, -1};
int n, m;
int Dfs(int s, int e) {
    for(int i = 0; i < 4; ++i) {
        x[i] = s, y[i] = e;
    }
    int ans = 1;
    int cnt = 0;
    while(1) {
        bool f = true;
        cnt++;
        for(int i = 0; i < 4; ++i) {
            x[i] += dx[i];
            y[i] += dy[i];
            if(x[i] < 1 || x[i] > n || y[i] < 1 || y[i] > m)    f = false;
        }
        if(ct[x[0]][y[0]] != 'O' || ct[x[1]][y[1]] != 'O')  f = false;
        if(ct[x[2]][y[2]] != 'X' || ct[x[3]][y[3]] != 'X')  f = false;
        if(!f)  break;
        if((x[0] - x[1] + 1) == (O[x[0]][y[0]] - O[x[1] - 1][y[1]]) && (x[2] - x[3] + 1) == (X[x[2]][y[2]] - X[x[3] - 1][y[3]])) {
            ans = max(ans, cnt * 2 + 1);
        }
    }
    return ans;
}
 
int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) {
        scanf("%s", ct[i] + 1);
    }
    for(int j = 1; j <= m; ++j) {
        for(int i = 1; i <= n; ++i) {
            X[i][j] = X[i - 1][j];
            O[i][j] = O[i - 1][j];
            if(ct[i][j] == 'X') X[i][j]++;
            else O[i][j]++;
        }
    }
    int maxn = 0;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            if(ct[i][j] == 'O') continue;
            maxn = max(maxn, Dfs(i, j));
        }
    }
    printf("%d\n", maxn);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值