题目链接:http://codeforces.com/gym/101086
A
My Friend of Misery
B
Brother Louie
C
Everything
D
Secure but True
E
Going in Circles
F
Hey JUDgE
G
Paradise City
H
Another Square in the Floor
I
Home Sweet Home
J
Smooth Developer
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD = 1e12;
const int MAXN=100100;
vector<int> vec[MAXN];
map<pair<LL, LL>, int> mp;
int vis[MAXN];
char str[MAXN][20];
void dfs(int x)
{
vis[x]=1;
for(int i=0;i<vec[x].size();i++)
{
if(vis[vec[x][i]])
continue;
dfs(vec[x][i]);
}
}
int main()
{
int T,n,k,i,c, len;
LL tmp1, tmp2;
char s[20];
scanf("%d",&T);
while(T--)
{
mp.clear();
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%s", str[i]);
len = strlen(str[i]);
tmp1 = tmp2 = 0;
for (int j = 0; j < len; j++) {
tmp1 = (tmp1 * 131 + str[i][j]) % MOD;
tmp2 = (tmp2 * 233 + str[i][j]) % MOD;
}
mp[make_pair(tmp1, tmp2)]=i;
vec[i].clear();
scanf("%d",&c);
while(c--)
{
scanf("%s", s);
len = strlen(s);
tmp1 = tmp2 = 0;
for (int j = 0; j < len; j++) {
tmp1 = (tmp1 * 131 + s[j]) % MOD;
tmp2 = (tmp2 * 233 + s[j]) % MOD;
}
vec[i].push_back(mp[make_pair(tmp1, tmp2)]);
}
}
memset(vis,0,sizeof(vis));
while(k--)
{
scanf("%s", s);
len = strlen(s);
tmp1 = tmp2 = 0;
for (int j = 0; j < len; j++) {
tmp1 = (tmp1 * 131 + s[j]) % MOD;
tmp2 = (tmp2 * 233 + s[j]) % MOD;
}
dfs(mp[make_pair(tmp1, tmp2)]);
}
for(i=1;i<=n;i++)
{
if(vis[i]) printf("%s\n", str[i]);
}
}
}
K
Betrayed
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
vector<int> vec[22][MAXN];
int trnum[22],suc[22],dp[22][MAXN],dis[22][MAXN];
double ans[MAXN];
int dfs1(int tindex,int x,int fa)
{
int ret=0,tmp,son;
for(int i=0;i<vec[tindex][x].size();i++)
{
son=vec[tindex][x][i];
if(fa==son)
continue;
tmp=dfs1(tindex,son,x)+1;
if(ret<tmp)
{
ret=tmp;
// from[tindex][x]=vec[tindex][x][i];
}
}
return dis[tindex][x]=ret;
}
void dfs2(int tindex,int x,int fa,int fadis)
{
int i,j,mx,mxindex,tmp,son;
mx=fadis+1;
mxindex=fa;
for(i=0;i<vec[tindex][x].size();i++)
{
son=vec[tindex][x][i];
if(son==fa)
continue;
if(mx<dis[tindex][son]+1)
{
mx=dis[tindex][son]+1;
mxindex=son;
}
}
dp[tindex][x]=mx;
for(i=0;i<vec[tindex][x].size();i++)
{
son=vec[tindex][x][i];
if(son==fa)
continue;
if(son==mxindex)
{
tmp=fadis+1;
for(j=0;j<vec[tindex][x].size();j++)
{
if(vec[tindex][x][j]==fa||vec[tindex][x][j]==mxindex)
continue;
tmp=max(tmp,dis[tindex][vec[tindex][x][j]]+1);
}
dfs2(tindex,son,x,tmp);
}
else
dfs2(tindex,son,x,mx);
}
}
int main()
{
int T,c,k,i,j,a;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&c,&k);
for(i=1;i<=c;i++)
{
scanf("%d",&trnum[i]);
for(j=1;j<=trnum[i];j++)
vec[i][j].clear();
for(j=2;j<=trnum[i];j++)
{
scanf("%d",&a);
vec[i][a].push_back(j);
vec[i][j].push_back(a);
}
}
for(i=1;i<=c;i++)
{
// cout<<"i= "<<i<<endl;
dfs1(i,1,-1);
// cout<<"i= "<<i<<endl;
dfs2(i,1,-1,-1);
}
memset(suc,0,sizeof(suc));
for(i=1;i<=c;i++)
{
for(j=1;j<=trnum[i];j++)
{
if(dp[i][j]<=k)
suc[i]++;
}
// cout<<i<<": "<<suc[i]<<"/"<<trnum[i]<<endl;
}
ans[0]=0;
for(i=1;i<=c;i++)
ans[i]=(4+ans[i-1])*1.0/suc[i]*trnum[i]-3;
printf("%.4f\n",ans[c]);
}
}
L
Chance
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
int npri[MAXN],arr[MAXN];
int judge(int x)
{
int num=0;
while(x)
{
if(x&1)
num++;
x>>=1;
}
return npri[num]==0;
}
int main()
{
int i,j,T,l,r;
npri[0]=npri[1]=1;
for(i=2;i<MAXN;i++)
{
if(npri[i])
continue;
for(j=i+i;j<MAXN;j+=i)
{
npri[j]=1;
}
}
arr[0]=0;
for(i=1;i<MAXN;i++)
{
arr[i]=judge(i)+arr[i-1];
}
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&l,&r);
if(l)
printf("%d\n",arr[r]-arr[l-1]);
else
printf("%d\n",arr[r]);
}
}
M
ACPC Headquarters : AASTMT (Stairway to Heaven)
#include<bits/stdc++.h>
using namespace std;
int data[10010][370];
map<string,int> mp;
map<string,int> ::iterator it;
vector<string> ans;
int main()
{
int T,n,cnt,s,t,v,i,index;
char c[15];
string str;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cnt=1;
mp.clear();
ans.clear();
memset(data,0,sizeof(data));
while(n--)
{
scanf("%s%d%d%d",&c,&s,&t,&v);
while(v--)
{
cin>>str;
if(!mp[str])
mp[str]=cnt++;
data[mp[str]][s]++;
data[mp[str]][t+1]--;
}
}
for(it=mp.begin();it!=mp.end();it++)
{
index=it->second;
for(i=1;i<=365;i++)
{
data[index][i]+=data[index][i-1];
if(data[index][i]>1)
{
ans.push_back(it->first);
break;
}
}
}
sort(ans.begin(),ans.end());
printf("%d\n",(int)ans.size());
for(i=0;i<ans.size();i++)
{
cout<<ans[i]<<endl;
}
}
}