题目

题意:

  给你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的更多相关文章

  1. Codeforces Round #510 (Div. 2)

    Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...

  2. codeforces 1042c// Array Product// Codeforces Round #510(Div. 2)

    题意:给出一个数组,2种操作:.1:x*y然后x消失,2:除掉x(2操作最多只能进行一次).问最大的结果的一种操作方式.逻辑题,看能不能想全面. 1先数好0,正,负的数量,zero,pos,neg.如 ...

  3. Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)

    D. Petya and Array 题目链接:https://codeforces.com/contest/1042/problem/D 题意: 给出n个数,问一共有多少个区间,满足区间和小于t. ...

  4. Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)

    http://codeforces.com/contest/1042/problem/D 题意 给一个数组n个元素,求有多少个连续的子序列的和<t (1<=n<=200000,abs ...

  5. codeforces 1042d//Petya and Array// Codeforces Round #510 (Div. 2)

    题意:给出一个数组,求其中和小于t的区间数. 先计算前缀和数组sum[i].对当前的sum[i],查询树状数组中有几个比(sum[i]-t)大的数,那么用sum[i]减它就是一个合法区间.再将当前的s ...

  6. Codeforces Round #181 (Div. 2) A. Array 构造

    A. Array 题目连接: http://www.codeforces.com/contest/300/problem/A Description Vitaly has an array of n ...

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

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

  9. Codeforces Round #510 (Div. 2) B. Vitamins

    B. Vitamins 题目链接:https://codeforces.com/contest/1042/problem/B 题意: 给出几种药,没种可能包含一种或多种(最多三种)维生素,现在问要吃到 ...

随机推荐

  1. k8s 使本地集群支持 LoadBalancer 服务

    k8s 使本地集群支持 LoadBalancer 服务 为了使本地集群支持 LoadBalancer 服务,可以参考以下两种实现方案: keepalived-cloud-provider metalL ...

  2. 第七章 云原生生态的基石 Kubernetes

    7.1 Kubernetes架构 K8s的核心组件: etcd: 协同存储,负责保存整个集群的状态. API:资源操作的唯一入口. controller manager: 维护集群的状态,执行故障检测 ...

  3. WXS --注释

  4. 找出整数数组中出现次数超过数组长度一半的元素(Java)

    Question:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 package com.study.zhipengs.test; import java.util.Arrays; im ...

  5. ubuntu 安装 typora

    # or run: # sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE wget -qO ...

  6. Beginning Linux Programming 学习--chapter 11 Processes and Signals

     What's process--什么是进程? The UNIX standards, specifically IEEE Std 1003.1, 2004 Edition, defines a pr ...

  7. Spring中声明式事务的注解@Transactional的参数的总结(REQUIRED和REQUIRES_NEW的与主方法的回滚问题)

    一.事务的传播行为1.介绍 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.2.属性 事务的传播行为可以由传 ...

  8. PyTorch 常用代码段整理

    基础配置 检查 PyTorch 版本 torch.__version__               # PyTorch version torch.version.cuda              ...

  9. 网络爬虫基本概念与Scrapy工具包使用

    Scrapy网络爬虫 Scrapy结构图: Scrapy流动图 图 2-1 1.在D:\Workspace下新建ScrapyTest文件夹,即D:\Workspace\ScrapyTest 2.cd ...

  10. django使用pyecharts(6)----django加入echarts_增量更新_定长_坐标轴定长

    六.Django 前后端分离_定时增量更新图表(坐标轴定长) 1.安装 djangorestframework linux pip3 install djangorestframework windo ...