Try Again

CREC 2017

A:Assignment Algorithm

#include <bits/stdc++.h>
using namespace std;
char s[56][16];
int a[56][16],n,m,ans=0,A,B,l=0,r=0,ls=0,rs=0;
int k[19]={15,3,5,2,15,1,4,1,15,2,5,3};
map<int,int>v;
void init(){
    v[5]=7;v[7]=5;
    v[3]=9;v[9]=3;
    v[1]=11;v[11]=1;
    v[2]=10;v[10]=2;
}
int pos=0,vis=0;
struct node{
    int val,dis,id;//座位数,记录过道距离,行号
    bool operator<(const node &a) const{
        return a.val==val?(a.dis==dis?a.id>id:a.dis>dis):a.val<val;
    }
}e[3],p[56];
void check(int dep){
    int inf=30;
    for(int i=1;i<=11;i++)
        if(inf>k[i] && s[dep][i]=='-'){
            A=dep;
            B=i;
            inf=k[i];
        }
    if(B!=6 && s[A][v[B]]=='-'){
        if(B<6){
            if(ls>rs) B=v[B];
        }else if(B>6){
            if(ls<rs) B=v[B];
        }
    }
}
int main(){
    init();
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n+3;i++){
        ans=0;
        scanf("%s",s[i]+1);
        for(int j=1;j<=11;j++){
            if(s[i][j]=='-')ans++;
            else if(s[i][j]=='#'){
                if(j<6) ls++;
                else if(j>6) rs++;
            }
        }
        if(i==2 || i==n/2+3){
            e[l].val=ans;
            e[l].dis=1;
            e[l++].id=i;
            pos+=ans;
        }
        else{
            p[r].val=ans;
            p[r].dis=min(abs(1-i),min(abs(n/2+2-i),abs(n+3-i)));
            p[r++].id=i;
            vis+=ans;
        }
    }
    for(int i=0;i<pos;i++){
        sort(e,e+l);
        check(e[0].id);
        s[A][B]=(char)('a'+i);
        e[0].val--;
        if(B<6) ls++;
        else if(B>6) rs++;//飞机平衡
    }
    for(int i=pos;i<m;i++){
        sort(p,p+r);
        check(p[0].id);
        s[A][B]=(char)('a'+i);
        p[0].val--;
        if(B<6) ls++;
        else if(B>6) rs++;
    }
    for(int i=1;i<=n+3;i++)
        printf("%s\n",s[i]+1);
    return 0;
}
/*
2 17
...........
---.#--.---
...........
---.---.---
...........
6 26
...........
---.---.###
#-#.---.---
---.###.---
...........
---.###.---
#--.#-#.--#
#--.--#.#-#
...........
*/

F:Faulty Factorial

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll v[10000006],n,p,r;
ll quick_pow(ll x,ll y,ll mod){
    ll ans=1;
    while(y){
        if(y&1) ans=ans*x%mod;
        y>>=1;
        x=x*x%mod;
    }
    return ans%mod;
}
void init(){
    v[1]=1;
    for(ll i=2;i<=p;i++){
        v[i]=(p-(p/i))*v[p%i]%p;
        //ll re=quick_pow(i,p-2,p);
        //v[i]=re;
    }
}
int main(){
    scanf("%lld%lld%lld",&n,&p,&r);
    init();
    /*for(int i=1;i<=100;i++){
        if(v[i]==0) printf("1 ");
        //if(m[i]==0) printf(" 1\n");
    }*/
    if(n>=2*p){
        if(r==0){
            printf("%lld 1\n",p);
        }
        else printf("-1 -1\n");
    }
    else if(n>=p && r){
        ll ans=1;
        for(int i=1;i<=n;i++){
            if(i==p) continue;
            ans=ans*i%p;
        }
        int ok=0;
        for(ll i=1;i<p;i++){
            if(((ans*i)%p)==r){
                printf("%lld %lld\n",p,i);
                ok=1;
                break;
            }
        }
        if(!ok) printf("-1 -1\n");
    }
    else if(n>=p && !r){
        int ok=0;
        for(int i=2;i<=n;i++){
            if(i!=p){
                printf("%d 1\n",i);
                ok=1;
                break;
            }
        }
        if(!ok) printf("-1 -1\n");
    }
    else if(n<p){
        ll ans=1;
        for(ll i=1;i<=n;i++)
            ans=ans*i%p;
        int ok=0;
        for(ll i=2;i<=n;i++){
            ll q=ans*v[i]%p;
            ll re=r*v[q]%p;
            if(re<i && re>0){
                printf("%lld %lld\n",i,re);
                ok=1;
                break;
            }
        }
        if(!ok) printf("-1 -1\n");
    }
    return 0;
}

H:Hidden Hierarchy

 

#include <bits/stdc++.h>
#include <set>
using namespace std;
#define maxn 50006
vector<int>v[maxn];
map<int,string>im;
map<string,int>mi;
set<string>ss[maxn];
int val[maxn],n,x,cnt,ans=0;
int vis[maxn];
string s;
void dfs(int u){
    for(int i=0;i<v[u].size();i++){
        dfs(v[u][i]);
        val[u]+=val[v[u][i]];
    }
}
void bfs(int u){
    if(vis[u]) return;
    int pos=0,ok=0;
    for(int i=0;i<v[u].size();i++){
        if(!vis[v[u][i]]){
            pos=max(pos,val[v[u][i]]);
            ok=1;
        }
    }
    if(!ok) cout<<"  "<<im[u]<<" "<<val[u]<<endl;
    else if( ok && pos<x) cout<<"+ "<<im[u]<<" "<<val[u]<<endl;
    else if(ok && pos>=x){
        cout<<"-"<<" "<<im[u]<<" "<<val[u]<<endl;
        for(set<string>::iterator it=ss[u].begin();it!=ss[u].end();it++)
            bfs(mi[*it]);
    }
    return ;
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        cin>>s>>x;
        mi[s]=++ans;
        im[ans]=s;
        val[ans]=x;
        vis[ans]=1;
        string fro=s;
        for(int j=s.size()-1;j>=0;j--){
            if(s[j]=='/'){
                string subs=s.substr(0,j+1);
                if(!mi[subs]){
                    mi[subs]=++ans;
                    im[ans]=subs;
                    v[ans].push_back(ans-1);
                    ss[ans].insert(fro);
                    fro=subs;
                }else{
                    v[mi[subs]].push_back(ans);
                    ss[mi[subs]].insert(fro);
                    break;
                }
            }
        }
    }
    scanf("%d",&x);
    dfs(mi["/"]);
    bfs(mi["/"]);
    return 0;
}
/*
2
/a/a/a 100
/b.txt 99
200
8
/b/test/in.a 100
/b/test/in.b 1
/c/test/in.a 100
/c/test/in.b 1
/c/test/pic/in.a.svg 10
/c/test/pic/in.b.svg 10
/a/test/in.a 99
/a/test/in.b 1
101
9
/sys/kernel/notes 100
/cerc/problem/a/testdata/in 1000000
/cerc/problem/a/testdata/out 8
/cerc/problem/a/luka.cc 500
/cerc/problem/a/zuza.cc 5000
/cerc/problem/b/testdata/in 15
/cerc/problem/b/testdata/out 4
/cerc/problem/b/kale.cc 100
/cerc/documents/rules.pdf 4000
10000
*/

 

 

 

J:Justified Jungle

#include <bits/stdc++.h>
using namespace std;
int f[1000006],vis[1000006];
int re[1000006],pos=0;
int n,x,y;
vector<int>v[1000006];
int find(int x){
    return f[x]=f[x]==x?x:find(f[x]);
}
int p[1000006],fin[1000006];
int dfs(int u){
    vis[u]=1;
    int ans=1;
    for(int i=0;i<v[u].size();i++){
        int to=v[u][i];
        if(vis[to]) continue;
        int x=find(u);
        int y=find(to);
        int k;
        if(x!=y){
            k=++pos;
            f[y]=x;
        }
        re[k]=dfs(to);
        ans+=re[k];
        re[k]=min(re[k],n-re[k]);
    }
    return ans;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        f[i]=i;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1);
    int cou=0;
    for(int i=1;i<=n/2;i++){
        if(n%i) continue;
        int inf=0;
        for(int j=1;j<n;j++){
            if(!(re[j]%i)) inf++;
        }
        if(inf>=((n/i)-1)) fin[cou++]=n/i-1;
    }
    sort(fin,fin+cou);
    for(int i=0;i<cou;i++)
        printf("%d%c",fin[i],i==cou-1?'\n':' ');
    return 0;
}

 

posted @ 2019-04-07 20:33  十年换你一句好久不见  阅读(379)  评论(0编辑  收藏  举报