2021 SCUEC Rookie Cup Editorial

Правка en5, от Visors, 2021-03-14 19:35:58

比赛传送门: [contest:319429]

Idea:aabbccSu

Tutorial is loading...
#include <bits/stdc++.h>
#include <unordered_map>

using namespace std;
#define ENDL "\n"
#define lowbit(x) (x & (-x))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
const double eps = 1e-8;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double dinf = 1e300;
const ll INF = 1e18;
const int Mod = 1e9 + 7;
const int maxn = 2e5 + 10;

bool isLeap(int x) {
    if ((x % 4 == 0 && x % 100) || x % 400 == 0) return 1;
    return 0;
}


int p[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int q[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int v[] = {0, 1, 2, 4, 8, 16, 32};

//2021/1/1 Friday
int getWeek(int Y, int M, int D) {
    int y = 2021, m = 1, d = 1, w = 5;
    while (y != Y || m != M || d != D) {
        if (!isLeap(y)) {
            if (d + 1 > p[m]) {
                if (m + 1 > 12) y++, m = 1, d = 1;
                else {
                    m++;
                    d = 1;
                }
            } else d++;
        } else {
            if (d + 1 > q[m]) {
                if (m + 1 > 12) y++, m = 1, d = 1;
                else {
                    m++;
                    d = 1;
                }
            } else d++;
        }

        w = w + 1 > 7 ? 1 : w + 1;
    }
    return w;
}

int solve(int y, int m, int d, int w, int Y, int M, int D) {
    int ans = 0;
    while (y != Y || m != M || d != D) {
        if (!isLeap(y)) {
            if (d + 1 > p[m]) {
                if (m + 1 > 12) y++, m = 1, d = 1;
                else {
                    m++;
                    d = 1;
                }
            } else d++;
        } else {
            if (d + 1 > q[m]) {
                if (m + 1 > 12) y++, m = 1, d = 1;
                else {
                    m++;
                    d = 1;
                }
            } else d++;
        }
        if (w < 7) ans += v[w];
        else ans /= 2;
        w = w + 1 > 7 ? 1 : w + 1;
    }
    if (w < 7) ans += v[w];
    else ans /= 2;
    return ans;
}

//首先计算出起始天是周几,然后向后模拟
int main() {
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T;
    int y1, m1, d1, y2, m2, d2;
    cin >> T;
    while (T--) {
        cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
        int now = getWeek(y1, m1, d1);
        cout << solve(y1, m1, d1, now, y2, m2, d2) << ENDL;
    }
    return 0;
}

Idea:SHIYAOHUA

Tutorial is loading...
#include <bits/stdc++.h>

using namespace std;
#define ENDL "\n"

char s[20];

int main() {
    int T, n;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        double sum = 0.0;
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%s", s);
            if (isalpha(s[0])) continue;
            else {
                sum += atof(s), cnt++;
            }
        }
        if (cnt == 0) puts("0");
        else printf("%.10lf\n", sum / cnt);
    }
    return 0;
}

Idea:waswasqq

Tutorial is loading...
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t;
    //scanf("%d",&t);
    cin >> t;
    while (t--) {
        int n;;
        //scanf("%d",&n);
        cin >> n;
        ll sum = 0;
        for (int i = 0; i < n; i++) {
            int x;
            //scanf("%d",&x);
            cin >> x;
            sum += x;
            sum %= mod;
        }
        n--;
        while (n--)//也可以手写快速幂
        {
            sum *= 2;
            sum %= mod;
        }
        //printf("%d\n",sum);
        cout << sum << '\n';
    }
}

Idea:hushnow

Tutorial is loading...
#include<bits/stdc++.h>

using namespace std;
#define ll long long
int n, m;
int dx[] = {0, 1, 0, -1};
int dy[] = {-1, 0, 1, 0};//方向数组
bool tu[5][5];//表示是否走过
int sum = 0;

void dfs(int x, int y, int num)//x,y是当前到的格子,num是当前已经排了的蛇的长度
{
    if (num == m)//当排到蛇的长度为m时即可认为是一种情况,并sum++
    {
        sum++;
        return;
    }
    for (int i = 0; i < 4; i++) {
        if (x + dx[i] >= 0 && x + dx[i] < n && y + dy[i] >= 0 && y + dy[i] < n && (!tu[x + dx[i]][y + dy[i]])) {
            tu[x + dx[i]][y + dy[i]] = true;//走过的用true表示已经走过
            dfs(x + dx[i], y + dy[i], num + 1);
            tu[x + dx[i]][y + dy[i]] = false;//递归回来后将其再次标记为未走过
        }
    }
}

int main() {
    cin >> n >> m;
    memset(tu, false, sizeof(tu));//将图表示为都没有走过
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            tu[i][j] = true;//走过的用true表示已经走过
            dfs(i, j, 1);
            tu[i][j] = false;//递归回来后将其再次标记为未走过
        }
    }
    cout << sum << endl;
}

Idea:tczzz

Tutorial is loading...

Written by:tczzz

#include <bits/stdc++.h>

using namespace std;
#define ll long long
int tree[110000][20];
int n, m;
struct node {
    int i;
    int j;
};
queue<node> q;
bool f = 0;

void bfs() {
    while (!q.empty()) {
        node s = q.front();
        q.pop();
        if (!f) {
            cout << tree[s.i][s.j];
            f = 1;
        } else {
            cout << ' ' << tree[s.i][s.j];
        }
        if (s.j * 2 <= (1 << m) - 1) {
            node nw;
            nw.i = s.i;
            nw.j = s.j * 2;
            q.push(nw);
        }
        if (s.j * 2 + 1 <= (1 << m) - 1) {
            node nw;
            nw.i = s.i;
            nw.j = s.j * 2 + 1;
            q.push(nw);
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    int w;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= (1 << m) - 1; j++) {
            cin >> tree[i][j];
        }
    }
    for (int i = 1; i <= n; i <<= 1) {
        for (int j = i; j < i << 1 && j <= n; j++) {//把每层“节点”的第一个节点扔到队列
            node s;
            s.i = j;
            s.j = 1;
            q.push(s);
        }
        bfs();//一层的节点扔完后进行bfs
    }
    cout << endl;
    return 0;
}

Written by:Visors

#include <bits/stdc++.h>

using namespace std;

int n, m;
vector<vector<int> > v;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cin >> n >> m;
    v.resize(n, vector<int>(pow(2, m) - 1));
    for (auto &i : v)
        for (int &j : i)
            cin >> j;
    int depth = log2(n);
    bool first = true;
    for (int i = 0; i < depth; i++) {
        for (int j = 0; j < m; j++) {
            for (int k = pow(2, i); k < min((int) pow(2, i + 1), n + 1); k++) {
                for (int t = pow(2, j); t < pow(2, j + 1); t++) {
                    if (first) {
                        cout << v[k - 1][t - 1];
                        first = false;
                    } else cout << ' ' << v[k - 1][t - 1];
                }
            }
        }
    }
    cout << endl;
    return 0;
}

Idea:rainbu5

Tutorial is loading...
#include<bits/stdc++.h>  

using namespace std;  
typedef long long ll;  
const int N = 100000 + 5 ;  
char str[N];  
int main()  
{  
    //freopen("in.txt","r",stdin);  
	  scanf("%s",str);  
	 int len = strlen(str);  
	 int res = 0 ;  
	 stack <int> st;  
	 for(int i = 0 ;i < len ; i ++) {  
        char c = str[i] ;  
		if(st.size() && c == ']' && str[st.top()]=='[')st.pop();  
	    else if(st.size() && c == '}' && str[st.top()]=='{')st.pop();  
	    else if(st.size() && c == ')' && str[st.top()]=='(')st.pop();  
		else st.push(i);  
  
		if(st.size())res = max(res,i - st.top()); 
	    else res = max(res , i + 1);  
	 }  
     printf("%d",res);  
	 return 0;  
}

Idea:Lian

Tutorial is loading...
#include <bits/stdc++.h>

using namespace std;
#define ENDL "\n"
typedef long long ll;
const int maxn = 2050;
const int Mod = 1e9 + 7;
const int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};

int n, m;
int a[maxn][maxn];
ll d[maxn][maxn];
bool vis[maxn][maxn];

bool check(int r, int c) {
    if (r <= 0 || c <= 0 || r > n || c > m) return 0;
    return 1;
}

void dfs(int x, int y) {
    vis[x][y] = 1;
    for (int i = 0, r, c; i < 4; i++) {
        r = x + dx[i], c = y + dy[i];
        if (!check(r, c)) continue;
        if (!vis[r][c] && a[r][c] > a[x][y]) dfs(r, c);
        if (a[r][c] > a[x][y]) d[x][y] = (d[x][y] + d[r][c]) % Mod;
    }
}

int main() {
    //ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                scanf("%d", &a[i][j]);
                vis[i][j] = 0;
            }
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int cnt = 0;
                for (int k = 0, r, c; k < 4; k++) {
                    r = i + dx[k], c = j + dy[k];
                    if (check(r, c) && a[r][c] > a[i][j]) cnt++;
                }
                d[i][j] = (cnt == 0 ? 1 : 0);  //d数组的初始化
            }
        }
        ll ans = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (!vis[i][j]) dfs(i, j);  //每个点只访问一次,那么访问过的点就无需再搜
                ans = (ans + d[i][j]) % Mod;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

Idea:lancee

Tutorial is loading...
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>

using namespace std;

int n, m, sum, ans;
char maze[1005][1005];
bool vis[1005][1005];
int odddis[6][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}, {-1,-1}, {1,-1}};
int evendis[6][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}, {-1,1}, {1,1}};


struct point {
    int x;
    int y;
};

int gcd(int a, int b) {
    return b > 0 ? gcd(b, a % b) : a;
}

bool judge;

void bfs(int x, int y) {
    queue<point> que;
    int cnt = 0;
    if (!vis[x][y]) {
        point pos;
        pos.x = x;
        pos.y = y;
        if (maze[x][y] == '*') {
            judge = true;
        }
        vis[x][y] = true;
        cnt++;
        que.push(pos);
        while (!que.empty()) {
            if (que.front().x % 2 == 0) {
                for (int i = 0; i < 6; i++) {
                    int xx = que.front().x + odddis[i][0];
                    int yy = que.front().y + odddis[i][1];
                    if (xx >= 0 && yy >= 0 && xx < n && yy < m
                        && maze[xx][yy] != '#' && !vis[xx][yy]) {
                        point temp;
                        temp.x = xx;
                        temp.y = yy;
                        que.push(temp);
                        vis[xx][yy] = true;
                        cnt++;
                        if (maze[xx][yy] == '*')
                            judge = true;
                    }
                }
            } else if (que.front().x % 2 == 1) {
                for (int i = 0; i < 6; i++) {
                    int xx = que.front().x + evendis[i][0];
                    int yy = que.front().y + evendis[i][1];
                    if (xx >= 0 && yy >= 0 && xx < n && yy < m
                        && maze[xx][yy] != '#' && !vis[xx][yy]) {
                        point temp;
                        temp.x = xx;
                        temp.y = yy;
                        que.push(temp);
                        vis[xx][yy] = true;
                        cnt++;
                        if (maze[xx][yy] == '*')
                            judge = true;
                    }
                }
            }
            que.pop();
        }
    }
    //cout << cnt << endl;
    if (judge == true)sum += cnt;
}

int main() {
    ios::sync_with_stdio(0);
    int t;
    cin >> t;
    while (t--) {
        ans = 0;
        sum = 0;
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> maze[i][j];
                if (maze[i][j] == '.' || maze[i][j] == '*')
                    ans++;
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (maze[i][j] != '#' && !vis[i][j]) {
                    judge = false;
                    bfs(i, j);
                }
            }
        }
        int num = gcd(ans, sum);
        if (sum == 0)
            cout << 0 << endl;
        else if (sum == num)
            cout << 1 << endl;
        else
            cout << sum / num << "/" << ans / num << endl;
        memset(vis, 0, sizeof(vis));
    }
}

Idea:Visors

粗暴复刻了 1345C - Hilbert's Hotel

Tutorial is loading...
#include <iostream>
#include <vector>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        vector<int> v(n);
        vector<bool> book(n);
        for (int &it:v) cin >> it;
        for (int i = 0, tmp; i < n; i++) {
            tmp = (((v[i] + i) % n) + n) % n; //避免%出负数
            if (!book[tmp]) book[tmp] = true;
            else {
                cout << "YES" << endl;
                goto over;
            }
        }
        cout << "NO" << endl;
        over:;
    }
    return 0;
}

Idea:twh12138

Tutorial is loading...
#include<iostream>
#include<queue>
#include<cstring>

using namespace std;

const int N = 2e5 + 10;

int dis[N];
int n,k;

queue<int> q;

int bfs()
{
    memset(dis,-1,sizeof dis);
    q.push(n);
    dis[n] = 0;
    
    while(q.size())
    {
        int t = q.front();
        q.pop();
        
        if(t == k) return dis[t];
        
        if(t + 1 <= N && dis[t + 1] == -1)
        {
            q.push(t + 1);
            dis[t + 1] = dis[t] + 1;
        }
        if(t - 1 >= 0 && dis[t - 1] == -1)
        {
            q.push(t - 1);
            dis[t - 1] = dis[t] + 1;
        }
        if(t * 2 <= N && dis[2 * t] == -1)
        {
            q.push(2 * t);
            dis[2 * t] = dis[t] + 1;
        }
    }
    
    return 0;
}

int main()
{
    cin >> n >> k;
    cout << bfs() << endl;
}

Idea:CofDoria

Tutorial is loading...
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define rep(l, a, b) for (ll l = a; l < b; ++l)

int t, n;
ll ans = 0;

struct node {
    ll t, val;
    node() { t = 0, val = 0; }
} a[1500005];

bool cmp(node x, node y) {
    if (x.t == y.t) return x.val > y.val;
    return x.t < y.t;
}

priority_queue<int, vector<int>, greater<int> > q;

int main() {
    cin >> n;
    rep(i, 0, n) cin >> a[i].t >> a[i].val;
    sort(a, a + n, cmp);
    rep(i, 0, n) {
        if (i && a[i].t == a[i - 1].t) { 
            if (q.size() < a[i].t) {
                q.push(a[i].val);
                ans += a[i].val;
            } else if (q.top() < a[i].val) {
                ans += a[i].val - q.top();
                q.pop();
                q.push(a[i].val);
            }
        } else {
            ans += a[i].val;
            q.push(a[i].val);
        }
    }
    cout << ans + 5;
    return 0;
}

Idea:lqrs

Tutorial is loading...
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

#define N 10005
vector<int> edge[N];    //二维数组
int res = 0;

void dfs(int step, int pos, int prepos) {
    if (step == 3) {
        ++res;
        return;
    }
    if (edge[pos].size()) {
        vector<int>::iterator it;
        for (it = edge[pos].begin(); it != edge[pos].end(); ++it)
            if (*it != prepos) dfs(step + 1, *it, pos);
    }
}

int main() {
    ios::sync_with_stdio(false);
    cout.tie(NULL);
    int n, m, U, V;
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        cin >> U >> V;
        edge[U].push_back(V);
        edge[V].push_back(U);
    }
    for (int i = 1; i <= n; ++i) dfs(0, i, 0);
    cout << res << endl;
    return 0;
}

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en5 Английский Visors 2021-03-14 19:35:58 17719
en4 Английский Visors 2021-03-13 13:01:35 0 (published)
en3 Английский Visors 2021-03-13 10:14:04 28 Tiny change: ']\n\n粗暴复刻了[problem:1' -> ']\n\n粗暴复刻了\n[problem:1'
en2 Английский Visors 2021-03-13 10:10:37 110
en1 Английский Visors 2021-03-13 10:07:27 726 Initial revision (saved to drafts)