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; }