【AtCoder】CODE FESTIVAL 2016 qual A

CODE FESTIVAL 2016 qual A

A - CODEFESTIVAL 2016

……node

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 500005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 +c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
string s;
void Solve() {
    cin >> s;
    cout << s.substr(0,4) << " " << s.substr(4) << endl;
}

int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}

B - 仲良しうさぎ / Friendly Rabbits

……c++

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 +c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
int N;
int a[MAXN];
void Solve() {
    read(N);
    for(int i = 1 ; i <= N ; ++i) {
    read(a[i]);
    }
    int ans = 0;
    for(int i = 1 ; i <= N ; ++i) {
    if(a[a[i]] == i) ++ans;
    }
    out(ans / 2);enter;
}

int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}

C - 次のアルファベット / Next Letter

先從前面到後面把能變成a的都變成a,而後把全部的操做給最後一個字母便可spa

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 +c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
int K,N;
char s[MAXN];
void Solve() {
    scanf("%s",s + 1);
    read(K);
    N = strlen(s + 1);
    for(int i = 1 ; i <= N ; ++i) {
    int t = s[i] - 'a';
    if(t != 0) {
        if(K >= 26 - t) {s[i] = 'a';K -= (26 - t);}
    }
    }
    K %= 26;
    int t = s[N] - 'a';
    t = (t + K) % 26;
    s[N] = 'a' + t;
    for(int i = 1 ; i <= N ; ++i) {
    putchar(s[i]);
    }
    enter;
}

int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}

D - マス目と整數 / Grid and Integers

\(b_{i,j} + b_{i + 1,j + 1} = b_{i,j + 1} + b_{i + 1,j}\)code

能夠獲得\(b_{i,j + 1} - b_{i,j} = b_{i + 1,j + 1} - b_{i + 1,j}\)ci

一樣的橫列也能夠獲得get

\(b_{i + 1,j} - b_{i,j} = b_{i + 1,j + 1} - b_{i,j + 1}\)string

也就是咱們能夠找到兩個數列\(x_{1}..x_{R}\)it

\(y_{1}..y_{C}\)class

\(b_{i,j} = x_{i} + y_{j}\)sed

是知足對角線兩列相加相等的

而後咱們把\(x_{i} + y_{j}\)固定的連一條邊,一個聯通塊內固定一個即可以使得全部點都標記上值,咱們在標記的過程當中同時看是否合法便可

那麼如何保證非負呢

咱們在一個聯通塊內,若是最小的x和最小的y相加是正的,覺得一個聯通塊內y增長1會使得全部的x減小1,x增長1同理,這種狀況使得全部的x和y都變成非負的,顯然合法

若是最小的x和最小的y是負的,那麼就不合法了,也沒法調整了

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 200005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 +c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
int R,C,N;
struct node {
    int to,next;
    int64 val;
}E[MAXN * 10];
int head[MAXN],sumE;
int64 val[MAXN],xmin,ymin;
bool vis[MAXN];
bool used[MAXN];
void add(int u,int v,int64 c) {
    E[++sumE].to = v;
    E[sumE].next = head[u];
    E[sumE].val = c;
    head[u] = sumE;
}
bool dfs(int u) {
    vis[u] = 1;
    for(int i = head[u] ; i ; i = E[i].next) {
    int v = E[i].to;
    if(!vis[v]) {
        val[v] = E[i].val - val[u];
        if(!dfs(v)) return false;
    }
    else {
        if(val[u] + val[v] != E[i].val) return false;
    }
    }
    return true;
}
void find_min(int u) {
    used[u] = 1;
    if(u <= R) xmin = min(xmin,val[u]);
    if(u > R) ymin = min(ymin,val[u]);
    for(int i = head[u] ; i ; i = E[i].next) {
    int v = E[i].to;
    if(!used[v]) find_min(v);
    }
}
void Solve() {
    read(R);read(C);read(N);
    int a,b;int64 c;
    for(int i = 1 ; i <= N ; ++i) {
    read(a);read(b);read(c);
    add(a,b + R,c);add(b + R,a,c);
    }
    for(int i = 1 ; i <= R + C ; ++i) {
    if(!vis[i]) {
        if(!dfs(i)) {puts("No");return;}
        xmin = 1e18,ymin = 1e18;
        find_min(i);
        if(xmin + ymin < 0) {puts("No");return;}
    }
    }
    puts("Yes");
}

int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}

E - LRU パズル / LRU Puzzle

假如對一個序列進行了操做,這個序列最後的樣子是未操做的數仍然有序放在最後,而後被操做的數從後往前掃描操做序列,第一個出現的數排在最前,重複出現的直接忽略便可

那麼咱們對假如Q次放到同一序列裏,也作一遍這個操做,會獲得一個最終序列,這個序列就是咱們必須讓每個都變成這樣的序列

序列從末尾到前非單調降低的第一個位置以前,就是每一個序列都必須有的一段操做序列

因而咱們從後往前掃看看這種操做序列最可能是否超過N個便可

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 +c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
int N,M,Q;
int a[MAXN],pos[MAXN],reserve[MAXN];
bool vis[MAXN];
vector<int> v;
void Solve() {
    read(N);read(M);read(Q);
    v.pb(0);
    for(int i = 1 ; i <= Q ; ++i) {read(a[i]);}
    for(int i = Q ; i >= 1 ; --i) {
    if(!vis[a[i]]) {
        v.pb(a[i]);
        vis[a[i]] = 1;
    }
    }
    for(int i = 1 ; i <= M ; ++i) {
    if(!vis[i]) v.pb(i);
    }
    for(int i = 1 ; i <= M ; ++i) pos[v[i]] = i;
    int p = M;
    while(p > 1 && v[p - 1] < v[p]) --p;
    if(p == 1) {puts("Yes");return;}
    for(int i = Q ; i >= 1 ; --i) {
    if(a[i] == v[1]) reserve[1]++;
    else {
        if(reserve[pos[a[i]] - 1]) {
        reserve[pos[a[i]] - 1]--;
        reserve[pos[a[i]]]++;
        }
    }
    }
    int res = 0;
    for(int i = p - 1 ; i <= M ; ++i) {
    res += reserve[i];
    }
    if(res >= N) {puts("Yes");return;}
    else {puts("No");return;}
}

int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}
相關文章
相關標籤/搜索