Codeforces Round #517 (Div. 2)

A

#include<queue> 
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#define rep(a,b,c) for(int a = b; a <= c;++ a) 
#define per(a,b,c) for(int a = b; a >= c; -- a) 
#define gc getchar() 
#define pc putchar
inline int read() { 
    int x = 0,f = 1;
    char c = gc; 
    while(c < '0' || c >'9'){ if(c == '-') f = -1; c = gc; } 
    while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc; 
    return x * f; 
} 
void print(int x) {
    if(x < 0) { 
        pc('-'); x = -x; 
    } 
    if(x >= 10) print(x / 10); 
    pc(x % 10 + '0') ; 
} 

int main() { 
    int n = read(),m =read(),k = read();
    int xu=1,xd=n,yu=1,yd=m,ans=0;
    while(k --)  { 
        if(xu>xd || yu > yd) break;
        ans += 2 * (xd - xu + 1) + 2 * (yd - yu + 1) - 4;
        xd -=2 , xu += 2, yd -= 2, yu += 2; 
    }
    print(ans); 
    return 0;
}

B

枚举尾项往前推

#include<queue> 
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#define rep(a,b,c) for(int a = b; a <= c;++ a) 
#define per(a,b,c) for(int a = b; a >= c; -- a) 
#define gc getchar() 
#define pc putchar
inline int read() { 
    int x = 0,f = 1;
    char c = gc; 
    while(c < '0' || c >'9'){ if(c == '-') f = -1; c = gc; } 
    while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc; 
    return x * f; 
} 
void print(int x) {
    if(x < 0) { 
        pc('-'); x = -x; 
    } 
    if(x >= 10) print(x / 10); 
    pc(x % 10 + '0') ; 
} 
int n,k; 
const int maxn = 100007; 
int a[maxn][2],b[maxn][2],ans[maxn][2];
bool Check() { 
    for(int i = n - 1;i;-- i) 
        for(int j = 0;j < 2;++ j) {  
            if(a[i][j] && b[i][j]) { 
                if(!ans[i + 1][j]) return false; 
                ans[i][j] = 1;
            } 
            else if(!a[i][j] && !b[i][j]) { 
                if(ans[i + 1][j]) return false ; 
                ans[i][j] = 0; 
            } 
            else if(!a[i][j] && b[i][j]) return false; 
            else if(a[i][j] && !b[i][j])  { 
                if(ans[i + 1][j]) ans[i][j] = 0; 
                else ans[i][j] = 1; 
            } 
        } 
    for(int i = 1;i < n;++ i) 
        for(int j = 0;j < 2;++ j)
            if((a[i][j] != (ans[i][j] | ans[i + 1][j])) || (b[i][j] != (ans[i][j] & ans[i + 1][j])))
                return false; 
    puts("YES");  
    for(int i = 1;i <= n;++ i) print(ans[i][1] * 2 + ans[i][0]),pc(' ');   
    return true; 
}

int main() { 
    n=read();
    for(int i =1,ai;i < n;++ i) { 
        ai = read(); 
        a[i][0] = ai & 1;
        a[i][1] = ai >> 1 & 1; 
    } 
    for(int i=1,bi;i < n;++ i)  { 
        bi = read(); 
         b[i][0]=bi&1;
         b[i][1] = bi >> 1 & 1; 
    } 

    ans[n][0] = 0, ans[n][1] = 0; 
    if(Check())return 0; 
    ans[n][0] = 0, ans[n][1] = 1; 
    if(Check())return 0;
    ans[n][0] = 1, ans[n][1] = 0; 
    if(Check())return 0;
    ans[n][0] = 1, ans[n][1] = 1; 
    if(Check())return 0; 
    puts("NO"); 

    return 0;
}

C

二分最大能构成的1-n

#include<queue> 
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#define rep(a,b,c) for(int a = b; a <= c;++ a) 
#define per(a,b,c) for(int a = b; a >= c; -- a) 
#define gc getchar() 
#define pc putchar
inline int read() { 
    int x = 0,f = 1;
    char c = gc; 
    while(c < '0' || c >'9'){ if(c == '-') f = -1; c = gc; } 
    while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc; 
    return x * f; 
} 
void print(int x) {
    if(x < 0) { 
        pc('-'); x = -x; 
    } 
    if(x >= 10) print(x / 10); 
    pc(x % 10 + '0') ; 
} 
int tot = 0; 
const int maxn = 10000007; 
int ans1[maxn],a1,ans2[maxn],a2,vis[maxn];  
int A,B,n,m; 
bool judge(int x)  { 
    int a = A,b = B;
    while(x) {
        if(a < b) std::swap(a,b);
        if(a < x) return false;
        a -= x, -- x;
    } 
    return true;
}

int main() { 
    A = read(),B = read(),n = 0,m = 0; 
    int l=0,r=1e6,mid,ans=0;
    while(l <= r) { 
        if(judge(mid = l + r >> 1)) l = mid + 1,ans = mid; 
        else r = mid - 1; 
    }
    for(int i = ans;i; -- i) 
        if(A < B) B -= i, ans2[++ m] = i;  
        else A -= i, ans1[++ n] = i; 
    print(n); 
    pc('\n'); 
    for(int i = n;i;-- i) print(ans1[i]),pc(' '); pc('\n');
    print(m);
    pc('\n'); 
    for(int i=m; i; --i) print(ans2[i]),pc(' '); pc('\n');

    return 0;
}

D

找到最远的能使得前缀为a的点,bfs求字典序最小路径

#include<vector> 
#include<queue> 
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
using namespace std; 
#define rep(a,b,c) for(int a = b; a <= c;++ a) 
#define per(a,b,c) for(int a = b; a >= c; -- a) 
#define gc getchar() 
#define pc putchar
#define pr pair<int,int> 
inline int read() { 
    int x = 0,f = 1;
    char c = gc; 
    while(c < '0' || c >'9'){ if(c == '-') f = -1; c = gc; } 
    while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc; 
    return x * f; 
} 
void print(int x) {
    if(x < 0) {  
        pc('-'); x = -x;  
    } 
    if(x >= 10) print(x / 10);  
    pc(x % 10 + '0') ;  
}  
const int maxn = 4007;   
#define mp make_pair
#define fi first
#define se second
int n,k,f[maxn][maxn],mx;  
char s[maxn][maxn];  
vector<pr> v; 
#define INF 0x3f3f3f3f; 
bool vis[maxn][maxn]; 
void bfs() { 
    vector<int> path;
    memset(vis,0,sizeof(vis)); 
    vector<pr> nxt; 
    int xxx = v[1].fi,yyy = v[1].se; 
    for(int i = 0;i < v.size();++ i) { 
        int X = v[i].fi,Y = v[i].se; 
        vis[X][Y] = 1;
        nxt.push_back(v[i]); 
    } 
    for(int i = 0; i < n * 2 - (xxx + yyy); i++) { 
        int min_col = INF;
        for(int j = 0;j < nxt.size(); j++){
            int xx = nxt[j].fi,yy = nxt[j].se; 
            for(int k = 0;k <= 1;++ k) { 
                int tx = (k & 1) ? xx + 1 : xx; 
                int ty = !(k & 1) ? yy + 1 : yy;
                if(tx > n || ty > n) continue;  
                min_col = min(min_col,s[tx][ty] - 'a'); 
            }
        }
        path.push_back(min_col); 
        vector<pr> nxt2; 
        for(int j = 0; j < nxt.size(); j++) { 
            int xx = nxt[j].fi,yy = nxt[j].se; 
            for(int k = 0;k <= 1;++ k) { 
                int tx = (k & 1) ? xx + 1 : xx; 
                int ty = !(k & 1) ? yy + 1 : yy; 
                if(tx > n || ty > n) continue; 
                if(!vis[tx][ty] && s[tx][ty] - 'a' == min_col) { 
                    vis[tx][ty] = 1; 
                    nxt2.push_back(mp(tx,ty)); 
                } 
            } 
        } 
        nxt = nxt2; 
    } 
    for(int i = 1; i <= mx; i++) pc('a'); 
    for(int i = 0; i < path.size(); i ++) { 
            pc(path[i] + 'a'); 
    } 
} 
int GG,id[maxn][maxn]; 
int main() { 
    n = read(); k = read();
    for(int i = 1; i <= n; i++) scanf("%s", s[i] + 1); 
    for(int i = 1; i <= n; i++) s[i][0] = 'z' + 1;
    for(int i = 1; i <= n; i++) s[0][i] = s[n + 1][i] = 'z' + 1; 
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) { 
            id[i][j] = ++GG;
            f[i][j] = max(f[i - 1][j], f[i][j - 1]);
            if(s[i][j] == 'a') f[i][j]++;
        }
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) { 
            int ned = i + j - f[i][j] - 1; 
            if(ned <= k) { 
                if(i + j > mx) v.clear(), v.push_back(mp(i, j)), mx = i + j;
                else if(i + j == mx) v.push_back(mp(i, j));
            }
        }
    }
    mx --;  
    //print(mx); 
    bfs(); 
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/sssy/p/9828252.html