Codeforces Round #510 (Div. 2) C. Array Product
Posted thunder-110
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 。
别的方法有,别人的博客里,不过这种分类讨论的方法坑实在是太多了!!
吐血。。哭了
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const ll mod=1e9+7; 20 const int INF= 0x3f3f3f3f; 21 const int N=2e5+5; 22 23 int n,p; 24 struct node 25 { 26 ll pos,num; 27 }a[N]; 28 29 bool cmp(node x,node y) 30 { 31 return x.num<y.num; 32 } 33 int main() 34 { 35 cin>>n; 36 int cnt=0; //负数的个数 37 int flag0=0; //是否有0 38 for(int i=1;i<=n;i++) 39 { 40 scanf("%lld",&a[i].num); 41 a[i].pos=i; 42 43 if(a[i].num<0) cnt++; 44 else if(a[i].num==0) flag0++; 45 } 46 sort(a+1,a+1+n,cmp); 47 48 if(cnt%2==1 && flag0) 49 { 50 int k,j,p; 51 for(int i=1;i<=n;i++) 52 { 53 if(a[i].num==0) 54 { 55 k=i-1; 56 for(j=k+1;j<=n;j++) 57 { 58 if(a[j].num==0) 59 { 60 printf("1 %lld %lld ",a[j-1].pos,a[j].pos); 61 } 62 else break; 63 } 64 break; 65 } 66 } 67 j--; 68 p=j; 69 if(k==1 && j==n) return 0; 70 printf("2 %lld ",a[p].pos); 71 72 for(int i=1;i<n;i++) 73 { 74 if(i+1==k) 75 { 76 if(j+1<=n) 77 printf("1 %lld %lld ",a[i].pos,a[j+1].pos),i=j; 78 else break; 79 } 80 else if(i==k) 81 { 82 if(j+2<=n) 83 printf("1 %lld %lld ",a[j+1].pos,a[j+2].pos),i=j+1; 84 else break; 85 } 86 else 87 printf("1 %lld %lld ",a[i].pos,a[i+1].pos); 88 } 89 } 90 91 else if(cnt%2==1 && !flag0) 92 { 93 int k,j,p; 94 for(int i=1;i<=n;i++) 95 { 96 if(a[i].num<0) 97 { 98 p=i; 99 } 100 } 101 //if(k==1 && j==n) return 0; 102 printf("2 %lld ",a[p].pos); 103 104 for(int i=1;i<n;i++) 105 { 106 if(i+1==p) 107 { 108 if(p+1<=n) 109 printf("1 %lld %lld ",a[i].pos,a[p+1].pos),i=p; 110 else break; 111 } 112 else if(i==p) 113 { 114 if(p+2<=n) 115 printf("1 %lld %lld ",a[p+1].pos,a[p+2].pos),i=p+1; 116 else break; 117 } 118 else 119 printf("1 %lld %lld ",a[i].pos,a[i+1].pos); 120 } 121 } 122 123 else if(cnt%2==0 && flag0) 124 { 125 int k,j,p; 126 for(int i=1;i<=n;i++) 127 { 128 if(a[i].num==0 && flag0>1) 129 { 130 k=i; 131 for(j=k+1;j<=n;j++) 132 { 133 if(a[j].num==0) 134 { 135 printf("1 %lld %lld ",a[j-1].pos,a[j].pos); 136 } 137 else break; 138 } 139 break; 140 } 141 else if(a[i].num==0 && flag0==1) 142 { 143 k=i; 144 j=k+1; 145 break; 146 } 147 } 148 j--; 149 p=j; 150 if(k==1 && j==n) return 0; 151 printf("2 %lld ",a[p].pos); 152 153 for(int i=1;i<n;i++) 154 { 155 if(i+1==k) 156 { 157 if(j+1<=n) 158 printf("1 %lld %lld ",a[i].pos,a[j+1].pos),i=j; 159 else break; 160 } 161 else if(i==k) 162 { 163 if(j+2<=n) 164 printf("1 %lld %lld ",a[j+1].pos,a[j+2].pos),i=j+1; 165 else break; 166 } 167 else 168 printf("1 %lld %lld ",a[i].pos,a[i+1].pos); 169 } 170 } 171 172 else if(cnt%2==0 && !flag0) 173 { 174 for(int i=1;i<n;i++) 175 { 176 printf("1 %lld %lld ",a[i].pos,a[i+1].pos); 177 } 178 } 179 180 }
以上是关于Codeforces Round #510 (Div. 2) C. Array Product的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #510 (Div. 2)(A)
Codeforces Round #510 Div. 2 Virtual Participate记
Codeforces Round #510 (Div. 2) C. Array Product
Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)