#7330. 徐老师的翻转卡牌plus

0

徐老师的翻转卡牌plus

徐老师的翻转卡牌plus

文件读写

  • 输入文件cardp.in
  • 输出文件cardp.out

限制

  • 1000ms
  • 512MB

题目描述

大家都做过一道题——翻转卡牌

一开始有 nn 张卡牌放在桌上,有的朝上有的朝下

现在允许你将其中的一张翻转,并将它和它左右两侧的牌一起翻转,问最小的翻转次数

徐老师已经 ACAC 了这道题,但是聪明的他立刻就想到了一个加强版翻转卡牌

如果现在翻转卡牌不仅仅只影响相邻的卡牌呢?如果翻转不同卡牌时的消耗不同呢?

于是徐老师设定了两个数值 aia_i 和 bib_i,表示翻转第 ii 张卡牌时,会同时翻转 i∼aii \sim a_i 编号的所有卡牌(保证 i≤aii \leq a_i),并且翻转这张卡牌会有 bib_i 点花费

现在徐老师想知道,最少需要多少点花费才可以让现在的 nn 张卡牌全部正面朝上?

P.S. 本题的输入输出使用 scanf,printfscanf,printf 会导致超时,请使用 cin,coutcin,cout,并取消同步流,格式如下:

int main(){
    freopen("cardp.in", "r", stdin);
    freopen("cardp.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    输入使用 cin
    cin >> T;

    ......
    输出使用 cout,换行使用 "\n"
    cout << ans << "\n";
}

输入格式

输入第一行包含一个整数 nn 表示卡牌数量

输入第二行包含一个长度为 nn 的 0101 串,其中 00 表示这张牌正面朝上,11 表示这张牌反面朝上

接下来 nn 行,每行两个整数 ai,bia_i,b_i 表示翻转第 ii 张牌的信息

输出格式

输出一个整数表示最小花费

数据范围

数据编号 nn
1∼21 \sim 2 n≤20n \leq 20
3∼43 \sim 4 n≤300n \leq 300
5∼65 \sim 6 n≤5000n \leq 5000
7∼87 \sim 8 n≤105n \leq 10^5
9∼109 \sim 10 n≤106n \leq 10^6

特别的,对于所有测试数据满足:i≤ai≤n,1≤bi,≤109i \leq a_i \leq n, 1 \leq b_i, \leq 10^9

样例输入1

9
110101011
4 1
3 2
8 3
5 4
8 5
6 6
9 7
8 8
9 9

样例输出1

23