[arc072f]Dam

题目大意

有个水库,最多能存L单位水,一开始是空的,对于n天,每天早上有v[i]单位的,水温为t[i]的水流进来。每天晚上你可以放掉一些水,多少自定。但是必须保证第二天水库不会溢出。现在问,对于每个i,在使用最优放水策略的情况下,第i天水库是满的情况下最高水温(i之间互相独立)。混合后的温度计算就和混合溶液浓度一样计算。
n<=1e5,其他数1e9范围内

解题思路

似乎有点无从下手。
对于某个i,它的前几天肯定是都要影响到他的。如果每天进水的温度逐渐增加,肯定是取最后几天的水,前面的水全部放空。
我们脑洞一下,先顺着进水。我们先不混合,搞个温度单调递增的队列维护每天的水。考虑加入第i天的水。如果水体积爆了L,肯定要踢掉前面的,因为当前的最后一天的水是不能排掉的。也是因为这样,如果这天水温度不够队列末尾高,我们就把它末尾混在一起。发现这样并没有什么问题….

代码

#include<cstdio> 
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
typedef double db;
#define fo(i,j,k) for(i=j;i<=k;i++)
#define fd(i,j,k) for(i=j;i>=k;i--)
#define cmax(a,b) (a=(a>b)?a:b)
#define cmin(a,b) (a=(a<b)?a:b)
const int N=1e6+5,mo=998244353;
struct rec
{
    ll v;
    db t;
}s[N];
ll sum,t[N],v[N],l,r,n,L,prod,i,dec;
int main()
{
    freopen("t17.in","r",stdin);
    scanf("%lld %lld",&n,&L);
    l=1;
    r=0;
    fo(i,1,n)
    {
        scanf("%lld %lld",t+i,v+i);
        while (sum+v[i]>L)
        {
            dec=min(s[l].v,sum+v[i]-L);
            s[l].v-=dec;
            sum-=dec;
            prod-=dec*s[l].t;
            if (!s[l].v) l++;
        }
        s[++r]={v[i],t[i]};
        prod+=v[i]*t[i];
        sum+=v[i];
        while (l<r&&s[r].t<s[r-1].t)
        {
            s[r-1].t=(s[r-1].t*s[r-1].v+s[r].t*s[r].v)/(s[r-1].v+s[r].v);
            s[r-1].v+=s[r].v;
            r--;
        }
        printf("%lf\n",(db)prod/L);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
arcgis10.x全系列授权文件 START_LICENSE SERVER this_host ANY 27000 VENDOR ARCGIS FEATURE 3DEngine ARCGIS 10.0 01-jan-2019 2048 ED5E3071F571CE99F477 \ vendor_info=Y85SXRJE2896M63XT026 ck=88 FEATURE Aeronautical ARCGIS 10.0 01-jan-2019 2048 0D2EF071B2D22580CF99 \ vendor_info=75YFFAYHYEFH1F7YT035 ck=62 FEATURE AGSData ARCGIS 10.0 01-jan-2019 2048 BD9EA061966B7AF6A41E \ vendor_info=PZ2EZBYRLN7R7DL1L248 ck=46 FEATURE AllEurope ARCGIS 10.0 01-jan-2019 2048 CDEEC0517B3DC6652E40 \ vendor_info=H2L0ASG52XN6JEC9X181 ck=80 FEATURE ARC/INFO ARCGIS 10.0 01-jan-2019 2048 CDAE10B116760E4FDB41 \ vendor_info=H20N2LR9LATPX7NJJ055 ck=119 FEATURE ArcEditor ARCGIS 10.0 01-jan-2019 2048 BD5EE08100A9EA46B109 \ vendor_info=PZH0GA001H5HDJ5ZE226 ck=57 FEATURE ArcExpress ARCGIS 10.0 01-jan-2019 2048 5D5E4081865F8192F0E9 \ vendor_info=DRN8FA3ZYAF68ERSB214 ck=2 FEATURE ArcInfo ARCGIS 10.0 01-jan-2019 2048 BD2EA0D19E935C23DE27 \ vendor_info=PZR800Y0Z1HFJ3AZZ024 ck=91 FEATURE ArcMapServer ARCGIS 10.0 01-jan-2019 2048 9D3EB0B1C69DD803D8C0 \ vendor_info=J2HF8E3LTF5ZAM35T082 ck=78 FEATURE ArcPress ARCGIS 10.0 01-jan-2019 2048 3DDE30E1FB62E55D2D8D \ vendor_info=BL4EEHTGZJKZX985F085 ck=3 FEATURE ArcReader ARCGIS 10.0 01-jan-2019 2048 BDEEB071C3CB97C1A8B9 \ vendor_info=PZLX5LC5LG5LCLA4D208 ck=98 FEATURE ArcScan ARCGIS 10.0 01-jan-2019 2048 AD4EC071ABAC5CF6CE46 \ vendor_info=TXRC7EK0GPGN48J1N165 ck=116 FEATURE ArcSdeConnects ARCGIS 10.0 01-jan-2019 2048 7DAE60511CC985CC9649 \ vendor_info=GXBH4HFAGXTLK760F004 ck=74 FEATURE ArcSdeServer ARCGIS 10.0 01-jan-2019 2048 5D7E006130B2196A80C8 \ vendor_info=DRJFF3SK9EKJHJEEH040 ck=239 FEATURE ArcSdl ARCGIS 10.0 01-jan-2019 2048 9D9EE0F156E3EDB5E760 \ vendor_info=J25Y9TAELTPH6R5BE074 ck=63 FEATURE ArcServer ARCGIS 10.0 01-jan-2019 2048 ED1EB011A27CA9BF91D9 \ vendor_info=Y8ZF8EAHC6C5EFYR1040 ck=87 FEATURE ArcStorm ARCGIS 10.0 01-jan-2019 2048 ED8E60C130D5115E5563 \ vendor_info=Y8A1NEM6L3ZNPZE4D015 ck=237 FEATURE ArcStormEnable ARCGIS 10.0 01-jan-2019 2048 3D2E700170A99E985744 \ vendor_info=BLCF73HYPC5TED1HZ191 ck=233
ARC069 F 题目传送门:https://atcoder.jp/contests/arc069/tasks/arc069_d 题目描述: 给定两个长度为 $n$ 的字符串 $s$ 和 $t$,每个字符都是小写字母。你需要找到一个长度为 $n$ 的字符串 $u$,满足: - 对于所有 $i \in [1,n]$,都有 $u_i \in \{s_i,t_i\}$。 - 对于所有 $i \in [1,n-1]$,都有 $u_i \neq u_{i+1}$。 - 对于所有 $i \in [1,n-2]$,都有 $u_i \neq u_{i+2}$。 求满足条件的字符串 $u$ 的个数,对 $10^9+7$ 取模。 解题思路: 这是一道比较经典的字符串构造问题,可以用 dp 或者数学方法来解决。 方法一:dp 我们可以使用 dp 来解决这个问题。设 $f_{i,j,k}$ 表示构造了前 $i$ 个字符,第 $i$ 个字符为 $j$,且第 $i-1$ 个字符为 $k$ 的方案数。其中,$j \in \{s_i,t_i\}$,$k \in \{s_{i-1},t_{i-1}\}$。 状态转移方程如下: $$f_{i,j,k} = \sum\limits_{l \in \{s_{i-2},t_{i-2}\},l \neq j} f_{i-1,k,l}$$ 最终的答案为 $\sum\limits_{j \in \{s_n,t_n\}} \sum\limits_{k \in \{s_{n-1},t_{n-1}\}} f_{n,j,k}$。 时间复杂度为 $O(n)$。 方法二:数学 我们可以定义 $a_i$ 表示以 $s_i$ 结尾,且不存在相邻字符相等的字符串的方案数;$b_i$ 表示以 $s_i$ 结尾,且存在相邻字符相等的字符串的方案数;$c_i$ 表示以 $t_i$ 结尾,且不存在相邻字符相等的字符串的方案数;$d_i$ 表示以 $t_i$ 结尾,且存在相邻字符相等的字符串的方案数。 根据题目的限制条件,我们可以得到递推式: $$\begin{cases} a_{i+1} = 2(b_i+c_i+d_i) \\ b_{i+1} = a_i \\ c_{i+1} = 2(a_i+d_i) \\ d_{i+1} = b_i \end{cases}$$ 初始状态为 $a_1=1,b_1=0,c_1=1,d_1=1$。 最终的答案为 $a_n+c_n$。 时间复杂度为 $O(n)$。 代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值