题目

题意:

  给你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. NPOI OFFICE 2007 文件格式不被支持,读取异常

    在使用public XSSFWorkbook(FileInfo file) 时报文件格式不被支持,(读取异常/格式错误),根目录少了 ICSharpCode.SharpZipLib.dll . NPO ...

  2. Centos7.0操作系统加固常见方法

    1. 账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险. 操作步骤 使用命令 userdel <用户名> 删除不必要的账号. 使用命令 passwd -l <用 ...

  3. vs2015.无法运行rc.exe

    1.参考文章:无法运行“rc.exe” - wb175208的专栏 - CSDN博客.html(https://blog.csdn.net/wb175208/article/details/83546 ...

  4. STL常用

    nth_element(first,nth,last) first,last 第一个和最后一个迭代器,也可以直接用数组的位置. 将第n个大的元素放到nth位置上,左边元素都小于它,右边元素都大于它. ...

  5. Google大数据三大论文

    简介:https://blog.csdn.net/w1573007/article/details/52966742 论文中英文版下载http://pan.baidu.com/s/1slUy4sl   ...

  6. tp5 关键字模糊查询 日期查询 小于大于某范围等查询的优点

    挺不错,用熟了这tp5封装的很方便. 类似上边一个查询多个操作,基本在model 一个方法搞定代码也不用很多, 首先要学会用scope  网上搜tp scope 有几个例子可以借鉴 model 内添加 ...

  7. django使用pyecharts(5)----django加入echarts_增量更新_定长

    五.Django 前后端分离_定时增量更新图表定长数据 1.安装 djangorestframework linux pip3 install djangorestframework windows ...

  8. C++11<functional>深度剖析:背景、原理、接口与实现

    自C++11以来,C++标准每3年修订一次.C++14/17都可以说是更完整的C++11:即将到来的C++20也已经特性完整了. C++11已经有好几年了,它的年龄比我接触C++的时间要长10倍不止吧 ...

  9. Python2和3字符编码的区别

    Python2和3字符编码的区别 一.字符编码应用之Python 1.1 执行Python程序的三个阶段 Python test.py(我再强调一遍,执行test.py的第一步,一定是先将文件内容从硬 ...

  10. Java基础IO类之打印流

    package IODemo; import java.io.*; /* 打印流 : 很方便的进行输出 字节打印流 增强输出功能 字符打印流 */ public class PrintStreamDe ...