Codeforces Round #177 (Div. 2) 题解
【前言】咦?如今怎么流行打CF了?于是当一帮大爷在执着的打div 1的时候,我偷偷的在刷div 2。至于怎么决定场次嘛。一般我报一个数字A,随便再拉一个人选一个数字B。然后開始做第A^B场。假设认为机密性不高,来点取模吧。
然后今天做的这场少有的AK了。(事实上模拟赛仅仅做完了4题。最后1题来不及打了)
等等。话说前面几题不用写题解了?算了,让我难得风光一下啦。
【A】
2 seconds
256 megabytes
standard input
standard output
Little penguin Polo adores integer segments, that is, pairs of integers [l; r] (l ≤ r).
He has a set that consists of n integer segments: [l1; r1], [l2; r2], ..., [ln; rn].
We know that no two segments of this set intersect. In one move Polo can either widen any segment of the set 1 unit to the left or 1 unit to the right, that is transform [l; r] to
either segment[l - 1; r], or to segment [l; r + 1].
The value of a set of segments that consists of n segments [l1; r1], [l2; r2], ..., [ln; rn] is
the number of integers x, such that there is integer j,
for which the following inequality holds, lj ≤ x ≤ rj.
Find the minimum number of moves needed to make the value of the set of Polo's segments divisible by k.
The first line contains two integers n and k (1 ≤ n, k ≤ 105).
Each of the following n lines contain a segment as a pair of integers li andri ( - 105 ≤ li ≤ ri ≤ 105),
separated by a space.
It is guaranteed that no two segments intersect. In other words, for any two integers i, j (1 ≤ i < j ≤ n) the
following inequality holds,min(ri, rj) < max(li, lj).
In a single line print a single integer — the answer to the problem.
2 3
1 2
3 4
2
3 7
1 2
3 3
4 7
0
这道题究竟有什么意思呢?反正题目是模模糊糊的看懂的。
好像是给定N个段和数K,你能够把某一段的L减一,把某一段的R加一,都算一次操作。终于要使得总长度%K=0。求最少操作次数。
直接贴代码算了。
#include<cstdio>
using namespace std;
int n,k,i,ans,x,y;
int main()
{
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++)
scanf("%d%d",&x,&y),ans+=y-x+1;
if (ans%k==0) puts("0");
else printf("%d",k-ans%k);
return 0;
}
【B】
2 seconds
256 megabytes
standard input
standard output
Little penguin Polo has an n × m matrix, consisting of integers. Let's index the matrix rows from 1 to n from
top to bottom and let's index the columns from 1 to m from left to right. Let's represent the matrix element on the intersection of row i and
column j as aij.
In one move the penguin can add or subtract number d from some matrix element. Find the minimum number of moves needed to make all matrix elements equal.
If the described plan is impossible to carry out, say so.
The first line contains three integers n, m and d (1 ≤ n, m ≤ 100, 1 ≤ d ≤ 104) —
the matrix sizes and the d parameter. Next n lines
contain the matrix: the j-th integer in the i-th
row is the matrix element aij (1 ≤ aij ≤ 104).
In a single line print a single integer — the minimum number of moves the penguin needs to make all matrix elements equal. If that is impossible, print "-1" (without
the quotes).
2 2 2
2 4
6 8
4
1 2 7
6 7
-1
题意是给出N*M个带权方格,每次操作仅仅能对每一个格子+或-d。
求把全部方块变成同样的权值最小操作次数,无解输出-1。判是否有解解非常easy,仅仅要权值A%d是否是定值,或者ΔA%d是否=0。
假设有解的话一定是改成中位数。
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100005],num,n,m,d,i,j,tot,ans;
int main()
{
scanf("%d%d%d",&n,&m,&d);
scanf("%d",&a[tot=1]);num=a[1]%d;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
if (i==1&&j==1) continue;
scanf("%d",&a[++tot]);
if (a[tot]%d!=num) {puts("-1");return 0;}
}
sort(a+1,a+tot+1);
for (i=1;i<=tot;i++)
ans+=abs(a[i]-a[(tot+1)>>1])/d;
printf("%d",ans);
return 0;
}
【C】
2 seconds
256 megabytes
standard input
standard output
Little penguin Polo adores strings. But most of all he adores strings of length n.
One day he wanted to find a string that meets the following conditions:
- The string consists of n lowercase English letters (that is, the string's length equals n),
exactly k of these letters are distinct. - No two neighbouring letters of a string coincide; that is, if we represent a string as s = s1s2... sn,
then the following inequality holds,si ≠ si + 1(1 ≤ i < n). - Among all strings that meet points 1 and 2, the required string is lexicographically smallest.
Help him find such string or state that such string doesn't exist.
String x = x1x2... xp is lexicographically
less than string y = y1y2... yq,
if either p < q and x1 = y1, x2 = y2, ...
, xp = yp,
or there is such number r (r < p, r < q),
that x1 = y1, x2 = y2, ...
, xr = yr and xr + 1 < yr + 1.
The characters of the strings are compared by their ASCII codes.
A single line contains two positive integers n and k (1 ≤ n ≤ 106, 1 ≤ k ≤ 26) —
the string's length and the number of distinct letters.
In a single line print the required string. If there isn't such string, print "-1" (without the quotes).
7 4
ababacd
4 7
-1
构造题。
构造一个字典序最小的小写字符串。使得相邻两个字母不同。并且恰好仅仅按顺序出现了K个字母。大概的想法就是前面一直a和b交替,后来K-2位一直沿着c,d。e放下去。
注意这道题是有
cha点的。
假设K=1,显然是无解,由于相邻两个不能同样。可是当N=1时还是正确的:'a'!
#include<cstdio>
#define PR ({puts("-1");return 0;})
using namespace std;
int n,i,m;
int main()
{
scanf("%d%d",&n,&m);
if (m==1&&n==1) {putchar('a');return 0;}
if (m>n||m==1) PR;
for (i=1;i<=n-(m-2);i++)
if (i&1) putchar('a');else putchar('b');
for (i=1;i<=m-2;i++) putchar((char)(i+98));
return 0;
}
【D】
2 seconds
256 megabytes
standard input
standard output
Little penguin Polo loves his home village. The village has n houses, indexed by integers from 1 to n.
Each house has a plaque containing an integer, the i-th house has a plaque containing integer pi (1 ≤ pi ≤ n).
Little penguin Polo loves walking around this village. The walk looks like that. First he stands by a house number x. Then he goes to the house whose number
is written on the plaque of house x (that is, to house px),
then he goes to the house whose number is written on the plaque of house px (that
is, to house ppx),
and so on.
We know that:
- When the penguin starts walking from any house indexed from 1 to k, inclusive, he can walk to house number 1.
- When the penguin starts walking from any house indexed from k + 1 to n,
inclusive, he definitely cannot walk to house number 1. - When the penguin starts walking from house number 1, he can get back to house number 1 after some non-zero number of walks from a house to a house.
You need to find the number of ways you may write the numbers on the houses' plaques so as to fulfill the three above described conditions. Print the remainder after dividing this number by 1000000007 (109 + 7).
The single line contains two space-separated integers n and k (1 ≤ n ≤ 1000, 1 ≤ k ≤ min(8, n))
— the number of the houses and the number k from the statement.
In a single line print a single integer — the answer to the problem modulo 1000000007 (109 + 7).
5 2
54
7 4
1728
開始还以为是DP。然后题意看了半天。大意是有N个房子,让你给每一个房子加一个“索引”P,当你到了X后,你下一次去Px。
再给定一个数K。对索引有下列三个要求:
①从1号点走出去后必须能回到1号点。
②从前K号点走出去后必须能回到1号点。(为什么认为上面一个是多余的?)
③从K+1~N号点走出去后必须不能回到1号点。
求全部索引的方案取模10^9+7的值。
对于K+1~N号点。显然和1~K是隔绝的。因此方案数是简单的计算(N-K)^(N-K)。
对于1号点。显然它能够填K种索引。
对于2~K号点,開始我束手无策。
后来发现K<=8!那么仅仅要简单的dfs一下,再验证一下就可以。
最后用乘法原理把三者乘起来。
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const LL P=1000000007ll;
int a[10],f[10],i;
LL num,ans,n,k;
int work(int k,int flag)
{
f[k]=flag;if (k==1) return 1;
if (f[a[k]]!=flag) return work(a[k],flag);
return 0;
}
inline void check()
{
int ok=1;memset(f,0,sizeof(f));
for (int i=2;i<=k&&ok;i++)
ok&=work(i,i);
if (ok) num++;
}
void dfs(int now)
{
if (now==k+1) {check();return;}
for (int i=1;i<=k;i++)
a[now]=i,dfs(now+1);
}
int main()
{
scanf("%I64d%I64d",&n,&k);ans=k;
for (i=1;i<=n-k;i++)
(ans*=(n-k))%=P;
dfs(2);
if (num) (ans*=num)%=P;
printf("%I64d",ans);
return 0;
}
【E】
2 seconds
256 megabytes
standard input
standard output
Little penguin Polo likes permutations. But most of all he likes permutations of integers from 0 to n,
inclusive.
For permutation p = p0, p1, ..., pn,
Polo has defined its beauty — number
.
Expression
means
applying the operation of bitwise excluding "OR" to numbers x and y.
This operation exists in all modern programming languages, for example, in language C++ and Java it is represented as "^"
and in Pascal — as "xor".
Help him find among all permutations of integers from 0 to n the
permutation with the maximum beauty.
The single line contains a positive integer n (1 ≤ n ≤ 106).
In the first line print integer m the maximum possible beauty. In the second line print any permutation of integers from 0 to n with
the beauty equal to m.
If there are several suitable permutations, you are allowed to print any of them.
4
20
0 2 1 4 3
题意非常清楚。求0~N的排列Ai,使得max{Σi^A[i]}。
開始以为是从大到小枚举i,在字母树中贪心地找与它尽量能匹配的。后来打表后发现是一一相应的,不用这么麻烦。假设i没有被匹配过,我们能够构造出k<i,且k和i匹配的值=k+i。然后扫一遍就可以。
这里是打表程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,sum,t,now,ans,i,wri[10005][105],a[105];
int main()
{
freopen("1.txt","w",stdout);
for (n=3;n<=9;n++)
{
sum=1;int F=0;
for (i=0;i<=n;i++)
a[i]=i,sum*=(n+1-i);
ans=0;
for (t=1;t<=sum;t++)
{
now=0;
for (i=0;i<=n;i++)
now+=(i^a[i]);
if (now>ans)
ans=now,F=1,memcpy(wri[1],a,sizeof(a));
else if (now==ans) memcpy(wri[++F],a,sizeof(a));
next_permutation(a,a+n+1);
}
printf("%d %d\n",n,ans);
for (int j=1;j<=F;j++)
{
for (i=0;i<=n;i++) printf("%d ",wri[j][i]);
puts("");
}
puts("");
}
return 0;
}
这里是AC程序:
#include<cstdio>
#include<cmath>
using namespace std;
int a[25],f[1000005],x,k,i,n;long long ans=0;
int main()
{
scanf("%d",&n);
for (i=n;i;i--)
if (!f[i])
{
k=(int)(log2(i))+1;x=(1<<k)-1-i;
f[x]=1;a[i]=x;a[x]=i;ans+=(long long)((1<<k)-1)<<1;
}
printf("%I64d\n",ans);
for (i=0;i<=n;i++) printf("%d ",a[i]);
}
Codeforces Round #177 (Div. 2) 题解的更多相关文章
- Codeforces Round #177 (Div. 1) 题解【ABCD】
Codeforces Round #177 (Div. 1) A. Polo the Penguin and Strings 题意 让你构造一个长度为n的串,且里面恰好包含k个不同字符,让你构造的字符 ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- Codeforces Round #160 (Div. 1) 题解【ABCD】
Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...
随机推荐
- Linux命令之sort
sort [选项] [文件] 对文本文件的行进行排序.常见的字符排序空字符串<数字<a<A<b<B...<z<Z (1).常用选项 -b,--ignore-l ...
- 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】
问题 C: 二进制 时间限制: 1 Sec 内存限制: 128 MB提交: 8 解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 pupil发现对于一个十进制数,无论怎么将其的数字 ...
- (转)求质数算法的N种境界[1] - 试除法和初级筛法
★引子 前天,俺在<俺的招聘经验[4]:通过笔试答题能看出啥?>一文,以"求质数"作为例子,介绍了一些考察应聘者的经验.由于本文没有政治敏感内容,顺便就转贴到俺在CSD ...
- 【20181019T3】比特战争【最小生成树思想】
题面 [错解] Hmm不可做啊 要不按b排个序? 然后并查集瞎搞,刷刷刷过了样例 然后大样例大了几万倍 出了组小数据,Successful Hack 弃疗 水过10分 [正解] 用占领的边将顶点连起来 ...
- hdu 5755(Gauss 消元) &poj 2947
Gambler Bo Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tota ...
- 【(博弈)dfs序+树状数组】BZOJ2819-Nim
[题目大意] 普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.现在对每一堆编号1,2,3,4,...n,在 ...
- Java程序运行时内存划分
1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在 ...
- OC @class关键字
1.引用一个类的两种办法 @class:如果你只是定义成员变量.属性 #import:如果是继承某个类 2.两种方法的区别 #import方式会包含被引用类的所有信息,包括被引用类的变量和方法: ...
- 用latex写毕业论文
用 LaTeX 写漂亮学位论文(from wloo) 序 一直觉得有必要写这样一篇文章,因为学位论文从格式上说更像一本书,与文章 的排版不同,不仅多出目录等文章没有的部分,而且一般要设置页眉页脚方便阅 ...
- 使用weinre调试手机页面
阅读目录 介绍Weinre 安装Weinre 通过Weinre调试页面 启动target 介绍Weinre Weinre(Web Inspector Remote),是一种远程调试工具.功能与Fire ...