首页 > 其他分享 >P9579「Cfz Round 1」Elevator

P9579「Cfz Round 1」Elevator

时间:2023-08-27 15:00:26浏览次数:30  
标签:node cnt P9579 long spe maxn Cfz Round cmp

思路

假设 \(a_i\) 和 \(b_i\) 的最大值是 \(maxn\)。

可以发现序列 \(1,2,3 \cdots maxn\) 一定是要构造的序列的子序列。

那么,这种情况下,一定满足了所有的 \(a_i<b_i\),因为 \(a_i\neq b_i\),所以我们只需要单独满足所有的 \(a_i>b_i\) 就可以了。

对于所有的 \(a_i>b_i\),我们有两种选择,到了 \(a_i\) 后,序列往回减倒 \(b_i\) 再加回来,或者序列最后达到 \(maxn\) 再往回减倒 \(b_i\)。

第一种情况会使答案增加 \(2\times (a_i-b_i)\),第二种情况会使答案增加 \(maxn-b_i\)。

那么,我们可以先对 \(b_i\) 排序,然后枚举 \(i\),\(i\) 以前的用前一种,\(i\) 以后的用后一种。

39pts WA code

#include<bits/stdc++.h>
using namespace std;
struct node{long long a,b;}spe[500005];
inline bool cmp(node a,node b){return a.b<b.b;}
long long n,a1,b1,cnt,maxn,ans,sum;
int main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;++i)
	{
		scanf("%lld%lld",&a1,&b1);
		if(a1>b1) spe[++cnt].a=a1,spe[cnt].b=b1;//记录ai>bi的情况
		maxn=max(maxn,max(a1,b1));
	}
	ans=0x3f3f3f3f3f3f3f3f;
	sort(spe+1,spe+cnt+1,cmp);//排序
	for(long long i=1;i<=cnt;++i)
	{
		ans=min(ans,sum+maxn-spe[i].b);//取最小
		sum+=2*(spe[i].a-spe[i].b);//记录前i所增加的答案
	}
	printf("%lld",min(sum,ans)+maxn);//最后的sum是全部都选择第一种的答案
	return 0;
}

WA 了,这是为什么呢?仔细想了一下,如果有两组 \(a_i\) 和 \(b_i\) 有重叠部分,如 \(1,5\) 和 \(3,7\) 那么如果这两组都选择第一种方式,那么增加的答案应该是 \(2\times(7-1)\) 而非 \(2\times(5-1)+2\times(7-3)\)。

所以我们再记录前面所有的 \(a_i\) 的最大值为 \(lasa\),那么在处理第 \(i+1\) 组时,如果 \(b_i<lasa\) 的话,增加的答案就是 \(2\times(a_i-lasa)\),否则的话就还是原来的答案贡献,合在一起就是 \(2\times(a_i-\max(lasa,b_i))\)。

AC code

#include<bits/stdc++.h>
using namespace std;
struct node{long long a,b;}spe[500005];
inline bool cmp(node a,node b){return (a.b!=b.b)?a.b<b.b:a.a<b.a;}
long long n,a1,b1,cnt,maxn,ans,sum,lasa;
int main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;++i)
	{
		scanf("%lld%lld",&a1,&b1);
		if(a1>b1) spe[++cnt].a=a1,spe[cnt].b=b1;
		maxn=max(maxn,max(a1,b1));
	}
	ans=0x3f3f3f3f3f3f3f3f;
	sort(spe+1,spe+cnt+1,cmp);
	for(long long i=1;i<=cnt;++i)
	{
		ans=min(ans,sum+maxn-spe[i].b);
		sum+=2*(max(0ll,spe[i].a-max(lasa,spe[i].b))),lasa=max(lasa,spe[i].a);
	}
	printf("%lld",min(sum,ans)+maxn);
	return 0;
}

标签:node,cnt,P9579,long,spe,maxn,Cfz,Round,cmp
From: https://www.cnblogs.com/One-JuRuo/p/17660299.html

相关文章

  • P9578「Cfz Round 1」Permutation
    思路我们需要尽量让相邻两个数的和的最大值减最小值最小。先思考如何让最大值最小。对于\(n\),两侧最小也必须要放\(1\)和\(2\)。所以最大值至少也是\(n+2\)。同时,我们再思考\(1\)周围能摆什么,因为不能让最小值太小,我们需要放比较大的,也就是\(n\)和\(n-1\)。这样来......
  • 【LGR-156-Div.3】洛谷网校 8 月普及组月赛 I & MXOI Round 1 & 飞熊杯 #2(同步赛)
    【LGR-156-Div.3】洛谷网校8月普及组月赛I&MXOIRound1&飞熊杯#2(同步赛)\(T1\)luoguP9581宝箱\(100pts\)水题,模拟即可。intmain(){ inta,b,ans=0; cin>>a>>b; if((a<0&&b<0)||(a>0&&b>0)) { cout<<max(abs(a),abs......
  • 【CFVP】Codeforces Round 851 (Div. 2)
    前言本场VP深感自己的弱小与史队的强大。又一次被史队全方位暴打。来做一个简要的总结。正文A.OneandTwoA题日常的愚蠢。考虑到原序列只含有质因子2。我们将质因子2平分给左右两边即可。当2的个数为奇数时即判断为无解。代码:#include<bits/stdc++.h>usingnamespace......
  • 【LGR-153-Div.2】梦熊联盟 8 月月赛 Ⅳ & Cfz Round 1 & 飞熊杯 #1
    【LGR-153-Div.2】梦熊联盟8月月赛Ⅳ&CfzRound1&飞熊杯#1\(T1\)「CfzRound1」DeadCells\(100pts\)正解:模拟(注意特判)llgcd(lla,llb){ returnb?gcd(b,a%b):a;}intmain(){ lla,b,k,d,i,ans=1; a=read();b=read();k=read(); d=a/gcd(a,b)*b; f......
  • Codeforces Round 894 (Div. 3) ABCDEFG AK
    CodeforcesRound894(Div.3)第一次div3ak,虽然是vp的,后三题质量不错A-GiftCarpet穷举四个不同列即可,时间复杂度\(O(M^4)\)inta[100][100];voidsolve(){memset(a,0,sizeofa);intn,m;cin>>n>>m;for(inti=1;i<=n;i++)......
  • 2023.8.26 LGJ Round
    A有\(n\)个序列,每个序列长度\(m_i\),每个序列的每个数有权值\(c{i,j}\)。\(\summ_i\len\le10^5\).A和B轮流行动,A只能选择一个序列获得其开头数的权值并删去,B只能选择一个序列获得其末尾数的权值并删去。问A,B分别最多获得多少权值。若所有序列长度为偶数,可以证......
  • Codeforces Round 894 (Div. 3)
    CodeforcesRound894(Div.3)因为最近开学了,所以晚上可能就没有什么时间打这个了,不过以后一定会在第二天把题给补掉A题传送门A题意:就是在一个n*m的的字符矩阵中从左往右依次取出4列,使得每列包含vika这四个字符中按顺序出现一个。必须保证是按顺序出现。A思路:这是一个简......
  • 2023.8.25 LGJ Round
    AAlice和Bob玩一个游戏,Alice先手。有一个长度为偶数的字符串,每次取出该字符串最前或最后的字符并删掉,并把该字符加入自己的字符串末尾。双方都采取最优策略,问谁的字符串字典序更小,或相同。区间dp.\(dp_{i,j}\)表示\([i,j]\)这个区间先手必胜/必败/平局。初始\(dp_{......
  • Codeforces Round 894 (Div. 3) A-F题解
    A.GiftCarpet题意最近,特马和维卡庆祝了家庭日。他们的朋友Arina送给他们一块地毯,这块地毯可以用拉丁文小写字母的\(n\cdotm\)表来表示。维卡还没看过礼物,但特马知道她喜欢什么样的地毯。如果维卡能在地毯上读出自己的名字,她一定会喜欢的。她从左到右逐列阅读,并从当前列中......
  • 关于周考 Round 11 吐槽 & 自己如何犯智
    T1卡map。map\(\to\)unordered_map,\(10\to100\)。为什么别人认为这是卡longlong?(好像都卡了。:sad:)T3一眼dp然后否决掉了,写了个搜索,并且认为搜索是正解,并且调了很久发现假了,我是Joker。T4看到了\(u_i<v_i\)但是neglected!!1然后我不会倒序dp而是dfs!!!而且可......