Codeforces Round #510 #C Array Product
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的更多相关文章
- Codeforces Round #510 (Div. 2)
Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...
- Codeforces Round #504 D. Array Restoration
Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...
- codeforces round#510
蒟蒻和以前一样还是只能做 $4$ 题, 希望有一天可以 水到 $5$ 题!! 不过也终于上了蓝了... A. Benches Description 给出$N$个座位, 每个座位上初始有$a_i$ ...
- 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) C. Array Product
题目 题意: 给你n个数,有两种操作,操作1是把第i个位置的数删去, 操作2 是把 a[ j ]= a[ i ]* a[ j ],把a[ i ]删去 .n-1个操作以后,只剩1个数,要使这个数最大 . ...
- 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 ...
- 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 ...
随机推荐
- 洛谷P3321 [SDOI2015]序列统计(NTT)
传送门 题意:$a_i\in S$,求$\prod_{i=1}^na_i\equiv x\pmod{m}$的方案数 这题目太珂怕了……数学渣渣有点害怕……kelin大佬TQL 设$f[i][j]$表示 ...
- elasticsearch 部署
环境 ubuntu 12.04 64位 桌面版 jdk 1.7 elasticsearch 2.3.4 伪集群部署 elasticsearch 主目录在 /home/sdbadmin/es-clute ...
- 50 个加速包都抢不到车票,还不如这个 Python 抢票神器!
又到了一年一度的抢票大战,本来就辛苦劳累了一年,想着可以早点订到票跟家里人团聚.所以有挺多的人,宁愿多花些钱去找黄牛买票.但今年各种抢票软件的横行,还有官方出的加速包,导致连黄牛都不敢保证能买到票.你 ...
- 买票案例 1.synchronize关键字 2.lock锁
- win10无法写入删改c盘文件的解决方法
前言 最近使用了win10系统,结果发现无法对c盘的文件进行写入删改,在网上到处搜集资料,终于找到了解决方法,这里总结一下. 首先,本文针对的是win10家庭版,家庭版默认是不提供组策略功能,而我们需 ...
- sublime text 插件的删除方法
1.ctr+shift+P,输入Package Control: Remove Package 2.回车, 3.出现一个弹出框,输入你要删除的package 4.回车,OK!!!
- GYM 101889I(mst+lca)
最小生成树上倍增询问裸的. const int maxn = 2e5 + 5; int n, m, q; //图 struct Edge { int u, v; ll cost; bool opera ...
- vue.js 中如何解除绑定事件
我们项目中有一个点赞需求,只允许点击一次赞,再次点击则取消赞, 为了防止用户多次连续点击,在点赞后需要解绑事件,成功调取API后,才可再次点击取消赞. 目前用的方法是加入一个flag控制点击事件可否点 ...
- webstock学习
1.WebSocket是HTML5中出出现的新技术,有着web TCP之称,这也是为了适应现在实时传输数据的趋势,在这之前一般采用两种方法进行实时数据交换. 轮询机制,其中又包括长轮询. ①短轮询是指 ...
- yii2 加载静态资源
1.在 assets/AppAsset 里定义方法 <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright ( ...