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 ...
随机推荐
- 深入理解java:2.4. 线程本地变量 java.lang.ThreadLocal类
ThreadLocal,很多人都叫它做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多. 可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那样每个线程可以访问自己内 ...
- The system has no LUN copy license
[问题描述] ipsan作为cinder后端的时候,通过快照创建磁盘失败,报以下错误: { u 'data': {}, u 'error': { u 'code': 1077950181, u 'de ...
- Objective-C中的自动释放池
自动释放池块@autoreleasepool 自动释放池块在MRC和ARC下都可以使用.在MARC下,为了将自动释放池块内部的变量放入自动释放池,需要手动调用autorelease方法:在ARC下,只 ...
- C#模态对话框和非模态对话框
模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ...
- springBoot2.0配置profile
1. 使用yaml来配置,直接配置application.yml文件 server: port: 8888 spring: profiles: active: dev # 激活生产环境 --- # 测 ...
- python_操作MySQL 初解
单文件操作数据库 import random import threading, multiprocessing import time, datetime import pymysql import ...
- java_时间戳与Date_相互转化的实现代码
转载自: java_时间戳与Date_相互转化的实现代码
- [转载]Linux查看文件编码格式及文件编码转换
原文地址:https://blog.csdn.net/gatieme/article/details/55045883 3 linux下查看编码的方法 方法一:file filename file c ...
- 手把手 教你把H5页面打造成windows 客户端exe 软件
序言: 好久没有更新博客了,最近在工作中碰到这种需求,由于没有做过,中间碰到好多坑,最后在一位贵人帮助的情况下,最终还是搞定了. 第一步,先安装 cefpython3 pip install cefp ...
- Python 描述符 (descriptor)
1.什么是描述符? 描述符是Python新式类的关键点之一,它为对象属性提供强大的API,你可以认为描述符是表示对象属性的一个代理.当需要属性时,可根据你遇到的情况,通过描述符进行访问他(摘自Pyth ...