比赛链接: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)的更多相关文章

  1. CF Round #580(div2)题解报告

    CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...

  2. CF round #622 (div2)

    CF Round 622 div2 A.简单模拟 B.数学 题意: 某人A参加一个比赛,共n人参加,有两轮,给定这两轮的名次x,y,总排名记为两轮排名和x+y,此值越小名次越前,并且对于与A同分者而言 ...

  3. [CF Round #295 div2] C. DNA Alignment 【观察与思考0.0】

    题目链接:C. DNA Alignment 题目大意就不写了,因为叙述会比较麻烦..还是直接看英文题面吧. 题目分析 经过观察与思考,可以发现,构造的串 T 的每一个字符都与给定串 S 的每一个字符匹 ...

  4. [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= ...

  5. [CF Round #294 div2] D. A and B and Interesting Substrings 【Map】

    题目链接:D. A and B and Interesting Substrings 题目大意 给定26个小写字母的权值,一共26个整数(有正有负). 给定一个小写字母组成的字符串(长度10^5),求 ...

  6. 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 ...

  7. 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 ...

  8. CF Round#436 div2

    额,这次的题目其实挺智障的.所以通过这次比赛,我也发现了自己是一个智障.... 不说太多,说多是泪... A. Fair Game 题意:给你一个数组,看你能否把它均分为两个所有元素均相同的子数组. ...

  9. CF Round #687 Div2 简要题解

    题面 A 可以发现,最远的几个人一定是 \((1, 1), (1, m), (n, 1), (n, m)\) 中的一个,直接计算即可. B 注意到颜色数量很少,直接暴力枚举最终的颜色后模拟即可. C ...

随机推荐

  1. Java 浮点数的范围和精度

    本篇先介绍IEEE754标准中针对浮点数的规范,然后以问答形式补充有关浮点数的知识点. (一)IEEE754标准 IEEE 754 标准即IEEE浮点数算术标准,由美国电气电子工程师学会(IEEE)计 ...

  2. flask第一级

    #从flask这个包中导入Flask这个类 #Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 #注册url.注册蓝图等都是基于这个类的对象 from flask import Flas ...

  3. 解决SQLPLUS ??? 显示的临时办法

    错误现象为: 解决命令 export NLS_LANG=american_america.zhs16gbk

  4. C++中的单例类模板

    1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以: 2,需求的提出: 1,在架构设计时,某些类在整个系统生命 ...

  5. Docker之Harbor私服的搭建及使用

    目录 0. 前置条件 1. 下载地址 2. 安装 2.1 编辑harbor.yml 2.3 安装 2.4 访问配置的域名 2.5 常用命令 2.6 测试提交镜像 0. 前置条件 安装docker # ...

  6. jQuery-点击按钮页面滚动到顶部,底部,指定位置

    $('.scroll_top').click(function(){$('html,body').animate({scrollTop: '0px'}, 800);}); //页面滚动至顶部 $('. ...

  7. Git_初步了解

    Git入门篇 一:Git是什么?Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库 ...

  8. Linux知识补课

    Linux补课 已经将开发环境转Linux了(当然用的是ubuntu,图像界面还是舒服一点,支持也多),不上QQ和微信的话用的还是挺舒服的,但是无奈基础欠账太多,这里赶快补一下 Linux和Unix的 ...

  9. 1-Kubernetes基本概念

    Kubernetes中的大部分概念如Node.Pod.Replication Controller.Service等都可以看作一种"资源对象",几乎所有的资源对象都可以通过Kube ...

  10. 获取url中参数值

    function GetRequest() {var url = window.location.href; //获取url中"?"符后的字串var theRequest = ne ...