Nothing for Nothing( 十二 )

題目1:Mahmoud and a Dictionary

代碼:

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

const int maxn = 2e5+10;
int f[maxn];
int Find(int x)
{
    if(f[x]==x)
        return x;
    else return f[x]=Find(f[x]);
}
char  a[100], b[100];
map<string, int>mp;
int main()
{
    int n, m, q;
    int f1, f2, f3, f4;
    scanf("%d %d %d", &n, &m, &q);
    for(int i = 1; i <= 2*n; i++)
    {
        f[i] = i;
    }
    for(int i = 1; i <= n; i++)
    {
        scanf("%s", a);
        mp[a] = i;
    }
    for(int i = 1; i <= m; i++)
    {
        int op;
        scanf("%d %s %s", &op, a, b);
        int x = mp[a];
        int y = mp[b];
        if(op == 1)
        {
            f1 = Find(n+x);
            f2 = Find(y);
            f3 = Find(x);
            f4 = Find(n+y);
            if(f1 == f2 || f3 == f4)
            {
                printf("NO\n");
            }
            else
            {
                    f[f2] = f3;
                    f[f1] = f4;
                printf("YES\n");
            }
        }
        else
        {
            f1 = Find(n+x);
            f2 = Find(y);
            f3 = Find(x);
            f4 = Find(n+y);
            if(f1 == f4 || f2 == f3)
            {
                printf("NO\n");

            }
            else
            {
                f[f1] = f2;
                f[f3] = f4;
                printf("YES\n");
            }
        }
    }
    for(int i = 1; i <= q; i++)
    {
        scanf("%s %s", a, b);
        int x = mp[a];
        int y = mp[b];
        f1 = Find(n+x);
        f2 = Find(y);
        f3 = Find(x);
        f4 = Find(n+y);
        //cout<<f1<<" "<<f2<<" "<<f3<<" "<<f4<<endl;
        if(f1 == f4 || f2 == f3)printf("1\n");
        else if(f1 == f2 || f3 == f4){
            printf("2\n");
        }
        else printf("3\n");

    }

}

題目2:Igor and his way to work

代碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int vis[maxn][maxn][5];
char mp[maxn][maxn];
int dx[maxn] = {1, -1, 0, 0};
int dy[maxn] = {0, 0, 1, -1};

int n, m;
int flag  = 0;
void dfs(int x, int y, int dir, int cnt){
     if(x <= 0 || x > n || y <= 0 || y > m || cnt > 2)return;
     if(vis[x][y][dir] <= cnt)return;
     if(mp[x][y] == 'T'){
        flag = 1;
        return;
     }
     if(mp[x][y] != '.' && mp[x][y] != 'S')return;
     vis[x][y][dir] = cnt;
     for(int i = 0; i < 4; i++){
        int xx, yy;
        xx = x+dx[i];
        yy = y+dy[i];
        if(dir == -1){
            dfs(xx, yy, i, cnt);
        }
        else if(dir != i){
            dfs(xx, yy, i, cnt+1);
        }
        else dfs(xx, yy, i, cnt);
     }
}
int main(){
    scanf("%d %d", &n, &m);
    int sx, sy;
    getchar();
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            scanf("%c", &mp[i][j]);
            if(mp[i][j] == 'S')sx = i, sy = j;
        }
        getchar();
    }
    flag = 0;
    memset(vis, 0x3f, sizeof vis);
    dfs(sx, sy, -1, 0);
    if(flag)printf("YES\n");
    else printf("NO\n");

return 0;
}

題目3:Okabe and Boxes

代碼:

#include<bits/stdc++.h>
using namespace std;
char a[100];
vector<int>v;
int main(){
    int n;
    scanf("%d", &n);
    int cn = 1, ans = 0, t;
    for(int i = 1; i <= n*2; i++){
        getchar();
        scanf("%s", &a);
        if(a[0] == 'a')scanf("%d", &t),v.push_back(t);
        else {
            if(!v.empty() && v.back() != cn){
                ans++;
                v.clear();
            }
            else if(!v.empty())v.pop_back();
            cn++;
        }
    }
    printf("%d\n", ans);
return 0;
}

題目4:Sorting the Coins

代碼:

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

const int maxn = 3e5+10;

#define Temp template<typename T>
int n, t;
int a[maxn<<2], st[maxn<<2];
Temp inline void read(T &x)
{
    x = 0;
    T w = 1, ch = getchar();
    while(!isdigit(ch) && ch!= '-')ch = getchar();
    if(ch == '-')w = -1, ch = getchar();
    while(isdigit(ch))x = (x<<3)+(x<<1)+(ch^'0'),ch = getchar();
    x = x * w;
}

void build(int o, int l, int r)
{
    if(l == r)st[o] = 0;
    else
    {
        int m = l + ((r-l)>>1);
        build(o<<1, l, m);
        build(o<<1|1, m+1, r);
        st[o] = st[o<<1] + st[o<<1|1];
    }
}
void update(int o,int l,int r,int ind,int ans)
{
    if(l==r)
    {
        st[o] = ans;
        return;
    }
    int m=l+((r-l)>>1);
    if(ind<=m)
    {
        update(o<<1,l,m,ind,ans);
    }
    else
    {
        update((o<<1)|1,m+1,r,ind,ans);
    }
    st[o]=st[o<<1]+st[(o<<1)|1];
}

int query(int o, int l, int r, int ql, int qr)
{
    if(ql<= l && qr >= r)return st[o];
    int m = l + ((r-l)>>1);
    int ans = 0;
    if(ql <= m)ans += query(o<<1, l, m, ql, qr);
    if(qr >= m+1)ans += query(o<<1|1, m+1, r, ql, qr);
    return ans;
}
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = 1 + l + r >> 1;
        //cout<<query(1,1, n, n-mid+1, n)<<endl;
        if (query(1,1, n, n-mid+1, n) == mid)
        {
            l = mid;
            //cout<<r<<" jj"<<mid<<endl;
        }
        else r = mid -1;
    }
    return l;
}
int vis[maxn];
int main()
{

    read(n);
    build(1, 1, n);
    vis[0] = 1;
    for(int i = 1; i <= n; i++)
    {
        read(t);
        update(1, 1, n, t, 1);
        if(query(1, 1, n, n, n) == 0)
        {
            vis[i] = i+1;
            continue;
        }
        int k = bsearch_1(1, n);
        vis[i] = i - k+1;
    }
    for(int i = 0; i <= n; i++)
    {
        if(i != 0)printf(" ");
        printf("%d", vis[i]);
    }
    printf("\n");

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章