Codeforces Round #510 (Div. 2) C. Array Product
题意:
给你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的更多相关文章
- Codeforces Round #510 (Div. 2)
Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...
- 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) 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 ...
- Codeforces Round #181 (Div. 2) A. Array 构造
A. Array 题目连接: http://www.codeforces.com/contest/300/problem/A Description Vitaly has an array of n ...
- 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 ...
- 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 ...
- Codeforces Round #510 (Div. 2) B. Vitamins
B. Vitamins 题目链接:https://codeforces.com/contest/1042/problem/B 题意: 给出几种药,没种可能包含一种或多种(最多三种)维生素,现在问要吃到 ...
随机推荐
- 【JS】实用/常用函数/Function方法
1.获取日月 时分秒 //获取 月日 getMonth=(time)=>{ var date = new Date(time) <?):(date.getMonth()+) ?'+date ...
- Appium移动自动化测试-----(六)2.AppiumDesktop录制脚本生成极简脚本
AppiumDesktop启动页面: 启动AppiumDesktop以后点击该页面右上角的Start New Session按钮,就会启动一个新的会话窗口(如下图),在这个窗口我们需要配置一些Desi ...
- [CF1209F]Koala and Notebook_堆优化dij
Koala and Notebook 题目链接:https://codeforces.com/contest/1209/problem/F 数据范围:略. 题解: 开始的时候看错题了....莫名其妙多 ...
- PHP中文名加密
<?php function encryptName($name) { $encrypt_name = ''; //判断是否包含中文字符 if(preg_match("/[\x{4e0 ...
- [转帖]crontab每小时运行一次
crontab每小时运行一次 先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错误的!比如对于下面的这种写法: 00 * * * * #每隔一小时执行一 ...
- (三)spring Security 从数据库中检索用户名和密码
文章目录 配置 Druid 数据源 数据库 Mapper 文件 自定义 `UserDetailsService` 自定义登陆校验器 `AuthenticationProvider ` 配置 secur ...
- 处理ajax数据;数据渲染(细节)
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通 ...
- Django model反向关联名称的方法(转)
原文:https://www.jb51.net/article/152825.htm
- windows Git Bash 无法运行python文件的解决方法(转)
https://blog.csdn.net/xie_0723/article/details/51958243
- logback的使用和配置
参考:https://www.cnblogs.com/warking/p/5710303.html https://www.cnblogs.com 一.logback简介 1.logback: Log ...