CF Round #569 Div2(contest1180)
比赛链接:http://codeforces.com/contest/1180
Problem A
题意:给出n,问方块数。看图理解。。。

Solution:
找一找规律就可以了,发现方块数为2n*(n-1)+1
Code:
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
int n=read();
printf("%d\n",2*n*n-2*n+1);
return 0;
}
Problem B
题意:给你一个序列,你可以把其中任意个元素变成它的相反数-1,即:\(a_i:-a_i-1\),求乘积最大的方案
Solution:
显然对尽可能多的非负数执行这个操作是最优的,同时我们必然能使这个最大乘积为非负数
同时对于两个非负数\(a,b(b>a)\)来说,\((a+1)b>a(b+1)\)
所以我们就只需要将序列中最小的负数执行操作后的值与最大的非负数比较大小就行了
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int n,_minus,add,a[N];
int maxm,maxa=-1,idm,ida;
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
a[i]>=0?++add:++_minus;
if(a[i]>=0&&a[i]>maxa) ida=i,maxa=a[i];
if(a[i]<0&&a[i]<maxm) idm=i,maxm=a[i];
}int f1=_minus%2,f2=add%2;
if(f1==f2){
for(int i=1;i<=n;i++)
printf("%d ",a[i]<0?a[i]:-a[i]-1);
return 0;
}
if(_minus==1&&!add){
printf("%d ",-a[1]-1);
return 0;
}
if(f1!=f2){
int id,flag=0;
if(-maxm-1>maxa) id=idm;
else id=ida,flag=1;
for(int i=1;i<id;i++)
printf("%d ",a[i]<0?a[i]:-a[i]-1);
printf("%d ",flag?a[id]:-a[id]-1);
for(int i=id+1;i<=n;i++)
printf("%d ",a[i]<0?a[i]:-a[i]-1);
}
}
Problem C
题意:给你一个序列,每次操作取出序列前两个元素\(a,b\),将较大元素放在序列首位,较小元素放在序列末尾,有m次询问,每次询问你第x次操作取出的是哪两个元素
Solution:
显然,当序列中的最大元素为首位时,所有跟它比较的元素都会被踢到队尾,形成循环,而最大元素替换到队首最多需要n-1次操作,则我们可以模拟最大元素替换到队首之前的所有操作,之后的操作则可以根据循环O(1)算出
Code:
#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
#define fir first
#define sec second
using namespace std;
const int N=1e5+1;
int n,m,maxn;
int head,cnt,tail,q[N*31];
pair<int,int> u[N];
ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
q[++tail]=read();
if(q[i]>maxn) maxn=q[i];
}head=1;
while(1){
int x=q[head],y=q[head+1];
u[++cnt]=mp(x,y);
if(x==maxn) break;
if(x>y) q[head+1]=q[head++],q[++tail]=y;
else ++head,q[++tail]=x;
}
for(int i=1;i<=m;i++){
ll x=read();
if(x<=cnt) printf("%d %d\n",u[x].fir,u[x].sec);
else printf("%d %d\n",maxn,q[head+1+(x-cnt)%(n-1)]);
}
return 0;
}
Problem D
题意:给定一个n*m的矩阵,一开始你在(1,1);每次移动时,设你所在点为(x,y),你可选取任意二元组(dx,dy),移动到(x+dx,y+dy)点上,但每次选取的二元组(dx,dy)不能为之前用过的。现在问是否有一种方案使你刚好经过每个点一次,如果有,按先后顺序输出到达的点,否则输出-1。
Solution:
这是一道构造题。考虑从(1,1)和(n,m)两个点依次反向之字形往返跳跃,正确性易证,详见代码(因为不是很好描述)
Code:
#include<bits/stdc++.h>
#define mp make_pair
using namespace std;
const int N=1e6+1;
int n,m,add1=1,add2=-1;
int nx,ny,mx,my,flag;
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void ins(int opt){
if(!opt){
printf("%d %d\n",nx,ny);
if(nx+add1>n||nx+add1<1) ++ny,add1=-add1;
else nx+=add1;
}else{
printf("%d %d\n",mx,my);
if(mx+add2<1||mx+add2>n) --my,add2=-add2;
else mx+=add2;
}
}
int main(){
n=read(),m=read();
nx=ny=1,mx=n,my=m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ins(flag),flag^=1;
return 0;
}
CF Round #569 Div2(contest1180)的更多相关文章
- CF Round #580(div2)题解报告
CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...
- CF round #622 (div2)
CF Round 622 div2 A.简单模拟 B.数学 题意: 某人A参加一个比赛,共n人参加,有两轮,给定这两轮的名次x,y,总排名记为两轮排名和x+y,此值越小名次越前,并且对于与A同分者而言 ...
- [CF Round #295 div2] C. DNA Alignment 【观察与思考0.0】
题目链接:C. DNA Alignment 题目大意就不写了,因为叙述会比较麻烦..还是直接看英文题面吧. 题目分析 经过观察与思考,可以发现,构造的串 T 的每一个字符都与给定串 S 的每一个字符匹 ...
- [CF Round #294 div2] E. A and B and Lecture Rooms 【树上倍增】
题目链接:E. A and B and Lecture Rooms 题目大意 给定一颗节点数10^5的树,有10^5个询问,每次询问树上到xi, yi这两个点距离相等的点有多少个. 题目分析 若 x= ...
- [CF Round #294 div2] D. A and B and Interesting Substrings 【Map】
题目链接:D. A and B and Interesting Substrings 题目大意 给定26个小写字母的权值,一共26个整数(有正有负). 给定一个小写字母组成的字符串(长度10^5),求 ...
- A. Grasshopper And the String(CF ROUND 378 DIV2)
A. Grasshopper And the String time limit per test 1 second memory limit per test 256 megabytes input ...
- A. Alyona and Numbers(CF ROUND 358 DIV2)
A. Alyona and Numbers time limit per test 1 second memory limit per test 256 megabytes input standar ...
- CF Round#436 div2
额,这次的题目其实挺智障的.所以通过这次比赛,我也发现了自己是一个智障.... 不说太多,说多是泪... A. Fair Game 题意:给你一个数组,看你能否把它均分为两个所有元素均相同的子数组. ...
- CF Round #687 Div2 简要题解
题面 A 可以发现,最远的几个人一定是 \((1, 1), (1, m), (n, 1), (n, m)\) 中的一个,直接计算即可. B 注意到颜色数量很少,直接暴力枚举最终的颜色后模拟即可. C ...
随机推荐
- 线程间通信共享变量和queue
在多线程中,数据是共享,如何在多线程安全的通信,是首先要可虑的问题的 #线程间的通信 import timeimport threadingfrom threading import RLock de ...
- 听说这样可以加快oracle入表速度
oracle 用occi编程的时候,批量提交使用绑定变量的方式,主要瓶颈再sql语句解析上,改成merge into后效率没有变化,但是使用绑定变量方法,能加快速度
- 在Bean中获取spring 容器 并通过容器获取容器中其他bean
spring 提供了Awear 接口去 让bean 能感受到外界的环境.Awear 接口有很多实现,常用的有 ApplicationContextAware (可以通过实现这个接口去获取Applica ...
- TCP listener
调试时未关闭之前开启的TCP SERVER: 应该关闭: TcpListener TcpClient 1.开启TCP listener (1)Start()方法失败 异常位置:该异常的产生位置为 tc ...
- Zookeeper - zookeeper安装与配置
1.什么时Zookeeper ZooKeeper:分布式服务框架 Zookeeper -- 管理分布式环境中的数据. 2.安装 1>官网下载压缩包并解压zookeeper-3.4.14.zip ...
- RabbitMQ入门教程(十):队列声明queueDeclare
原文:RabbitMQ入门教程(十):队列声明queueDeclare 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...
- orm的设计思路
一,我们先搞懂什么是orm? ORM:对象关系映射(Object Relational Mapping,简称ORM),目的是想像操作对象一样操作数据库.因为数据库不是面向对象的,所以需要编程进行映射. ...
- 084、Prometheus 到底NB在哪里?(2019-05-06 周一)
参考https://www.cnblogs.com/CloudMan6/p/7709970.html 本节学习Prometheus的核心,多维数据模型 比如要监控容器 webapp1 的内存使 ...
- 安装linux mint后要做20件事
Linux Mint 17 Qiana Cinnamon Linux Mint 17已经发布,定名为Qiana.Mint是Linux最佳发行版之一,它定位于桌面用户,关注可用性和简洁.它携带了风格迥异 ...
- sublime text 3 环境设置
1. 设置build system 环境 tool -> build system -> new build system ,粘贴以下代码并保存 { "cmd":[&q ...