C-Draw Grids

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

  给一组结点,按照 的方式分布。每个人要选择一个点连线到另一个点上,每个点最多与两个点相连,第一个碰到没有点可连的人输掉游戏。因为每个点最多只能拥有两条线,所以可将图看作一排数量为 的结点,容易发现,当且仅当 为偶数时才能赢得比赛。

  代码:

#include<bits/stdc++.h>

using namespace std; 

int main() { 

    int n, m; cin>>n>>m;
    puts((n*m)&1? "NO" : "YES");

    return 0; 
} 

D-Er Ba Game

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

  按照题意模拟即可。注意平局的判断方式。

  代码:

#include<bits/stdc++.h>

using namespace std; 

inline void solve() { 
    int a1, b1, a2, b2; scanf("%d%d%d%d",&a1, &b1, &a2, &b2);

    if(a1>b1) swap(a1, b1);
    if(a2>b2) swap(a2, b2);

    int x1, x2;
    if(a1==2 && b1==8) x1=1;
    else if(a1==b1) x1=2;
    else x1=3; 
    if(a2==2 && b2==8) x2=1;
    else if(a2==b2) x2=2;
    else x2=3; 

    if(x1!=x2) puts(x1<x2? "first" : "second");
    else if(x1==1) puts("tie");
    else if(x1==2) puts(a1==a2? "tie" : (a1>a2? "first" : "second"));
    else {
        int c1=(a1+b1)%10, c2=(a2+b2)%10;
        puts(c1==c2? (b1==b2? "tie" : (b1>b2? "first" : "second")) : (c1>c2? "first" : "second"));
    }
} 

int main() { 
    int cases; cin>>cases;
    while(cases--) solve();

    return 0; 
} 

K-Stack

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld

  通过伪代码可以发现,当新的数字加入时,堆栈会弹出所有大于它的数。因此可以将大的数放在前面,小的数放在后面以减少容量或控制容量不变。而容量在每次操作时最多增加 1,且不大于当前的下标值。
  因此可以特判,在输入阶段直接对容量大于当前的下标值的数据返回 -1 结果。再从 1 遍历到 n 根据已有位置容量推导当前位置的容量值,并记录在数组中。已知后方某个位置的容量比当前大时,向该位置遍历时不断将容量值加 1,反之减 1,直到等于为止,如果到该位置时仍然比应有的容量小,则返回 -1 结果。遇到后方无已知值时无需加减。
  将推导出来的数组按容量从小到大,下标从大到小排列。从 1 到 n 给第 i 个元素对应 a 数组的位置赋值 i,再打印 a 数组,即为结果。

  代码:

#include<bits/stdc++.h>

using namespace std; 
using ld=long double; using ll=long long; using ull=unsigned long long; using pii=std::pair<int, int>; using pll=std::pair<long long, long long>; using pil=std::pair<int, long long>; using pli=std::pair<long long, int>; 
#define all(_tmp) _tmp.begin(),_tmp.end()
#define fir first
#define sec second

const int mod=1e9+7; 
const int maxn=1e6;

int ans[maxn|1]; 
pii li[maxn|1], lb[maxn+1];

int main() { 
    int n, m; cin>>n>>m;

    bool sampfalse=0; 
    for(int i=1; i<=m; i++) {
        scanf("%d%d", &li[i].fir, &li[i].sec);
        lb[li[i].fir]=(pii){li[i].fir, li[i].sec};
        sampfalse=(li[i].fir-li[i].sec<0);
        if(li[i].fir-li[i].sec<0) {
            puts("-1");
            return 0;
        }

    }
    if(sampfalse) { 
        puts("-1"); 
        return 0; 
    } 

    sort(li+1, li+m+1); for(int i=1; i<m; i++) { 
        if(li[i+1].fir-li[i].fir<li[i+1].sec-li[i].sec) { 
            puts("-1"); 
            return 0; 
        } 
        int dx=li[i+1].sec==li[i].sec? 0 : (li[i+1].sec>li[i].sec? 1 : -1); 
        for(int ji=li[i].fir, jj=li[i].sec; ji<=li[i+1].fir; ji++) { 
            lb[ji]=(pii){ji, jj}; 
            if(jj!=li[i+1].sec) jj+=dx; 
        } 
    } 
    for(int i=1, j=1; i<=li[1].fir; i++) { 
        lb[i]=(pii){i, j}; 
        if(j<li[1].sec) j++; 
    } 
    for(int i=li[m].fir, j=li[m].sec; i<=n; i++) lb[i]=(pii){i, j}; 

    sort(lb+1, lb+n+1, [](const pii& a, const pii& b){ return a.second==b.second? a.first>b.first : a.second<b.second; }); 

    for(int i=1; i<=n; i++) ans[lb[i].first]=i; 
    for(int i=1; i<=n; i++) printf("%d ", ans[i]); 
    putchar('\n'); 

    return 0; 
}