bzoj1106: [POI2007]立方體大作戰tet(樹狀陣列)

Hanks_o發表於2018-03-20

題目傳送門

解法:
經典貪心策略啊。
如果兩個點的位置之間有別的點對。
那麼我們應該先消除別的點對。正確性顯然嘛。

程式碼實現:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int w[110000],s[110000],n;
int lowbit(int x) {return x&-x;}
int get_sum(int x) {int ans=0;while(x>0) {ans+=s[x];x-=lowbit(x);}return ans;}
void change(int x,int d) {while(x<=2*n) {s[x]+=d;x+=lowbit(x);}}
int main() {
    scanf("%d",&n);memset(w,0,sizeof(w));int ans=0;
    for(int i=1;i<=2*n;i++) {
        int x;scanf("%d",&x);
        if(w[x]==0) {change(i,1);w[x]=i;}
        else {ans+=get_sum(i)-get_sum(w[x]-1)-1;change(w[x],-1);}
    }printf("%d\n",ans);
    return 0;
}

相關文章