2020牛客寒假算法基础集训营3 - G. 牛牛的Link Power II(线段树)
2024-08-30 04:24:24
题目链接:牛牛的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 ;
}
最新文章
- 讓TQ2440也用上設備樹(1)
- Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元
- php.ini中有关安全的设置
- codeforces B. Dima and Text Messages 解题报告
- (七)STM32的RTC简单操作
- 1.2 认识ASP.NET MVC项目结构
- js中的潜伏者之Arguments对象
- 王学长的LCT标程
- [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记
- CentOS6.5下使用NetHogs监控进程网络使用情况
- 输出无名空数组---精android、IOS App应用服务程序开发
- Hadoop1.0.3环境搭建流程
- React+webpack开发环境的搭建
- node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能
- ubuntu使用rdesktop连接win10的两个问题
- 在mysql数据库中创建Oracle数据库中的scott用户表
- Matplotlib 知识点整理
- sql server 用户创建与权限管理
- bbs项目中对反向查询和分组查询的具体的应用
- GameObject.SendMessage
热门文章
- Linux 基本命令简单学习
- POJ 3264 Balanced Lineup(ST模板)
- eclipse debug启动时tomcat报错
- yii2 场景使用
- bugku 有一张图,还单纯吗
- 命令行(二):Anaconda3
- java i++与++i的区别
- Pacemaker+ISCSI实现Apache高可用-环境准备
- 通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。
- fileupload插件调用upload.parseRequest(request)解析得到空值问题