首页 > 其他分享 >CF1599

CF1599

时间:2024-03-11 09:05:35浏览次数:27  
标签:ch rr ll CF1599 砝码 pair flg

CF1599

Bubble Cup 14 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred, Div. 1)

CF1599A

link

题意

给你一个长度为 \(N\) 的质量为 \(A_1,A_2,\dots,A_N\) 的数组 \(A\)。每个数组中的值表示各个砝码的重量。

所有砝码的质量均不相同。你可以把每个砝码放在天平的一边(左边或右边)。

你不必按照 \(A_1,\dots,A_N\) 的顺序放置砝码。还有一个由字符 \(\texttt{L}\) 和 \(\texttt{R}\) 组成的字符串 \(S\),意思是在放完第 \(i\) 个砝码(不是 \(A_i\) ,而是选择第 \(i\) 个砝码)后,天平的左边或右边应该更重。

找出在天平上放置砝码的顺序,以便满足字符串 \(S\) 的规则。

\(n \le 2\times 10^5\)

题解

很神仙的思路。

首先发现样例中没有 \(-1\),猜测一定有解。

然后就相当于给出一个构造方案。

数组顺序没有影响,直接排序。

考虑倒着做,将每次填入一个数变成每次删除一个数。

有一个大胆的想法:初始状态让两个天平交替填入 \(1,2,\dots,n\)。

然后发现,每次拿出全局最小值一定不影响倾斜方向,拿出全局最大值一定影响倾斜方向。

证明显然。

然后就做完了()

代码

#include<bits/stdc++.h>
using namespace std;
bool stmemory;
namespace Call_me_Eric{
inline int read(){
    int x = 0, f = 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
const int maxn = 2e5 + 10;
int n;
int a[maxn];
char ch[maxn];
bool flag[maxn];//1 = L, 0 = R;
deque<int> L,R;
pair<int,char> ans[maxn];
void main(){
    n = read();
    for(int i = 1;i <= n;i++)a[i] = read();
    scanf("%s",ch + 1);sort(a + 1,a + 1 + n);
    for(int i = 1;i <= n;i++){
        flag[i] = ch[i] == 'L';
        if(i & 1){L.push_back(a[i]);}
        else {R.push_back(a[i]);}
    }
    if(flag[n] != (n & 1)){swap(L,R);}
    for(int i = n;i >= 1;i--){
        int flg = flag[i] ^ flag[i - 1];
        pair<int,char> ll,rr;
        ll = rr = make_pair(flg ? -0x3f3f3f3f : 0x3f3f3f3f, 'O');
        if(L.size()){ll = make_pair(flg ? L.back() : L.front(),'L');}
        if(R.size()){rr = make_pair(flg ? R.back() : R.front(),'R');}
        if((ll < rr) ^ flg){ans[i] = ll;if(flg)L.pop_back();else L.pop_front();}
        else {ans[i] = rr;if(flg)R.pop_back();else R.pop_front();}
    }
    for(int i = 1;i <= n;i++){printf("%d %c\n",ans[i].first, ans[i].second);}
    return;
}
};
bool edmemory;
signed main(){
    auto stclock = clock();
    Call_me_Eric::main();
    auto edclock = clock();
    cerr << (&stmemory - &edmemory) / 1024.0 / 1024.0 << " Mib cost.\n";
    cerr << (edclock - stclock) * 1.0 / CLOCKS_PER_SEC << " Sec cost.\n";
    return 0;
}

标签:ch,rr,ll,CF1599,砝码,pair,flg
From: https://www.cnblogs.com/Call-me-Eric/p/18065272

相关文章

  • cf1599j-solution
    CF1599JSolutionlink题意:给你一个长为\(n\)的序列\(b\),请你构造一个长为\(n\)的序列\(a\),满足\(b\)中的数都能由\(a\)中两个不同下标的数相加得到。无解报告NO,\(n\le10^3,b_i\le10^6\)。我们发现如果我们能用\(a_1\sima_m\)来凑出\(b_1\simb_m\),剩下的令......
  • CF1599H Hidden Fortress
    看到很多是用二分的解法,这题其实可以这用**$4$**次查询得到结果。我们只需要用两次查询就可以找到地方基地矩阵的一条边的中点。先询问$d1=query(1,1)$和$d2=query(1,10^9)$。就可以求出$y_m=\frac{1+10^9+d1-d2}{2}$。之后再询问$d3=query(10^9,1)$和$d4=query(1,y_......
  • CF1599E Two Arrays
    Dq17y。考虑斐波那契通项公式,分别维护区间\(\left(\frac{1+\sqrt5}{2}\right)^{a_{1,i}+a_{2,i}}\)和\(\left(\frac{1-\sqrt5}{2}\right)^{a_{1,i}+a_{2,i}}\)的和。显然可以扩域,定义一个\(n=a+\sqrt5b\)的结构体即可。然后快速求斐波那契数列某项就可以直接快速幂了。......
  • [CF1599A] Weights
    题目描述Youaregivenanarray$A$oflength$N$weightsofmasses$A_1$,$A_2$...$A_N$.Notwoweightshavethesamemass.Youcanputeveryweightononesideofthebalance(leftorright).Youdon'thavetoputweightsinorder$A_1$......
  • CF1599A. Weights
    题意给出n个物品,第i个重量a[i](互不相同)每次任意选一个物品放到秤的左右两边,使得放完之后左>右或左<右给出a[i]和大小关系s[i],构造方案题解必定有解把a排序,假设当前选了LRLRLR,发现在最后加L可以瞬间反转,在最前加R可以保持不变即,当前选了一段连续的a[i],放的顺序为...LRL......