目录
1.Count PAT's
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
char str[100005];
scanf("%s",str);
int len=strlen(str);
int leftnum[100005]={0};
for(int i=0;i<len;i++){
if(i>0) leftnum[i]=leftnum[i-1];
if(str[i]=='P') leftnum[i]++;
}
int ans=0,rightnum=0;
for(int i=len-1;i>=0;i--){
if(str[i]=='T') rightnum++;
else if(str[i]=='A') ans=(ans+leftnum[i]*rightnum)%1000000007;
}
printf("%d",ans);
return 0;
}
2.随机选择
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=1000010;
int martix[maxn],n;
int randpartition(int martix[],int left,int right){
int temp=martix[left];
while(left<right){
while(left<right&&martix[right]>temp) right--;
martix[left]=martix[right];
while(left<right&&martix[left]<=temp) left++;
martix[right]=martix[left];
}
martix[left]=temp;
return left;
}
void randselect(int martix[],int left,int right,int k){
if(left==right) return;
int p=randpartition(martix,left,right);
int m=p-left+1;
if(k==m) return;
if(k<m) randselect(martix,left,p-1,k);
else randselect(martix,p+1,right,k-m);
}
int main(){
srand((unsigned)time(NULL));
int sum_all=0,suml=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&martix[i]);
sum_all+=martix[i];
}
randselect(martix,0,n-1,n/2);
for(int i=0;i<n/2;i++){
suml+=martix[i];
}
printf("%d\n",sumall-2*suml);
return 0;
}
3.Quick Sort
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
const int inf=0x3fffffff;
int main(){
int n,martix[100005];
int leftmax[100005],rightmin[100005];
int ans[100005],num=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&martix[i]);
}
leftmax[0]=0;
for(int i=1;i<n;i++){
leftmax[i]=max(leftmax[i-1],martix[i-1]);
}
rightmin[n-1]=inf;
for(int i=n-2;i>=0;i--){
rightmin[i]=min(rightmin[i+1],martix[i+1]);
}
for(int i=0;i<n;i++){
if(martix[i]>leftmax[i]&&martix[i]<rightmin[i]){
ans[num++]=martix[i];
}
}
printf("%d\n",num);
for(int i=0;i<num;i++){
printf("%d",ans[i]);
if(i!=num-1) printf(" ");
}
printf("\n");
return 0;
}