【树状数组】HDU_3854_Glorious Array

原题直通车:HDU_3854_Glorious Array

题意: 有n个结点,权值为len[i],结点颜色分黑白两种(1/0),仅异色点可相连。

       对于点对a、b(异色)的边的权值=min(len[j], a<=j<=b); 

有m次操作: 输入0  x时表示更改第x个结点的颜色,输入1时表示询问:满足边权值小于k的点对的数量。

代码:

#include
#include
#include
using namespace std;
const int maxn=1000005;
int n, m, k, sum_1;
__int64 ans;
int col[maxn], len[maxn], num[maxn];
int pl[maxn], pr[maxn];  // pl[i]、pr[i]分别为第i个点的左右第一个满足len0) ret+=num[x], x-=x&(-x);
    return ret;
}
void add(int x, int d) {
    while(x<=n) num[x]+=d, x+=x&(-x);
}
void work() {
    for(int i=1; i<=n; ++i)
        if(len[i]=1; --i) {
            pr[i]=t;
            if(len[i]



你可能感兴趣的:(ACM_算法题解)