HDU_3854_Glorious Array

2014-11-24 02:00:37 · 作者: · 浏览: 1
原题直通车: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]