CS 300 Switch the Lights 观察+前缀差分
来源:互联网 发布:送q币的软件 编辑:程序博客网 时间:2024/05/29 15:41
题意:n个灯泡,01表示是否点亮.n个开关,第i个开关反转[i,r[i]]个灯泡,花费c[i].
n<=1e5,c[i]<=1e9问将灯泡全部熄灭需要的最小花费?
每个开关最多使用一次.注意第i个开关 变化的左端点为i.假设序列最左边第一个为1的位置为x
此时开关j>x 无法熄灭x.开关j<x ? 若使用k<j<x的开关 则前面为0的变为1.会陷入死循环.
所以每次转动编号为:当前最左边第一个1位置的开关.
转动后如何找到下一个为1的位置?
n<=1e5,c[i]<=1e9问将灯泡全部熄灭需要的最小花费?
每个开关最多使用一次.注意第i个开关 变化的左端点为i.假设序列最左边第一个为1的位置为x
此时开关j>x 无法熄灭x.开关j<x ? 若使用k<j<x的开关 则前面为0的变为1.会陷入死循环.
所以每次转动编号为:当前最左边第一个1位置的开关.
转动后如何找到下一个为1的位置?
记录每个点的反转次数,前缀差分记录一下即可.
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+5;int n,r[N],c[N],a[N];int f[N];char s[N];int main(){ cin>>n; scanf("%s",s+1); for(int i=1;i<=n;i++) a[i]=s[i]-'0',scanf("%d",&r[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); ll ans=0; for(int i=1;i<=n;i++) { f[i]+=f[i-1]; int num=0; if(f[i]%2) num++; if(a[i]+num==1) { ans+=c[i]; f[i]++; f[r[i]+1]--; } } cout<<ans<<endl; return 0;}
阅读全文
0 0
- CS 300 Switch the Lights 观察+前缀差分
- 前缀和与差分
- 【胡诌】区间问题与差分前缀和
- hdu5419 Victor and Toys 期望,差分前缀和
- hdu 5419 线段树 or 差分前缀和
- hdu 5452 Minimum Cut(树链剖分+差分前缀和)
- 【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup
- CF295A Greg and Array(差分+前缀和)
- 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】
- BZOJ1303 [CQOI2009]中位数图 差分+前缀和
- 算法基础【3】差分与前缀和
- hdu 3404 Switch lights
- hdu3404 Switch lights
- zoj2770Burn the Linked Camp(差分约束)
- hdu3666 THE MATRIX PROBLEM --- 差分约束
- THE MATRIX PROBLEM(差分约束)
- zoj2770Burn the Linked Camp【差分约束】
- 数论+差分 hdu1121 Complete the Sequence
- TensorFlow官方文档中文版-笔记(三)
- 程序员之路:C++常量指针和指针常量
- 实现手机扫描二维码进行登录
- 提高篇第二十八讲项目1.2-M$pszi$y是嘛意思?
- 深入理解unity5.6版本ui布局功能
- CS 300 Switch the Lights 观察+前缀差分
- Vue-router小结
- android开发之Dagger2解耦见解
- 搜狐,搜狗,和怀了孩子的王小川
- luogu3940:分组(并查集)
- df命令、du命令和磁盘分区
- react 画廊 webpack1
- 不务正业系列:初识Quine之C++一种简单实现
- 栈和队列