CodeForces Round 197 Div2
这次出的题水爆了,借着这个机会终于把CF的号变蓝了.
A. Helpful Maths
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Xenia the beginner mathematician is a third year student at elementary school. She is now learning the addition operation.
The teacher has written down the sum of multiple numbers. Pupils should calculate the sum. To make the calculation easier, the sum only contains numbers 1, 2 and 3. Still, that isn't enough for Xenia. She is only beginning to count, so she can calculate a sum only if the summands follow in non-decreasing order. For example, she can't calculate sum 1+3+2+1 but she can calculate sums 1+1+2 and 3+3.
You've got the sum that was written on the board. Rearrange the summans and print the sum in such a way that Xenia can calculate the sum.
Input
The first line contains a non-empty string s — the sum Xenia needs to count. String s contains no spaces. It only contains digits and characters "+". Besides, string s is a correct sum of numbers 1, 2 and 3. String s is at most 100 characters long.
Output
Print the new sum that Xenia can count.
Sample test(s)
Input
3+2+1
Output
1+2+3
Input
1+1+3+1+3
Output
1+1+1+3+3
Input
2
Output
2
题意:输入一个加法算式,把其中的加数按从小到大的顺序排序后输出算式.
思路:如题.
#include<stdio.h>
#include<string.h>
int main()
{
char str[];
int s[],i,j;
scanf("%s",&str[]);
int len=strlen(&str[]);
int T=(len+)/;
for (i=;i<=T;i++) s[i]=str[*i-]-;
for (i=;i<=T-;i++)
for (j=i+;j<=T;j++)
if (s[i]>s[j])
{
int tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
putchar(s[]+);
for (i=;i<=T;i++) printf("+%c",s[i]+);
printf("\n");
return ;
}
B. Xenia and Ringroad
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Xenia lives in a city that has n houses built along the main ringroad. The ringroad houses are numbered 1 through n in the clockwise order. The ringroad traffic is one way and also is clockwise.
Xenia has recently moved into the ringroad house number 1. As a result, she's got m things to do. In order to complete the i-th task, she needs to be in the house number ai and complete all tasks with numbers less than i. Initially, Xenia is in the house number 1, find the minimum time she needs to complete all her tasks if moving from a house to a neighboring one along the ringroad takes one unit of time.
Input
The first line contains two integers n and m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105). The second line contains m integers a1, a2, ..., am (1 ≤ ai ≤ n). Note that Xenia can have multiple consecutive tasks in one house.
Output
Print a single integer — the time Xenia needs to complete all tasks.
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
Sample test(s)
Input
4 33 2 3
Output
6Input
4 32 3 3
Output
2
Note
In the first test example the sequence of Xenia's moves along the ringroad looks as follows: 1 → 2 → 3 → 4 → 1 → 2 → 3. This is optimal sequence. So, she needs 6 time units.
题意:城市里有一条环形公路,一开始在1号位置,共需办n件事,其中第i件要在a[i]位置完成,而且办i时,前i-1件事必须已经完成,求需要花多长时间.
思路:直接模拟.
#include<stdio.h>
int a[];
int abs(int x)
{
if (x<) return -*x;
return x;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
{
scanf("%d",&a[i]);
a[i]--;
}
int cur=;
__int64 ans=;
for (int i=;i<=m;i++)
{
if (a[i]>=cur) ans+=a[i]-cur;
else ans+=n-(cur-a[i]);
cur=a[i];
}
printf("%I64d\n",ans);
return ;
}
C. Xenia and Weights
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Xenia has a set of weights and pan scales. Each weight has an integer weight from 1 to 10 kilos. Xenia is going to play with scales and weights a little. For this, she puts weights on the scalepans, one by one. The first weight goes on the left scalepan, the second weight goes on the right scalepan, the third one goes on the left scalepan, the fourth one goes on the right scalepan and so on. Xenia wants to put the total of m weights on the scalepans.
Simply putting weights on the scales is not interesting, so Xenia has set some rules. First, she does not put on the scales two consecutive weights of the same weight. That is, the weight that goes i-th should be different from the (i + 1)-th weight for any i (1 ≤ i < m). Second, every time Xenia puts a weight on some scalepan, she wants this scalepan to outweigh the other one. That is, the sum of the weights on the corresponding scalepan must be strictly greater than the sum on the other pan.
You are given all types of weights available for Xenia. You can assume that the girl has an infinite number of weights of each specified type. Your task is to help Xenia lay m weights on the scales or to say that it can't be done.
Input
The first line contains a string consisting of exactly ten zeroes and ones: the i-th (i ≥ 1) character in the line equals "1" if Xenia has i kilo weights, otherwise the character equals "0". The second line contains integer m (1 ≤ m ≤ 1000).
Output
In the first line print "YES", if there is a way to put m weights on the scales by all rules. Otherwise, print in the first line "NO". If you can put m weights on the scales, then print in the next line m integers — the weights' weights in the order you put them on the scales.
If there are multiple solutions, you can print any of them.
Sample test(s)
Input
0000000101
3
Output
YES
8 10 8
Input
1000000000
2
Output
NO
题意:有n种砝码,每次取一个放在秤盘一端,下一次则放在另一端.要求:1.每次放完后,放置砝码的一端质量应超过另一端,2.不连续两次放同样质量的砝码.求是否能进行m次放置操作.
思路:直接dfs,枚举每次如何操作.之前有想过贪心:在满足条件的情况下优先选质量小的.但这种想法似乎不太对,目前还没想明白.不过比赛时抱着试一试的想法直接dfs了,没想到居然A了,而且只用了30ms.后来仔细想想,我搜索时是按从小质量到大质量的顺序枚举的,所以构造一组可行解所需的时间其实并不多.
#include<stdio.h>
#include<string.h>
bool find=false,f[];
int s[];
int m;
void dfs(int ax,int bx,int dep,int tar)
{
if (find) return;
if (dep==m+)
{
printf("YES\n%d",s[]);
for (int i=;i<dep;i++) printf(" %d",s[i]);
printf("\n");
find=true;
return;
}
if (tar==)
{
for (int i=;i<=;i++)
if (f[i] && i!=s[dep-] && ax+i>bx)
{
s[dep]=i;
dfs(ax+i,bx,dep+,);
}
}
else
{
for (int i=;i<=;i++)
if (f[i] && i!=s[dep-] && bx+i>ax)
{
s[dep]=i;
dfs(ax,bx+i,dep+,);
}
}
}
int main()
{
char str[];
scanf("%s",&str[]);
memset(f,false,sizeof(f));
for (int i=;i<=;i++)
if (str[i]=='') f[i]=true;
memset(s,,sizeof(s));
scanf("%d",&m);
dfs(,,,);
if (!find) printf("NO\n");
return ;
}
D. Xenia and Bit Operations
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Xenia the beginner programmer has a sequence a, consisting of 2n non-negative integers: a1, a2, ..., a2n. Xenia is currently studying bit operations. To better understand how they work, Xenia decided to calculate some value v for a.
Namely, it takes several iterations to calculate value v. At the first iteration, Xenia writes a new sequence a1 or a2, a3 or a4, ..., a2n - 1 or a2n, consisting of 2n - 1 elements. In other words, she writes down the bit-wise OR of adjacent elements of sequence a. At the second iteration, Xenia writes the bitwise exclusive OR of adjacent elements of the sequence obtained after the first iteration. At the third iteration Xenia writes the bitwise OR of the adjacent elements of the sequence obtained after the second iteration. And so on; the operations of bitwise exclusive OR and bitwise OR alternate. In the end, she obtains a sequence consisting of one element, and that element is v.
Let's consider an example. Suppose that sequence a = (1, 2, 3, 4). Then let's write down all the transformations (1, 2, 3, 4) → (1 or 2 = 3, 3 or 4 = 7) → (3 xor 7 = 4). The result is v = 4.
You are given Xenia's initial sequence. But to calculate value v for a given sequence would be too easy, so you are given additional m queries. Each query is a pair of integers p, b. Query p, b means that you need to perform the assignment ap = b. After each query, you need to print the new value v for the new sequence a.
Input
The first line contains two integers n and m (1 ≤ n ≤ 17, 1 ≤ m ≤ 105). The next line contains 2n integers a1, a2, ..., a2n (0 ≤ ai < 230). Each of the next m lines contains queries. The i-th line contains integers pi, bi (1 ≤ pi ≤ 2n, 0 ≤ bi < 230) — the i-th query.
Output
Print m integers — the i-th integer denotes value v for sequence a after the i-th query.
Sample test(s)
Input
2 4
1 6 3 5
1 4
3 4
1 2
1 2
Output
1
3
3
3
Note
For more information on the bit operations, you can follow this link: http://en.wikipedia.org/wiki/Bitwise_operation
题意:给出2^n个数,第一次邻项求OR,得到2^(n-1)个数,第二次邻项求XOR,得到2^(n-2)个数.以此类推,直到只剩一个数v.给出序列的初始状态,每次改变序列中的一个数,求出改变后的v(更新是累计的).
思路:没什么可说的,线段树.
#include<stdio.h>
struct tnode
{
int p,r;
int m;
int lid,rid;
int K;
int sty;
};
tnode tree[];
int a[],top=;
void build(int u,int col/*0->XOR,1->OR*/)
{
tree[u].sty=col;
if (tree[u].p+==tree[u].r)
{
tree[u].K=a[tree[u].p];
return;
}
tree[u].m=(tree[u].p+tree[u].r)>>;
top++;
tree[u].lid=top;
tree[tree[u].lid].p=tree[u].p;
tree[tree[u].lid].r=tree[u].m;
build(tree[u].lid,-col);
top++;
tree[u].rid=top;
tree[tree[u].rid].p=tree[u].m;
tree[tree[u].rid].r=tree[u].r;
build(tree[u].rid,-col);
if (col) tree[u].K=tree[tree[u].lid].K | tree[tree[u].rid].K;
else tree[u].K=tree[tree[u].lid].K ^ tree[tree[u].rid].K;
}
void modify(int u,int p,int b)
{
if (tree[u].p>p || tree[u].r-<p) return;
if (tree[u].p+==tree[u].r)
{
a[p]=b;
tree[u].K=b;
return;
}
if (p<tree[u].m) modify(tree[u].lid,p,b);
else modify(tree[u].rid,p,b);
if (tree[u].sty) tree[u].K=tree[tree[u].lid].K | tree[tree[u].rid].K;
else tree[u].K=tree[tree[u].lid].K ^ tree[tree[u].rid].K;
}
int main()
{
int n=,m,t;
scanf("%d%d",&t,&m);
for (int i=;i<=t;i++) n <<= ;
for (int i=;i<=n;i++) scanf("%d",&a[i]);
tree[].p=;
tree[].r=n+;
build(,t&);
while (m--)
{
int p,b;
scanf("%d%d",&p,&b);
modify(,p,b);
printf("%d\n",tree[].K);
}
return ;
}
E. Three Swaps
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Xenia the horse breeder has n (n > 1) horses that stand in a row. Each horse has its own unique number. Initially, the i-th left horse has number i. That is, the sequence of numbers of horses in a row looks as follows (from left to right): 1, 2, 3, ..., n.
Xenia trains horses before the performance. During the practice sessions, she consistently gives them commands. Each command is a pair of numbers l, r (1 ≤ l < r ≤ n). The command l, r means that the horses that are on the l-th, (l + 1)-th, (l + 2)-th, ..., r-th places from the left must be rearranged. The horses that initially stand on the l-th and r-th places will swap. The horses on the (l + 1)-th and (r - 1)-th places will swap. The horses on the (l + 2)-th and (r - 2)-th places will swap and so on. In other words, the horses that were on the segment [l, r] change their order to the reverse one.
For example, if Xenia commanded l = 2, r = 5, and the sequence of numbers of horses before the command looked as (2, 1, 3, 4, 5, 6), then after the command the sequence will be (2, 5, 4, 3, 1, 6).
We know that during the practice Xenia gave at most three commands of the described form. You have got the final sequence of numbers of horses by the end of the practice. Find what commands Xenia gave during the practice. Note that you do not need to minimize the number of commands in the solution, find any valid sequence of at most three commands.
Input
The first line contains an integer n (2 ≤ n ≤ 1000) — the number of horses in the row. The second line contains n distinct integers a1, a2, ..., an (1 ≤ ai ≤ n), where ai is the number of the i-th left horse in the row after the practice.
Output
The first line should contain integer k (0 ≤ k ≤ 3) — the number of commads Xenia gave during the practice. In each of the next k lines print two integers. In the i-th line print numbers li, ri (1 ≤ li < ri ≤ n) — Xenia's i-th command during the practice.
It is guaranteed that a solution exists. If there are several solutions, you are allowed to print any of them.
Sample test(s)
Input
5
1 4 3 2 5
Output
1
2 4
Input
6
2 1 4 3 6 5
Output
3
1 2
3 4
5 6
题意:给出一个序列,经过不超过3次区间翻转操作变成递增数列,输出一种可行解.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std; const int N=; struct node {
int s, t;
void init(int a, int b) {
s=a, t=b;
}
} ans[];
int A[][N], n; int checkL(int dep) {
if(A[dep][]!=) return ;
for(int i=; i<=n; i++) if(A[dep][i]!=A[dep][i-]+) return i;
return -;
} int checkR(int dep) {
if(A[dep][n]!=n) return n;
for(int i=n-; i>=; i--) if(A[dep][i]!=A[dep][i+]-) return i;
return -;
} int findpos(int dep, int val) {
for(int i=; i<=n; i++) if(A[dep][i]==val) return i;
} bool DFS(int dep) {
if(dep==) if(checkL(dep)!=-) return false;
else {
printf("%d\n", dep);
for(int i=dep-; i>=; i--) printf("%d %d\n", ans[i].s, ans[i].t);
return true;
} int L=checkL(dep), R=checkR(dep);
if(L==- || R==-) {
printf("%d\n", dep);
for(int i=dep-; i>=; i--) printf("%d %d\n", ans[i].s, ans[i].t);
return true;
}
for(int i=; i<=n; i++) A[dep+][i]=A[dep][i];
int Lpos=findpos(dep+, L), Rpos=findpos(dep+, R); reverse(A[dep+]+L, A[dep+]+Lpos+);
ans[dep].init(L, Lpos);
if(DFS(dep+)) return true;
reverse(A[dep+]+L, A[dep+]+Lpos+); ans[dep].init(Rpos, R);
reverse(A[dep+]+Rpos, A[dep+]+R+);
if(DFS(dep+)) return true;
reverse(A[dep+]+Rpos, A[dep+]+R+); return false;
} int main() {
scanf("%d", &n);
for(int i=; i<=n; i++) scanf("%d", &A[][i]);
DFS();
return ;
}
written by //UESTC_Tumbler
CodeForces Round 197 Div2的更多相关文章
- 线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations
题目传送门 /* 线段树的单点更新:有一个交叉更新,若rank=1,or:rank=0,xor 详细解释:http://www.xuebuyuan.com/1154895.html */ #inclu ...
- Codeforces Round #539 div2
Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...
- 【前行】◇第3站◇ Codeforces Round #512 Div2
[第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...
- Codeforces Round#320 Div2 解题报告
Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...
- Codeforces Round #564(div2)
Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...
- Codeforces Round #361 div2
ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...
- Codeforces Round #626 Div2 D,E
比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...
- CodeForces Round 192 Div2
This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...
- Codeforces Round #197 (Div. 2) (A、B、C、D、E五题合集)
A. Helpful Maths 题目大意 给一个连加计算式,只包含数字 1.2.3,要求重新排序,使得连加的数字从小到大 做法分析 把所有的数字记录下来,从小到大排序输出即可 参考代码 #inclu ...
随机推荐
- vundle安装 给vim插上翅膀
(这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) vundle安装方法如下 首先执行以下命令 $ git clone https://githu ...
- OpenStack 的Nova组件详解
Open Stack Compute Infrastructure (Nova) Nova是OpenStack云中的计算组织控制器.支持OpenStack云中实例(instances)生命周期的所有活 ...
- Step
php+MySQL html+css JQuery Mobile JavaScript weiPHP Sina Cloud 微信公众订阅号平台开发
- Valid Perfect Square
Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...
- sharepoint bcs (bussiness connectivity services)
sharepoint bcs 在2010 版本中是提供2010 与外部数据连接的. BCS全名Business Connectivity Services,可以把它看成SharePoint 2007 ...
- 32.C++不能被继承的类[C++ Final Class]
[题目] 用C++设计一个不能被继承的类. [分析] 这是Adobe公司2007年校园招聘的最新笔试题.这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目. 在Java中定义了 ...
- Java for LeetCode 064 Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- 2.django笔记之缓存,session,cookie,ajax
一.django缓存 1.缓存 缓存的意义在于把昂贵的计算结果保存起来一遍下次的访问,有缓存的站点的流程大概是这样子的: 给定一个url,检查页面是否在缓存中 如果在,返回缓存的页面 否则,生成该页面 ...
- 5.python(迭代器,装饰器,生成器,基本算法,正则)
一,迭代器 1.迭代器 (1)迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退. (2)对于原生支持随机访问的数据结构(如t ...
- 快速排序模板qsort(转载)
qsort 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各 ...