比赛链接: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. 最新的省市编码和sql

    下面的项目是整理的最新的省市编码sql文件,可以看看. github

  2. Mysql数据库表结构设计准则

    一:动静分离 解释:最好做好静态表和动态表的分离.这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存).动态表:一些频繁修改的表 二:关于 ...

  3. 4、android studio打包的时候遇到的问题

    那就去掉该签名 但是如果使用generated apk的话,则是不会去调用build.gradle文件的,需要使用gradle命令来打包 https://blog.csdn.net/cencibuqi ...

  4. visual studio git 忽略文件配置模板

    ## Ignore Visual Studio temporary files, build results, and## files generated by popular Visual Stud ...

  5. eclipse控制台输出太多被顶掉问题

    控制台空白处右键 属性

  6. java复习(3)继承

    一.继承为题的提出 ---------------------------------------------------- 我们知道面向对象的三大特性是:封装.继承和多态,可以知道继承在java应用 ...

  7. join 与 countdownlatch 的区别 扩展 栅栏 CyclicBarrier

    我们先看一个 小例子 , 使用 join 与CountDownSlatch 都可以完成 当1,2线程 完全结束后 3 线程 start 对比我们就能够知道 CountDownSlatch 比 JOIN ...

  8. iOS崩溃分析

    崩溃的分析 最近修复了一些iOS项目的崩溃,想分析总结一下这些崩溃的原因,以及预防.崩溃的原因一般有下面几种: 内存访问错误(这个出现的比较多,原因多种多样) 非法指令的执行(超出权限范围内的指令) ...

  9. func_get_args func_num_args 的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用: func_num_args一般写在方法中,用于计数 function eeee($a='gg ...

  10. Nginx 别名访问

    #添加另一个域名,在浏览器中输入 etiantian.org,总是调到 www.etiantian.org server { listen            80; server_name   w ...