代码模板(new)
Posted zb121
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码模板(new)相关的知识,希望对你有一定的参考价值。
1.树状数组:题目:UVA1428
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<string> 5 #include<cstring> 6 #include<numeric> 7 #include<vector> 8 #include<map> 9 #include<queue> 10 #include<set> 11 #include<cmath> 12 using namespace std; 13 typedef long long ll; 14 typedef pair<int,int>PII; 15 typedef pair<ll,ll>PLL; 16 17 //树状数组和线段树是一样的下标均是从1开始的。。。这个一定不能出错。。。 18 19 const int maxn=1e5+10; 20 21 int tree[maxn+10];//树状数组。。。 22 int l[maxn+10],r[maxn+10]; 23 24 int lowbit(int x){//求解一个数二进制最后一个1的位置。。。 25 return x&(-x); 26 } 27 //树状数组求和不同于线段树每一次直接拿出来,树状数组的求和有可能每一次要进行加减的操作。。。 28 29 int sum(int x){//注意x均是tree树状数组的下标。。。 30 int res=0; 31 while(x>0){//通过lowbit找只有最后一个1的数的值,我们只需要确定二进制存在1那么就继续遍历操作。。。 32 res+=tree[x]; 33 x-=lowbit(x);//eg:x=7那么之后加上6,之后加上4,之后x为0,跳出循环。。。结束操作。。。 34 } 35 return res;//直接求出和。。 36 } 37 38 void add(int x,int d){//这一步是增加操作。。。是从树根往上面进行操作。。。 39 while(x<maxn){ 40 tree[x]+=d;//将当前的结点加上去。。。是从下往上加的。。。 41 x+=lowbit(x);//x是树的下标。。。 42 } 43 } 44 45 //l[i],r[i]记录的都是比i位置数字要小的数字的个数。。。 46 47 int main(){ 48 int T; 49 cin>>T; 50 ll ans; 51 while(T--){ 52 int a[maxn]; 53 int n; 54 cin>>n; 55 for(int i=1;i<=n;i++){ 56 cin>>a[i]; 57 } 58 memset(tree,0,sizeof(tree)); 59 memset(l,0,sizeof(l)); 60 for(int i=1;i<=n;i++){ 61 l[i]=sum(a[i]); 62 add(a[i],1);//个数均加一 63 } 64 memset(tree,0,sizeof(tree)); 65 memset(r,0,sizeof(r)); 66 for(int i=n;i>=1;i--){ 67 r[i]=sum(a[i]); 68 add(a[i],1); 69 } 70 ans=0; 71 for(int i=2;i<n;i++){ 72 ans=ans+l[i]*(n-r[i]-i)+r[i]*(i-1-l[i]); 73 } 74 cout<<ans<<endl; 75 } 76 77 return 0; 78 }
以上是关于代码模板(new)的主要内容,如果未能解决你的问题,请参考以下文章