Codeforces Round #510 (Div. 2) C. Array Product
题意:
给你n个数,有两种操作,操作1是把第i个位置的数删去, 操作2 是把 a[ j ]= a[ i ]* a[ j ],把a[ i ]删去 。n-1个操作以后,只剩1个数,要使这个数最大 。要你输出这n-1个步骤。
思路:
结构体储存数和位置, 按值排序,然后分类讨论。
1. 负数个数是奇数,无0 。删除最大的一个负数,别的数正常搞定。
2. 负数个数是奇数,有0 。把最大的一个负数给堆积到最后一个0上,删除最后一个0 。
3. 负数个数是偶数,无0 。 不用删,正常处理。
4. 负数个数是偶数,有0 。 负数不理会,把0全部堆积到最后一个0上,删除最后一个0 。
别的方法有,别人的博客里,不过这种分类讨论的方法坑实在是太多了!!
吐血。。哭了
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const ll mod=1e9+;
const int INF= 0x3f3f3f3f;
const int N=2e5+; int n,p;
struct node
{
ll pos,num;
}a[N]; bool cmp(node x,node y)
{
return x.num<y.num;
}
int main()
{
cin>>n;
int cnt=; //负数的个数
int flag0=; //是否有0
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i].num);
a[i].pos=i; if(a[i].num<) cnt++;
else if(a[i].num==) flag0++;
}
sort(a+,a++n,cmp); if(cnt%== && flag0)
{
int k,j,p;
for(int i=;i<=n;i++)
{
if(a[i].num==)
{
k=i-;
for(j=k+;j<=n;j++)
{
if(a[j].num==)
{
printf("1 %lld %lld\n",a[j-].pos,a[j].pos);
}
else break;
}
break;
}
}
j--;
p=j;
if(k== && j==n) return ;
printf("2 %lld\n",a[p].pos); for(int i=;i<n;i++)
{
if(i+==k)
{
if(j+<=n)
printf("1 %lld %lld\n",a[i].pos,a[j+].pos),i=j;
else break;
}
else if(i==k)
{
if(j+<=n)
printf("1 %lld %lld\n",a[j+].pos,a[j+].pos),i=j+;
else break;
}
else
printf("1 %lld %lld\n",a[i].pos,a[i+].pos);
}
} else if(cnt%== && !flag0)
{
int k,j,p;
for(int i=;i<=n;i++)
{
if(a[i].num<)
{
p=i;
}
}
//if(k==1 && j==n) return 0;
printf("2 %lld\n",a[p].pos); for(int i=;i<n;i++)
{
if(i+==p)
{
if(p+<=n)
printf("1 %lld %lld\n",a[i].pos,a[p+].pos),i=p;
else break;
}
else if(i==p)
{
if(p+<=n)
printf("1 %lld %lld\n",a[p+].pos,a[p+].pos),i=p+;
else break;
}
else
printf("1 %lld %lld\n",a[i].pos,a[i+].pos);
}
} else if(cnt%== && flag0)
{
int k,j,p;
for(int i=;i<=n;i++)
{
if(a[i].num== && flag0>)
{
k=i;
for(j=k+;j<=n;j++)
{
if(a[j].num==)
{
printf("1 %lld %lld\n",a[j-].pos,a[j].pos);
}
else break;
}
break;
}
else if(a[i].num== && flag0==)
{
k=i;
j=k+;
break;
}
}
j--;
p=j;
if(k== && j==n) return ;
printf("2 %lld\n",a[p].pos); for(int i=;i<n;i++)
{
if(i+==k)
{
if(j+<=n)
printf("1 %lld %lld\n",a[i].pos,a[j+].pos),i=j;
else break;
}
else if(i==k)
{
if(j+<=n)
printf("1 %lld %lld\n",a[j+].pos,a[j+].pos),i=j+;
else break;
}
else
printf("1 %lld %lld\n",a[i].pos,a[i+].pos);
}
} else if(cnt%== && !flag0)
{
for(int i=;i<n;i++)
{
printf("1 %lld %lld\n",a[i].pos,a[i+].pos);
}
} }
Codeforces Round #510 (Div. 2) C. Array Product的更多相关文章
- Codeforces Round #510 (Div. 2)
Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...
- codeforces 1042c// Array Product// Codeforces Round #510(Div. 2)
题意:给出一个数组,2种操作:.1:x*y然后x消失,2:除掉x(2操作最多只能进行一次).问最大的结果的一种操作方式.逻辑题,看能不能想全面. 1先数好0,正,负的数量,zero,pos,neg.如 ...
- Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)
D. Petya and Array 题目链接:https://codeforces.com/contest/1042/problem/D 题意: 给出n个数,问一共有多少个区间,满足区间和小于t. ...
- Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)
http://codeforces.com/contest/1042/problem/D 题意 给一个数组n个元素,求有多少个连续的子序列的和<t (1<=n<=200000,abs ...
- codeforces 1042d//Petya and Array// Codeforces Round #510 (Div. 2)
题意:给出一个数组,求其中和小于t的区间数. 先计算前缀和数组sum[i].对当前的sum[i],查询树状数组中有几个比(sum[i]-t)大的数,那么用sum[i]减它就是一个合法区间.再将当前的s ...
- Codeforces Round #181 (Div. 2) A. Array 构造
A. Array 题目连接: http://www.codeforces.com/contest/300/problem/A Description Vitaly has an array of n ...
- Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配
题目链接: http://codeforces.com/problemset/problem/498/C C. Array and Operations time limit per test1 se ...
- Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】
传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...
- Codeforces Round #510 (Div. 2) B. Vitamins
B. Vitamins 题目链接:https://codeforces.com/contest/1042/problem/B 题意: 给出几种药,没种可能包含一种或多种(最多三种)维生素,现在问要吃到 ...
随机推荐
- 【ARTS】01_40_左耳听风-201900812~201900818
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- eclipse设置格式化tab为4个空格和idea一样
- kafka为什么吞吐量高,怎样保证高可用
1:kafka可以通过多个broker形成集群,来存储大量数据:而且便于横向扩展. 2:kafka信息存储核心的broker,通过partition的segment只关心信息的存储,而生产者只负责向l ...
- [转帖]Linux内核系统体系概述
Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...
- 抓包curl解析
目录 背景 code 背景 抓包工具charles抓取的请求curl,是这样: curl -H ':method: POST' -H ':path: /client.action?functionId ...
- 使用AOP进行权限验证
首先我们定义一个切入点(匹配com.ed.controller.Seller开头的controller的所有public方法) @Pointcut("execution(public * c ...
- python 之 前端开发(盒子模型、页面布局、浮动、定位、z-index、overflow溢出)
11.312 盒子模型 HTML文档中的每个元素都被比喻成矩形盒子, 盒子模型通过四个边界来描述:margin(外边距),border(边框),padding(内填充),content(内容区域),如 ...
- 案例(1)-- OOM异常
问题描述: 1.系统在执行某个操作时,必现OOM异常. 问题的定位: 1.排查代码,未发现问题. 2.在虚拟机启动时,添加参数:-XX:+HeapDumpOnOutOfMemoryError(当发生o ...
- JS ES6中export和import详解
1.Export 模块是独立的文件,该文件内部的所有的变量外部都无法获取.如果希望获取某个变量,必须通过export输出, // profile.js export var firstName = ' ...
- 发布后的项目打开swagger
使用netcore作为纯后端提供api已经变得越来越频繁,swagger也成为很多人的选择.通常会在代码中限制ASPNETCORE_ENVIRONMENT为Production时关闭swagger.但 ...