题目

题意:

  给你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. MSP430FR6972驱动模块模组调试

    1. 说是会进入晶振的中断 #pragma vector=UNMI_VECTOR 2. 打了断点没进入,猜测是串口被世龙修改后,串口波特率不对,重新改回原来的,AT+NATSPEED?一直发送这个命令 ...

  2. C/C++文件操作经验总结

    最近在做一个从groundtruth_rect.txt中读取按行存储的矩形元素(x, y, w, h),文本存储的格式如下: 310,102,39,50 308,100,39,50 306,99,39 ...

  3. htm5手机端实现拖动图片

    htm5手机端实现拖动图片 <pre> <!doctype html><html><head> <title>Mobile Cookbook ...

  4. 035 Android 广播(BroadCastReceiver)

    1.介绍 2.实现方法 3.注册广播 (1)静态广播 在AndroidManifest.xml文件中注册广播 <intent-filter>为过滤器 <receiver androi ...

  5. Linux01学习第一天 man

    Linux标准的读音:哩呐科斯 Linux是一种类UNIX的系统,具有以下特点: 1.免费开源 2.模块化程度高 3.广泛的硬件支持 4.安全稳定 5.多用户,多任务(所以常应用于系统运维,以及合作开 ...

  6. php数组指针函数

    数组指针函数有reset(),prev(),current(),next(),end(),key(),each() 其中reset(),prev(),current(),next(),end(),都是 ...

  7. Python进阶:对象复制与比较,分深浅,见真假

    "==" 与 is python 为 10 开辟内存空间, a与b同时指向这块内存,即a与b的值相等,a与b的id也相等.因此 a==b 与 a is b 都返回True: a = ...

  8. matplotlib笔记3

    关于matplotlib的绘制图形的基本代码,我们可以参照下面的连接 https://matplotlib.org/gallery/index.html https://matplotlib.org/ ...

  9. Cortex_m7内核cache深入了解和应用

    一,cache概述 从下图可以看出,从M7内核才开始有的cache,这对于从M0,M3,M4一路走来的小伙伴来说,多了一个cache就多了一个障碍. Cortex-M7 core with 32K/3 ...

  10. 利用strace & Perf分析MySQL

    strace介绍及用途 strace是一个用于诊断,分析linux用户态进程的工具 类似的工具pstrace,lsof,gdb,pstrack strace观察mysqld对my.cnf 配置文件的加 ...