题意: 有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个点的左右第一个满足len 0) 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]