括号匹配
#include<bits/stdc++.h>
using namespace std;
char st[1100];
string s;
int top;
int main(){cin>>s;int len=s.size();for(int i=0;i<len;i++){if(s[i]=='['||s[i]=='('){st[++top]=s[i]; }else{if(top==0){cout<<"Wrong";return 0;}if(s[i]==']'){if(st[top]=='['){top--;}} if(s[i]==')'){if(st[top]=='('){top--;}}}}if(top==0){cout<<"OK";}else{cout<<"Wrong";}return 0;
}
操作系统
#include<bits/stdc++.h>
using namespace std;
struct node{int num,gtim,timed,you;friend bool operator<(node a,node b){//重载运算符< (priority是反着的(即符合要求的往后放))if(a.you!=b.you){return a.you<b.you;}else{return a.gtim>b.gtim;}}
};
long long ans;
int n,g,t,y,now;
priority_queue<node>q;
int main(){//小顶堆内放的是可以进行买入的操作的金额while(cin>>n>>g>>t>>y){//还有新任务到达while(!q.empty()&&now+q.top().timed<=g){now+=q.top().timed;//省略了完成任务的时间cout<<q.top().num<<" "<<now<<"\n";q.pop();}if(!q.empty()){//时间不够node x=q.top();//返回值不是引用,只能先取队头,改完再放进去(维护队列有序)q.pop();x.timed-=g-now;//先处理一部分,时间消耗为下一个任务到达时间-当前时间,所需时间减少q.push(x);}now=g;//看作瞬间把这部分任务处理完,所花费的时间立刻减去(即新任务立刻到达)q.push({n,g,t,y});//放进去后再进入下个循环}while(!q.empty()){//没有新任务到达now+=q.top().timed;cout<<q.top().num<<" "<<now<<"\n";q.pop();}return 0;
}
序列
#include<bits/stdc++.h>
using namespace std;
int gcnt[51000],fcnt[51000],a[51000],f[51000],g[51000],sum[51000];
long long ans;
int n;
int t;
int lowbit(int t){//树状数组return t&-t;
}
void updata(int cnt[],int x,int y){for(int i=x;i<=n;i+=lowbit(i)){cnt[i]+=y;}
}
int getsum(int cnt[],int x){int ff=0;for(int i=x;i>=1;i-=lowbit(i)){ff+=cnt[i];}return (long long)ff;
}
int main(){scanf("%d",&t);while(t--){memset(gcnt,0,sizeof gcnt);memset(fcnt,0,sizeof fcnt);ans=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){f[i]=getsum(fcnt,a[i]);updata(fcnt,a[i],1);}for(int i=1;i<=n;i++){sum[i]=sum[i-1]+f[i];//前缀和}for(int i=n;i>=1;i--){g[i]=getsum(gcnt,n)-getsum(gcnt,a[i]);// cout<<getsum(a[i])<<"\n";updata(gcnt,a[i],1);}// for(int i=1;i<=n;i++){// cout<<f[i]<<" "<<g[i]<<"\n";//}for(int i=1;i<=n;i++){ans+=(long long)g[i]*sum[i-1];//防止溢出}printf("%lld\n",ans);}return 0;
}