2017ACM烏魯木齊網預

2017ACM烏魯木齊網預

A

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N
#define M
using namespace std;
typedef long long LL;
int T, n, m;
bool map[55][55], map1[55][55], map2[55][55];
int main()
{//freopen("input.txt","r",stdin);
 //freopen("input.txt","w",stdout);
    scanf("%d", &T);
    while(T--)
    {
        memset(map, 0, sizeof(map));
        memset(map1, 0, sizeof(map1));
        memset(map2, 0, sizeof(map2));
        scanf("%d%d", &n, &m);
        for(int i=1, x, y;i<=n;i++)
        {
            scanf("%d%d", &x, &y);
            map[x][y]=1;
        }
        for(int i=1, x, y;i<=m;i++)
        {
            scanf("%d%d", &x, &y);
            map1[x][y]=1;
        }
        for(int i=1;i<=50;i++)
            for(int j=1;j<=50;j++)
                for(int k=1;k<=50;k++)
                    if(map[i][j]&&map1[j][k])map2[i][k]=1;
        for(int i=1;i<=50;i++)
            for(int j=1;j<=50;j++)
                if(map2[i][j])printf("%d %d\n", i, j);
        printf("\n");
    }
    return 0;
}

C

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXN=1007;
int kk[MAXN];
int main()
{
    int T;scanf("%d", &T);
    while(T--)
    {
        int n, b;scanf("%d%d", &n, &b);
        for(int i=1;i<=n;i++)
        {
            scanf("%d", &kk[i]);
        }
        int now=0;int fl=0;
        for(int i=1;i<n;i++)
        {
            now+=kk[i];
            int tmp;scanf("%d", &tmp);
            if(tmp*b>now||fl)
            {
                fl=1;
            }
            else
            {
                now-=(tmp*b);
            }
        }
        if(fl) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

E

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN=100000007;
struct FU
{
    LL r;
    LL k;
    FU() {}
    FU(LL _a, LL _b) { k=_a, r=_b; }
};
FU f[100];int nn=1;
void init()
{
    f[0].k=1;f[1].k=2;f[2].k=7, f[3].k=12, f[4].k=41;
    for(int i=5;i<=20;i++)
        f[i].k=f[i-2].k*6-f[i-4].k;
    for(int i=0;i<=20;i++)
    {
        f[i].r=f[i].k*f[i].k;
        if(i%2) f[i].r*=2;
    }
}

int main()
{
    init();
    int T;scanf("%d", &T);int cas=0;
    while(T--)
    {
        LL tmp;scanf("%lld", &tmp);
        int i=0;
        for(i=0;i<=20;i++)
        {
            if(f[i].r>=tmp) break;
        }
        printf("Case #%d: %lld\n", ++cas, f[i].r);
    }
    //system("pause");
    return 0;
}

F

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<stack>
#include<string.h>
using namespace std;

#define MS(x) memset(x,0,sizeof(x))

stack<int> S;
vector<int> G[13000];
vector<int> C[13000];
bool used[15000];
int dfn[15000];
int low[15000];
int time_T=0;
int nv, ne;
int cmp[15000];
int ncmp;
bool instack[25000];
int in[15000];
int out[15000];

void init()
{
    while(!S.empty()) S.pop();
    MS(used);
    MS(low);
    for(int i=0;i<15000;i++)
        dfn[i]=-1;
    time_T=0;
    ncmp=0;
    MS(cmp);
    MS(G);
    MS(C);
    MS(instack);
    MS(in);
    MS(out);
}

void tarjan(int n)
{
    dfn[n]=low[n]=time_T++;
    S.push(n);
    instack[n]=1;
    for(int i=0;i<G[n].size();i++)
    {
        int v=G[n][i];
        if(dfn[v]==-1)
        {
            tarjan(v);
            low[n]=min(low[n], low[v]);
        }
        else if(instack[v])
        {
            low[n]=min(low[n], dfn[v]);
        }
    }
    if(dfn[n]==low[n])
    {
        int v;
        do
        {
            v=S.top();
            S.pop();
            instack[v]=false;
            cmp[v]=ncmp;
        } while(v!=n);
        ncmp++;
    }
}

int main()
{
    int cas;
    scanf("%d", &cas);
    for(int T=1;T<=cas;T++)
    {
        init();
        scanf("%d%d", &nv, &ne);
        for(int i=0;i<ne;i++)
        {
            int f, t;
            scanf("%d%d", &f, &t);
            f--;
            t--;
            G[f].push_back(t);
        }
        for(int i=0;i<nv;i++)
            if(dfn[i]==-1)
                tarjan(i);

        if(ncmp==1)
        {
            puts("0");
            continue;
        }
        for(int i=0;i<nv;i++)
        {
            for(int j=0;j<G[i].size();j++)
            {
                int v=G[i][j];
                int cn=cmp[i];
                int cv=cmp[v];
                if(cn!=cv)
                    C[cn].push_back(cv);
            }
        }
        int ans=0;
        for(int i=0;i<ncmp;i++)
        {
            out[i]=C[i].size();
            for(int j=0;j<C[i].size();j++)
            {
                int v=C[i][j];
                in[v]++;
            }
        }
        int in0=0;
        int out0=0;
        for(int i=0;i<ncmp;i++)
        {
            if(in[i]==0)
                in0++;
            if(out[i]==0)
                out0++;
        }
        printf("%d\n", max(in0, out0));
    }
    return 0;
}

G

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define M(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN=100007;
char s[MAXN], t[20];
//int stree[MAXN<<2];
int la[MAXN];

int bit[MAXN];
int lowbit(int i)
{
    return i&(-i);
}
void change(int pos, int v)
{
    while(pos<MAXN)
        bit[pos]+=v, pos+=lowbit(pos);
}
int query(int pos)
{
    int ans=0;
    while(pos>0)
        ans+=bit[pos], pos-=lowbit(pos);
    return ans;
}
void baoli(int n, int m)
{
    int i, j;
    for(i=m;i<=n;i++)
    {
        bool flag=0;
        for(j=1;j<=m;j++)
        {
            if(s[i-j+1]!=t[m-j+1]) { flag=1; break; }
        }
        if(flag)continue;
        la[i]=1;change(i, 1);
    }
}
void xiugai(int n, int m, int L, int R, int p, char c)
{
    s[p]=c;
    int i, j;
    for(int i=L; i<=R;i++)
    {
        if(la[i])
            change(i, -1), la[i]=0;
        //change(i, 0, 1, n, 1);
    }
    for(i=L;i<=R;i++)
    {
        //if(la[i]) { la[i]=0;continue; }
        bool flag=0;
        for(j=1;j<=m;j++)
        {
            if(s[i-j+1]!=t[m-j+1]) { flag=1; break; }
        }
        if(flag) { la[i]=0;continue; }
        //change(i, 1, 1, n, 1);
        change(i, 1);
        la[i]=1;
    }
}

int main()
{
    int T;scanf("%d", &T);
    while(T--)
    {
        M(la, 0);
        M(bit, 0);
        int q;scanf("%d", &q);
        scanf("%s", s+1);int n=strlen(s+1);
        scanf("%s", t+1);int m=strlen(t+1);
        baoli(n, m);
        //build(1, n, 1);
        for(int i=1;i<=q;i++)
        {
            char ss[3];
            scanf("%s", ss);
            if(ss[0]=='Q')
            {
                int t1, t2;scanf("%d%d", &t1, &t2);
                if(t1+m-1>t2) printf("0\n");
                else //printf("%d\n", query(t1+m-1, t2, 1, n, 1));
                    printf("%d\n", query(t2)-query(t1+m-2));
            }
            else
            {
                int p;char cc[3];
                scanf("%d%s", &p, cc);
                if(s[p]==cc[0]) continue;
                s[p]=cc[0];
                int st=max(p, m);
                int fi=min(p+m-1, n);
                if(st<=fi)
                    xiugai(n, m, st, fi, p, cc[0]);
            }
        }
        printf("\n");
    }
    //system("pause");
    return 0;
}

H

#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
struct Edge { int next, to, v; }a[100005];
int T, n, m, ans, cnt, h[10005], dis[10005];
bool vis[10005], rd[10005];
void Addedge(int x, int y, int v)
{
    a[++cnt].to=y;a[cnt].next=h[x];a[cnt].v=v;h[x]=cnt;
}
queue<int> que;
int main()
{
    scanf("%d", &T);
    while(T--)
    {
        while(!que.empty()) que.pop();
        scanf("%d%d", &n, &m);
        memset(vis, 0, sizeof(vis));
        memset(dis, 0, sizeof(dis));
        memset(rd, 0, sizeof(rd));
        memset(h, 0, sizeof(h));
        ans=0, cnt=0;
        for(int i=1, x, y, v;i<=m;i++)
        {
            scanf("%d%d%d", &x, &y, &v);
            Addedge(x, y, v);
            rd[y]=1;
        }
        for(int i=1;i<=n;i++)
            if(!rd[i])que.push(i);
            else vis[i]=1;
            while(!que.empty())
            {
                int x=que.front();que.pop();
                for(int i=h[x];i;i=a[i].next)
                {
                    int y=a[i].to;
                    if(dis[y]<dis[x]+a[i].v)
                    {
                        dis[y]=dis[x]+a[i].v;
                        if(ans<dis[y])ans=dis[y];
                        if(vis[y]) { que.push(y);vis[y]=0; }
                    }
                }
                vis[x]=1;
            }
            printf("%d\n", ans);
    }
    return 0;
}
發佈了169 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章