1101
#include <cstdio>
#include <algorithm>
#define MAX 100005
#define INF 0x3f3f3f3f
using namespace std;
int a[MAX], leftMax[MAX], rightMin[MAX], result[MAX];
int main(){
int n;
scanf("%d", &n);
for (int i=0; i<n; i++) {
scanf("%d", &a[i]);
}
leftMax[0] = 0;
for (int i=1; i<n; i++) {
leftMax[i] = max(leftMax[i-1], a[i-1]);
}
rightMin[n-1] = INF;
for (int i=n-2; i>=0; i--) {
rightMin[i] = min(rightMin[i+1], a[i+1]);
}
int count = 0;
for (int i=0; i<n; i++) {
if (leftMax[i]<=a[i] && rightMin[i]>=a[i]) {
result[count++] = a[i];
}
}
printf("%d\n", count);
sort(result, result+count);
if (count == 0) {
printf("\n");
}
for (int i=0; i<count; i++) {
if (i == 0) {
printf("%d", result[0]);
}else{
printf(" %d", result[i]);
}
}
return 0;
}
1093
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX 100005
char str[MAX];
int leftCountP[MAX];
int main(int argc, const char * argv[]) {
scanf("%s", str);
int len = (int)strlen(str);
for (int i=0; i<len; i++) {
if (i!=0) {
leftCountP[i] = leftCountP[i-1];
}
if (str[i]=='P') {
leftCountP[i]++;
}
}
int rightCountT = 0;
int ans = 0;
for (int i=len-1; i>=0; i--) {
if (str[i]=='T') {
rightCountT++;
}else if (str[i]=='A'){
ans = (ans + leftCountP[i] * rightCountT) % 1000000007;
}
}
printf("%d", ans);
return 0;
}
1093方法二
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
string str;
cin>>str;
int countP = 0;
int countT = (int)count(str.begin(), str.end(), 'T');
int count = 0;
for (string::iterator it=str.begin(); it!=str.end(); it++) {
if (*it == 'P') {
countP++;
}else if (*it == 'T'){
countT--;
}else{
count = (count + countP * countT) % 1000000007;//每一次加的时候都要取模,也就是模1000000007加。如果只是在最后输出之前取模,那么最后两个测试点会答案错误。
}
}
cout<<count;
return 0;
}