# 树状数组（一维）

143人阅读 评论(0)

void add(int k,int num)  //num就代表点k加上num值
{
while(k<=n)  //n就是数组a长度
{
tree[k]+=num;  //tree数组就相当于c数组
k+=k&-k;
}
}  

int read(int k)//1~k的区间和
{
int sum=0;
while(k)
{
sum+=tree[k];
k-=k&-k;
}
return sum;
}  

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cstring>

using namespace std;
int c[32000+10],ans[32000+10];
void read(int x,int num)
{
while(x<=32001)
{
c[x]+=num;
x+=x&-x;
}
}
int sum(int x)//前x坐标的星星数量
{
int ans=0;
while(x)
{
ans+=c[x];
x-=x&-x;
}
return ans;
}
int main()
{
int n;
//cin>>n;
scanf("%d",&n);
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
int x,y;
//cin>>x>>y;
scanf("%d%d",&x,&y);
++ans[sum(x+1)];
}
for(int i=0;i<n;i++)
//cout<<ans[i]<<endl;
printf("%d\n",ans[i]);
return 0;
}

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cstring>

using namespace std;
int c[200000+10],pos[200000+10];
void read(int x,int num)
{
while(x<200000+1)
{
c[x]+=num;
x+=x&-x;
}
}
int sum(int x)
{
int ans=0;
while(x)
{
ans+=c[x];
x-=x&-x;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int det=100000;
memset(c,0,sizeof(c));
memset(pos,0,sizeof(pos));
for(int i=1; i<=n; i++)
{
pos[i]=det+i;
}
for(int i=1; i<=m; i++)
{
int x;
//cin>>x;
scanf("%d",&x);
if(i!=1)
printf(" ");
printf("%d",sum(pos[x]-1));
pos[x]=det;
det--;
//cout<<endl;
//cout<<"c[pos[x]]="<<c[pos[x]]<<endl;
//cout<<"sum(1)="<<sum(1)<<endl;
}
printf("\n");
}
return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#define ri(n) scanf("%d",&n)
#define oi(n) printf("%d\n",n)
#define rl(n) scanf("%lld",&n)
#define ol(n) printf("%lld\n",n)
#define rep(i,l,r) for(i=l;i<=r;i++)
#define rep1(i,l,r) for(i=l;i<r;i++)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int epg=10-8;
int a[10000+10];
int c[10000+10];
{
while(x<10000+10)
{
c[x]++;
x+=x&-x;
}
}
int sum(int x)
{
int ans=0;
while(x)
{
ans+=c[x];
x-=x&-x;
}
return ans;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int ans=0,max_=0,flag=1;
for(int i=1;i<=k;i++)
{
memset(c,0,sizeof(c));
ans=0;
for(int j=1;j<=n;j++)
{
scanf("%d",&a[j]);
ans+=j-sum(a[j]);
}
if(ans>max_)
{
max_=ans;
flag=i;
}
}
printf("%d\n",flag);
return 0;
}

1
1

个人资料
• 访问：13891次
• 积分：884
• 等级：
• 排名：千里之外
• 原创：76篇
• 转载：2篇
• 译文：0篇
• 评论：3条
阅读排行