http://codeforces.com/contest/1042/problem/C

给你一个有n个元素序列,有两个操作:
1,选取a[i]和a[j],删除a[i],将$a[i]*a[j]$赋值给a[j]
2,任意选定一个数删除(只能做一次).
打印操作,让最后剩下的数最大。

题意还是比较好理解的。

我们可以想到我们需要先把所有的0,合为一个,然后判断负数两两配对是否多出一个(!%2),两两配对后,两个负数相乘变为正数,正数当然越乘越大。

如果多出一个来,因为要让乘积最大,那么对于负数而言,我们需要删掉最大的负数,将这个最大的负数和0进行1操作,然后删除0(删除两个数的乘积)。

如果负数为偶数,那么我们直接把0的位置,删掉就好了,将剩下的的乘起来。

这样大体的思想就出来了,要注意一大堆细节问题:

1.如果全是0,那么我们只进行1操作(n-1)次就好,做完return 0;

2.没有0,。

3.没有负数。

4.没有正数。

上边的四种情况在代码中都有体现:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int cnt,cnt1,cnt2,n,x;
struct ahah
{
int x,pos;
} a[],b[],c[];
bool cmp(ahah a,ahah b){ return abs(a.x)<abs(b.x); }
int main()
{
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d",&x);
if(x==)c[++cnt].pos=i;
if(x<)a[++cnt1].x=x,a[cnt1].pos=i;
if(x>)b[++cnt2].x=x,b[cnt2].pos=i;
}
sort(a+,a++cnt1,cmp);
sort(b+,b++cnt2,cmp);
int v=-;
if(cnt!=)
{
v=c[].pos;
for(int i=; i<=cnt; i++)
{
printf("1 %d %d\n",v,c[i].pos);
v=c[i].pos;
}
}
if(cnt==n)return ;
if(cnt1%==)
{
if(v!=-)printf("2 %d\n",v),v=-;
if(cnt1!=)
{
if(v==-)v=a[].pos;
else printf("1 %d %d\n",v,a[].pos),v=a[].pos;
for(int i=; i<=cnt1; i++)
{
printf("1 %d %d\n",v,a[i].pos);
v=a[i].pos;
}
}
if(cnt2!=)
{
if(v==-)v=b[].pos;
else printf("1 %d %d\n",v,b[].pos),v=b[].pos;
for(int i=; i<=cnt2; i++)
{
printf("1 %d %d\n",v,b[i].pos);
v=b[i].pos;
}
}
}
else
{
if(v==-)v=a[].pos;
else printf("1 %d %d\n",v,a[].pos),v=a[].pos;
if(cnt+!=n)printf("2 %d\n",v),v=-;
else return ;
if(cnt1>)
{
v=a[].pos;
for(int i=; i<=cnt1; i++)
{
printf("1 %d %d\n",v,a[i].pos);
v=a[i].pos;
}
}
if(cnt2>)
{
if(v==-)v=b[].pos;
else printf("1 %d %d\n",v,b[].pos),v=b[].pos;
for(int i=; i<=cnt2; i++)
{
printf("1 %d %d\n",v,b[i].pos);
v=b[i].pos;
}
}
}
}

Codeforces Round #510 #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 Round #504 D. Array Restoration

    Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...

  3. codeforces round#510

    蒟蒻和以前一样还是只能做 $4$ 题, 希望有一天可以 水到 $5$ 题!! 不过也终于上了蓝了...   A. Benches Description 给出$N$个座位, 每个座位上初始有$a_i$ ...

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

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

  5. Codeforces Round #510 (Div. 2) C. Array Product

    题目 题意: 给你n个数,有两种操作,操作1是把第i个位置的数删去, 操作2 是把 a[ j ]= a[ i ]* a[ j ],把a[ i ]删去 .n-1个操作以后,只剩1个数,要使这个数最大 . ...

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

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

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

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

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

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

  9. Educational Codeforces Round 21 D.Array Division(二分)

    D. Array Division time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

随机推荐

  1. 洛谷 P1712 [NOI2016]区间(线段树)

    传送门 考虑将所有的区间按长度排序 考虑怎么判断点被多少区间覆盖,这个可以离散化之后用一棵权值线段树来搞 然后维护两个指针$l,r$,当被覆盖次数最多的点的覆盖次数小于$m$时不断右移$r$,在覆盖次 ...

  2. [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP

    目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...

  3. Trie树(小)总结 By cellur925

    关于\(Trie\)树的详细介绍,还请移步这篇深度好文 基本操作 插入 void insert() { int p=0; int len=strlen(tmp+1); for(int i=1;i< ...

  4. ZOJ 4033 CONTINUE...?(The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple)

    #include <iostream> #include <algorithm> using namespace std; ; int a[maxn]; int main(){ ...

  5. Jmeter-提取Json数据进行关联

      1:Json后置处理器提取结果作为下一个sampler的传入参数 1.1:[线程组]->[简单控制器]->[HTTP sampler]->[Beanshell后置取样器]-> ...

  6. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  7. 【aspnetcore】在过滤器(Filter)中使用注入服务(ServiceFilter|TypeFilter)

    在MVC中,AOP是很常用的功能,我们经常会使用如 ActionFilter,IAuthorizeFilter 等描述对Controller和Action进行约束和扩展,一般做法如下: public ...

  8. 转 shell模拟数据库的读写

    0.create table create table myTestTable as select rownum as id,               to_char(sysdate + rown ...

  9. BundleConfig包含js,css失败

    今天在做mvc项目的时候,引入了bootstrap样式.但是包含css和js的时候出错了 于是我查阅资料,好多人都说后缀名前面不能包含".",于是我把min前面的".&q ...

  10. js实现接口的几种方式

    Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法 1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉 /* interface People{ ...