传送门:Problem C

https://www.cnblogs.com/violet-acmer/p/9682082.html

题意:

  给你n个数,定义有两种操作

  ① 1 i j : (i != j) 将a[i]从数列中移除,且a[j] <- a[i]*a[j]

  ② 2 i : 将a[i]从数列中移除,此操作最多使用一次

  注意:将数移除后剩余数的编号并未改变,依旧为初始时的输入顺序

  在经过n-1次操作后使剩余的数最大

题解:

  使用操作②的情况:

  (1) : 数列中含有0

  (2) : 负数个数为奇数个

  n-1个操作的最终结果为负数个数为偶数个,数列中没有0元素(当然除去全是0元素这一情况)

踩坑:

  如果此数列中有负数为奇数个,且含有0元素

  处理方法:

  (1)先将所有0元素通过操作①使其个数变为一个;

  (2)在通过操作①用最大的负数乘以0,去除一个负数两两相乘后对结果贡献最小的负数,使负数个数为偶数个;

  (3)通过②操作去除0元素

AC代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=2e5+; int n;
int a[maxn];
int neg,zero,pos;
int pos0[maxn];
int posNeg;//the position of the max negative number
bool vis[maxn]; void Reader()
{
scanf("%d",&n);
neg=zero=pos=;
posNeg=;
memset(vis,false,sizeof vis);
for(int i=;i <= n;++i)
{
scanf("%d",a+i);
if(a[i] > )
pos++;
else if(a[i] < )
{
neg++;
posNeg=(posNeg == || a[i] > a[posNeg] ? i:posNeg);
}
else
{
zero++;
pos0[zero]=i;
}
}
}
void Process()
{
int ope=;//操作数
if(zero != )//跳出此if语句后 zero == 0 || zero == 1
{
while(zero != )
{
printf("1 %d %d\n",pos0[zero],pos0[zero-]);
vis[pos0[zero]]=true;
zero--;
ope++;
}
}
if(ope == n-)
return ;
if(neg&)//如果负数个数为奇数个,通过去除一个值最大的奇数或乘以0来使奇数个数变为偶数
{
if(zero == )//如果存在0,则让值最大的负数乘以0
{
printf("1 %d %d\n",posNeg,pos0[]);//posNeg与pos0[1]顺序不可颠倒
ope++;
neg--;
if(ope < n-)
{
printf("2 %d\n",pos0[]);
vis[pos0[]]=true;
ope++;
}
}
if(ope == n-)
return ;
if(neg&)//如果 zero == 0,则需要通过删除值最大的负数来使负数个数变为偶数
{
printf("2 %d\n",posNeg);
neg--;
ope++;
}
vis[posNeg]=true;
}
else if(zero == && ope < n-)
{
printf("2 %d\n",pos0[]);
vis[pos0[]]=true;
ope++;
}
if(ope == n-)
return ; int num[maxn];
int index=;
for(int i=;i <= n;++i)
if(vis[i] != true)
num[++index]=i;
for(int i=;i < index;++i)
printf("1 %d %d\n",num[i],num[i+]);
}
int main()
{
Reader();
Process();
}

Codeforces Round #510 (Div. 2)(C)的更多相关文章

  1. Codeforces Round #510 (Div. 2)

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

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

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

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

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

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

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

  5. Codeforces Round #510 (Div. 2)(B)

    传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 如果可以通过喝果汁将维生素A,B,C全部摄取,求最小花费,如 ...

  6. Codeforces Round #510 (Div. 2)(A)

    传送门:Problem A https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 公园里有n个沙滩,a[i]表示第i个沙滩初始人数,现有m个人 ...

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

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

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

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

  9. Codeforces Round #510 Div. 2 Virtual Participate记

    这场打的顺手到不敢相信.如果不是vp的话估计肯定打不到这个成绩. A:最大显然,最小的话每次暴力给最小的+1. #include<iostream> #include<cstdio& ...

随机推荐

  1. 数组-在Shell脚本中的基本使用介绍

    Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节.下面是对shell脚本中数组方面一些操作在此进行记录,希望能帮助到有兴趣的朋友~1. ...

  2. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  3. 网站响应式布局/网站自适应问题+rem、em、px、pt及网站字体大小设配

    Bootstrap 网格系统: Bootstrap CSS: Bootstrap 组件及插件: 一.什么是响应式布局?       响应式布局是Ethan Marcotte在2010年5月份提出的一个 ...

  4. hdu 1263 水果 结构的排序+sort自定义排序

    水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  5. 同步手绘板——json

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  6. 基于SSH 供应链管理系统质量属性说明

    产品的易用程度如何,执行速度如何,可靠性如何,当发生异常情况时,系统如何处理.这些被称为软件质量属性,而特性是指系统非功能(也叫非行为)部分的需求. 性能:性能就是一个东西有多快,通常指响应时间或延迟 ...

  7. C++的内存分区

    C++的内存划分为栈区.堆区.全局区/静态区.字符串常量和代码区. 栈区 由系统进行内存的管理. 主要存放函数的参数以及局部变量.在函数完成执行,系统自行释放栈区内存,不需要用户管理.整个程序的栈区的 ...

  8. 将ubuntu14.04 从mysql从5.5删除之后安装5.7遇到的一些问题(本篇不讨论热升级)

    五一放假实在无聊 继续玩弄新的服务器.发现有台mysql版本实在有点老,估计是akiho直接使用 apt-get install mysql-server ,然后又没有更新到最新的源,然后无脑安装了5 ...

  9. Django-website 程序案例系列-14 缓存的应用配置文件的写法

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5 ...

  10. BZOJ2008 JSOI2010连通数(floyd+bitset)

    一直不明白为什么要用floyd求传递闭包,直接搜不是更快嘛……不过其实可以用bitset优化,方法也比较显然.bitset是真的神奇啊,好多01状态且转移相似的东西都可以用这个优化一下. #inclu ...