2017ACM乌鲁木齐网预

来源:互联网 发布:中国经济泡沫知乎 编辑:程序博客网 时间:2024/04/28 17:22

2017ACM乌鲁木齐网预

A

#include<iostream>#include<cstdio>#include<ctime>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define N#define Musing 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;}