题目链接:牛牛的Link Power II

题意:给你一个只含$0$和$1$的串,定义串的$Link$值为串中两个的$1$之间的距离的和,$(u,v)$和$(v,u)$被看认为是同一对,有$m$次操作,每次操作可以把串中某个$1$变为$0$,或者把某个$0$变为$1$,求一开始和每次操作后串的$Link$值。

思路:线段树,维护区间内$1$的数量$cnt、$区间的$Link$值$w、$区间内所有的$1$到区间左边界的距离之和$dl、$区间内所有的$1$到区间右边界的距离之和$dr$,查询时只要输出$tree[1].w$即可,修改时只用改变区间内$1$的$cnt$,然后进行区间合并,区间合并的公式画个图推导一下即可。

#include <iostream>
#include <algorithm>
#include <cstdio> using namespace std; typedef long long ll; const int N = ;
const ll mod = ; struct node {
int l, r;
ll dl, dr, w, cnt;
}; node tree[ * N];
char s[N];
int n, q; void update(int k)
{
tree[k].cnt = tree[ * k].cnt + tree[ * k + ].cnt;
ll t = tree[ * k].cnt * tree[ * k + ].dl + tree[ * k + ].cnt * tree[ * k].dr;
tree[k].w = tree[ * k].w + tree[ * k + ].w + t + tree[ * k].cnt * tree[ * k + ].cnt;
tree[k].dl = tree[ * k].dl + tree[ * k + ].dl + tree[ * k + ].cnt * (tree[ * k].r - tree[ * k].l + );
tree[k].dr = tree[ * k].dr + tree[ * k + ].dr + tree[ * k].cnt * (tree[ * k + ].r - tree[ * k + ].l + );
} void build(int k, int lef, int rig)
{
tree[k].l = lef, tree[k].r = rig;
if (tree[k].l == tree[k].r) {
tree[k].w = tree[k].dl = tree[k].dr = ;
if ('' == s[tree[k].l]) tree[k].cnt = ;
else tree[k].cnt = ;
return;
}
int mid = (lef + rig) / ;
build(k * , lef, mid);
build(k * + , mid + , rig);
update(k);
} void change_point(int k, int x, int y)
{
if (tree[k].l == tree[k].r) {
tree[k].cnt = y;
return;
}
int mid = (tree[k].l + tree[k].r) / ;
if (x <= mid) change_point( * k, x, y);
else change_point( * k + , x, y);
update(k);
} int main()
{
scanf("%d%s", &n, s + );
build(, , n);
printf("%lld\n", tree[].w % mod);
scanf("%d", &q);
while (q--) {
int kd, pos;
scanf("%d%d", &kd, &pos);
change_point(, pos, == kd ? : );
printf("%lld\n", tree[].w % mod);
}
return ;
}

最新文章

  1. 讓TQ2440也用上設備樹(1)
  2. Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元
  3. php.ini中有关安全的设置
  4. codeforces B. Dima and Text Messages 解题报告
  5. (七)STM32的RTC简单操作
  6. 1.2 认识ASP.NET MVC项目结构
  7. js中的潜伏者之Arguments对象
  8. 王学长的LCT标程
  9. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记
  10. CentOS6.5下使用NetHogs监控进程网络使用情况
  11. 输出无名空数组---精android、IOS App应用服务程序开发
  12. Hadoop1.0.3环境搭建流程
  13. React+webpack开发环境的搭建
  14. node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能
  15. ubuntu使用rdesktop连接win10的两个问题
  16. 在mysql数据库中创建Oracle数据库中的scott用户表
  17. Matplotlib 知识点整理
  18. sql server 用户创建与权限管理
  19. bbs项目中对反向查询和分组查询的具体的应用
  20. GameObject.SendMessage

热门文章

  1. Linux 基本命令简单学习
  2. POJ 3264 Balanced Lineup(ST模板)
  3. eclipse debug启动时tomcat报错
  4. yii2 场景使用
  5. bugku 有一张图,还单纯吗
  6. 命令行(二):Anaconda3
  7. java i++与++i的区别
  8. Pacemaker+ISCSI实现Apache高可用-环境准备
  9. 通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。
  10. fileupload插件调用upload.parseRequest(request)解析得到空值问题