ICM Technex 2017 and Codeforces Round #400 (Div. 1 +Div.2,combined)
A. A Serial Killer
谜一样的题意:每天从两个人里面选一个人杀掉然后另一个人替补,已知每天要杀掉的和代替者和第一天候选的两个人,求每天候选的两个人的名字,顺序任意。
int main()
{
string a,b,c,d;
int n;
cin>>a>>b;
cin>>n;
cout<<a<<" "<<b<<endl;
for(int i=0;i<n;i++)
{
cin>>c>>d;
if(c==a) a=d;
else if(c==b) b=d;
else if(d==a) a=c;
else if(d==b) b=c;
cout<<a<<" "<<b<<endl;
}
// cout<<a<<" "<<b<<endl;
return 0;
}
A题看了17分钟才知道了题意,随手一敲AC,然后B题已经过了尽1000个人了。
B. Sherlock and his girlfriend
题意:n串项链,每串价格依次从2-n+1。现在要个这些珍珠涂色,要求价格是另一个价格的素因子的两串颜色不能相同。求最多需要多少种颜色k,任意输出颜色c(c>=1&&c<=k)。
特判一下1和2即可,其他的都是两种情况,我们知道价格一定是连续的,那么超过2,价格至少达到4,所以这时至少需要两个颜色,我们其实可以让所有的素数是一种颜色,其余的是另一种颜色即可,这样3以上只需两种即可。
讲道理这题水的一比,思路也是秒有,但是一直到结束前7分钟才交上去AC。开始打了个素数表,写着写着突然发现除了1其余的都是2种素数和非素数,却忘了考虑2,当n=2,价格一次为2,3.他们的颜色是可以相等的,于是沙壁似的特判了1然后return,其余的先输出2,再分素数和非素数。然后开C题,题意模模糊糊的时候系统提示被Hacked。于是只能立刻回来继续debug,从开始到现在心烦意乱,我亲爱的CF啊,你为什么要放在这个时间段,你就不能放在傍晚或者凌晨吗,偏偏选在舍友都很活跃的时候,4个人农药开黑,整个宿舍激情回荡。我没法做到心无旁骛,偏偏CF又有点卡,继续交了两发都是跪在Hacked数据上,然后随便输入却发现2的时候输出的种数错了,特判一下直接交页面还没弹出来CF传来no respones。我的那个心急啊,室友依然活跃,我分分钟提刀砍人的冲动你们造吗。down的半个小时终于交上去了,结果得分366,比A题还低100。我是习惯掉分的,可是这样掉分让我很是愤怒啊,啊,啊, ,啊,,啊,。、
void fun()
{
memset(a,-1,sizeof(a));
for(int i=2; i<N; i++)
if(a[i])
{
if(N/i<i) continue;
for(int j=i*i; j<N; j+=i)
a[j]=0;
}
}
int main()
{
fun();
cout<<k<<endl;
int n;
cin>>n;
if(n==1)
{
printf("1\n1\n");
return 0;
}
int ans=1;
for(int i=1;i<=n;i++)
if(a[i+1]&&(i+1)<=(n+1)/2)
{
ans++;
break;
}
cout<<ans<<endl;
for(int i=1;i<=n;i++)
if(a[i+1])
{
cout<<"1"<<" ";
}
else cout<<"2"<<" ";
return 0;
}
C. Molly's Chemicals
虽然延迟10分钟,但C题完全没思路,坐以待毙的感觉真是永生难忘啊,一腔怒火无处发泄。。。。感慨了一下ACM真是个好东西,让人激动让人伤心,让人无法自拔,多少人前赴后继。真是刺激,要是大学过的平庸无味未免有些遗憾,它让你淡泊名利,虚心前行,这段经历将会是一笔不错的人生财富。
好了补上C题。给你一个n和k,然后n个数,求有多少个区间,其和为k的幂。
不知道这题在完全冷静的状态下能不能做出来,不过感觉差不多。
我们用sum[i]表示一个前缀和,然后就是求满足 sum[i]-sum[j]=k^t。这个式子其实就是突破口,正向思维我们无法知道到底有多少[i,j]。所以我们可以反向思维,sum[i]=sum[j]+k^t。这样把k的幂全部处理出来然后一次和sum[j]累加即可,每次就是加上q[sum[i]]]。其实就是这么简单,可是在那种情况下我们大多是直接从问题入手正面寻求解答。。。
要注意的是k为-1和1的情况。。
ll sum[N],b[N],k;
void init(ll k)
{
b[0]=1;
for(int i=1; i<65; i++)
if(b[i-1]<=INF) b[i]=b[i-1]*k;
}
int main()
{
int n;
while(~scanf("%d%I64d",&n,&k))
{
sum[0]=0;
init(k);
ll x;
map<ll,ll>q;
ll ans=0;
for(int i=1; i<=n; i++)
{
for(int j=0; j<65&&b[j]<=INF; j++)
{
if(k==1||k==-1)
{
if(k==-1) q[sum[i-1]-1]++;
q[sum[i-1]+1]++;
break;
}
else q[sum[i-1]+b[j]]++;
}
scanf("%I64d",&x);
sum[i]=sum[i-1]+x;
ans+=q[sum[i]];
}
printf("%I64d\n",ans);
}
return 0;
}
人生啊~~~~~