敌兵布阵 HDU - 1166 (单点更新+区间查询)
#include<bits/stdc++.h>
#define LL long long
#define Max 100005
#define Mod 1e9+7
const LL mod=1e9+7;
const LL inf=0x3f3f3f3f;
using namespace std;
int c[50005],n,x;
char a[6];
int lowbit(int x)
{
return x&(-x);
}
int getsum(int x)
{
int ans=0;
for(int i=x;i>0;i-=lowbit(i))
ans+=c[i];
return ans;
}
void add(int x,int val)
{
for(int i=x;i<=n;i+=lowbit(i)){
c[i]+=val;
}
}
int main()
{
int t;
scanf("%d",&t);
for(int k=1;k<=t;k++){
scanf("%d",&n);
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
scanf("%d",&x);
add(i,x);
}
printf("Case %d:\n",k);
int i,j;
while(scanf("%s",a)==1 && a[0]!='E'){
if(a[0]=='Q'){
scanf("%d%d",&i,&j);
printf("%d\n",getsum(j)-getsum(i-1));
}else if(a[0]=='A'){
scanf("%d%d",&i,&j);
add(i,j);
}else{
scanf("%d%d",&i,&j);
add(i,-j);
}
}
}
return 0;
}
Ultra-QuickSort POJ - 2299 (求逆序对)
//#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define LL long long
#define Max 100005
#define Mod 1e9+7
const LL mod=1e9+7;
const LL inf=0x3f3f3f3f;
using namespace std;
int n;
int b[500005],c[500005];
struct node
{
int val;
int pos;
bool operator < (const node a)const{
return a.val>val;
}
}a[500005];
int getsum(int x){
int sum=0;
while(x>0){
sum+=c[x];
x-=x&(-x);
}
return sum;
}
void add(int x,int val)
{
while(x<=n){
c[x]+=val;
x+=x&(-x);
}
}
int main()
{
while(scanf("%d",&n) && n!=0){
for(int i=1;i<=n;i++){
scanf("%d",&a[i].val);
a[i].pos=i;
}
memset(c,0,sizeof(c));
sort(a+1,a+n+1);
int cnt=1;
for(int i=1;i<=n;i++){
if(a[i].val != a[i-1].val && i!=1)
cnt++;
b[cnt]=a[i].pos;
}
LL sum=0;
for(int i=1;i<=n;i++){
add(b[i],1);
sum+=i-getsum(b[i]);
}
printf("%lld\n",sum);
}
return 0;
}
A Simple Problem with Integers POJ - 3468(区间更新+区间查询)
//#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define LL long long
#define Max 100005
#define Mod 1e9+7
const LL mod=1e9+7;
const LL inf=0x3f3f3f3f;
using namespace std;
LL sum1[Max],sum2[Max],data[Max];
int n,q;
void add(int x,LL val)
{
for(int i=x;i<=n;i+=i&(-i)){
sum1[i]+=val;
sum2[i]+=val*(x-1);
}
}
void range_add(int l,int r,LL val)
{
add(l,val);
add(r+1,-val);
}
LL ask(int x)
{
LL sum=0;
for(int i=x;i>=1;i-=i&(-i))
sum+=x*sum1[i]-sum2[i];
return sum;
}
LL range_ask(int l,int r)
{
return ask(r)-ask(l-1);
}
int main()
{
char A[5];
int x;
int a,b;
LL c;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld",&data[i]);
add(i,data[i]-data[i-1]);
}
while(q--){
scanf("%s",A);
if(A[0]=='C'){
scanf("%d%d%lld",&a,&b,&c);
range_add(a,b,c);
}
else{
scanf("%d%d",&a,&b);
printf("%lld\n",range_ask(a,b));
}
}
return 0;
}