首页 > 其他分享 >[Codeforces] CF1547E Air Conditioners

[Codeforces] CF1547E Air Conditioners

时间:2023-12-30 20:25:17浏览次数:32  
标签:cnt int Conditioners Codeforces 空调 fr CF1547E Maxn bk

CF1547E Air Conditioners

题目传送门

这道题我的思路严重劣于题解思路,所以请慎用

但是自认为我的贪心比dp好理解点

题意

有 \(q\) 组数据,每组第一排表示有 \(n\) 个方格和 \(k\) 个空调,第二排是每个空调的位置 \(a_i\) ,第三排是每个空调的温度 \(t_i\) 。

每个空调对周围的影响是递减的,所以一个空调周围的温度是公差为 \(1\) 的递增等差数列。如果一个方格同时被多个空调影响,那么取最小值。空调所在的方格温度就是空调的温度。

输出所有方格的温度。

思路

假如现在有\(j_1=i-1\)并且已知位置\(j\)的最低温为\(k\),那么:

  • 如果\(i\)的位置上有空调,那么他的最低温就是\(min(f_i,k)\)

  • 否则,就是\(k±1\)

但很明显不止于此,\(j_2=i+1\)也是一种情况:(\(k\)的意义同上)

  • 如果\(i\)的位置上有空调,那么他的最低温就是\(min(f_i,k)\)

  • 否则,就是\(k±1\)

(其中\(f_i\)表示第个位置的空调的最低温,而\(±\)的确切数值应该看影响当前位置的空调的位置)

所以,从前往后可从后往前分别处理一次并存下来,最后输出最大值即可。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int Maxn=3e5+10;
ll f[Maxn],a[Maxn];
ll n,k,cnt,t;
ll fr[Maxn],bk[Maxn];
void run()
{
    cin>>n>>k;fr[1]=bk[n]=1e10;cnt=0;
    memset(f,-1,sizeof(f));
    for(int i=1;i<=k;i++) cin>>a[i];
    for(int i=1;i<=k;i++) cin>>f[a[i]];

    for(int i=1;i<=k;i++)
    {
        if(f[a[i]]+(a[i]-1)<=fr[1])
        {
            fr[1]=f[a[i]]+(a[i]-1);
            cnt=a[i];
        }
    }
    for(int i=2;i<=n;i++)
    {
        if(i>cnt) t=1;
        else if(i<cnt) t=-1;
        else t=0;
        if(f[i]!=-1 && fr[i-1]+t>f[i]) fr[i]=f[i],cnt=i;
        else fr[i]=fr[i-1]+t;
    }
    for(int i=1;i<=k;i++)
    {
        if(f[a[i]]+(n-a[i])<=bk[n])
        {
            bk[n]=f[a[i]]+(n-a[i]);
            cnt=a[i];
        }
    }
    for(int i=n-1;i>=1;i--)
    {
        if(i>cnt) t=1;
        else if(i<cnt) t=-1;
        else t=0;
        if(f[i]!=-1 && bk[i+1]-t>f[i]) bk[i]=f[i],cnt=i;
        else bk[i]=bk[i+1]-t;
    }
    for(int i=1;i<=n;i++) cout<<min(fr[i],bk[i])<<" ";
    cout<<endl;
    // for(int i=1;i<=n;i++) cout<<fr[i]<<" ";
    // cout<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--) run();
    system("echo. & pause");
    return 0;
}

标签:cnt,int,Conditioners,Codeforces,空调,fr,CF1547E,Maxn,bk
From: https://www.cnblogs.com/lyk2010/p/17936744

相关文章

  • codeforces刷题(1100):1862C_div3
    C、FlowerCityFence跳转原题点击此:该题地址1、题目大意  给你n块长度依次不递增的紧密连接在一起的垂直木板,将它们水平横过来,问其组成的全新n块木板的长度是否与原来的木板长度一致。  注意:这里的长度是指:木板的高度。水平摆放后的木板是左对齐,所以其长度就是各个木板水......
  • codeforces刷题(1100):1863B_div1+div2
    B、SplitSort跳转原题点击此:该题地址1、题目大意  给定一个长度为n的排列(该排列的数字是包含\(1\simn\),每个数必须出现一次)。你可以执行以下操作:  选中一个数x,比x小的数按照原来的顺序放在x的左边,大于等于x的数按照原来的顺序放在x的右边。问你将原始排列组成\(a_i==......
  • codeforces刷题(1100):1863C_div1+div2
    C、MEXRepetition跳转原题点击此:该题地址1、题目大意  给定一个数组,要求每次依次从左到右将\(a_i\)替换为当前数组的最小非负整数(每次替换一个数后,最小非负整数也会发生改变)。问你,经过k次的操作后,最终数组是什么。  注意:该数组的数和最小非负整数,是从\(0,1,\cdots,n\)......
  • Codeforces Round 918 (Div
    CodeforcesRound918(Div.4)这是本人打的第一把div4,比赛中AC到了E,算是打cf以来这一个多月的最成绩了,但是div4似乎只有EFG较难,ABC签到题,D是div3签到题。A.OddOneOut判断就行#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while......
  • codeforces刷题(1100):1864B_div1+div2
    B、SwapandReverse跳转原题点击此:该题地址1、题目大意  给你一个字符串和k,你可以对该字符串做一下两个操作:交换\(a_i\)和\(a_{i+2}\)的字符;对\([i,i+k-1]\)这个区间的字符就行反转;问你通过这两个操作后,原字符串所能生成新的字典序最小的字符串是什么。2、题目解......
  • Codeforces 1876G Clubstep.md
    首先考虑暴力的贪心。从\(r\)到\(l\)依次遍历,若\(a_i<x\)则一直进行题目中的操作。正确性是能保证的,因为选后面的\(j\)只能\(+1\),而选\(i\)可以\(+2\),且\(i\)前面的部分都是\(+1\)。考虑转化一下,把对\(i\)进行操作\(k\)次后,\(\forallj\in[1,i),a_j\l......
  • Codeforces Round 918 (Div. 4)赛后总结(前缀和)(set部分用法)
    CodeforcesRound918(Div.4)赛后总结a,b题没啥好说的c题典中典没开longlong一回事,还有判断数a是否为完全平方数直接用sqrt(a)\(^2\)=a的判断就可以d题经典字符串问题首先,我们以一个字符数组的形式存数据。再根据已知cv,cvc两种形式,我们只需要判断c的时候看v是否有用过(可......
  • Codeforces Round 887 (Div. 1)
    CodeforcesRound887(Div.1)A先来个二分。注意到这样一件事:考虑是\(a_i\)失效的最小时间\(t_i\),发现\(t\)有单调性。所以从大到小考虑\(a\),每次相当于将二分的值减去一个值,复杂度\(O(\sumn(\logn+\logk))\)。codeconstintN=2e5+10;intn;llk;lla......
  • Codeforces Round #843 (Div. 2)
    安利一个叫codeforcesbetter的插件  https://greasyfork.org/zh-CN/scripts/465777-codeforces-better今天装了后使用cf体验非常舒适=====A.GardenerandtheCapybaras(easyversion)问字符串s能否切分成3个字符串a、b、c,且满足a<=b&&c<=b或者b>=a&&b>=cs长度<=100,暴力......
  • [Codeforces] CF1538F Interesting Function
    CF1538FInterestingFunction题目传送门题意给定两个正整数\(l,r\)(\(l<r\)),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。位数变化指:\(l=909\),将\(l+1\)后有\(2\)位数字发生变化。\(l=9\),将\(l+1\)后也有\(2\)位数字发生变......