首页 > 其他分享 >AtCoder Beginner Contest 320 ABCDE

AtCoder Beginner Contest 320 ABCDE

时间:2023-09-22 20:12:10浏览次数:47  
标签:AtCoder const int nullptr ll ABCDE cin long 320

AtCoder Beginner Contest 320

A - Leyland Number

思路:直接快速幂

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
ll qmi(ll a, ll b)
{
    ll ans = 1;
    while(b)
    {
        if(b & 1) ans = ans * a;
        a = a * a;
        b >>= 1;
    }
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    ll a,b;
    cin>>a>>b;
    cout<<qmi(a,b)+qmi(b,a)<<"\n";
    return 0;
}

B - Longest Palindrome

思路:暴力枚举然后去\(check\)即可

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    string s;
    cin>>s;
    int sz = s.size();
    s = "?"+s;
    int ans = 1;
    for(int i = 1;i <= sz; i++)
    {
        for(int j = 1;j <= sz-i+1; j++)
        {
            string t = s.substr(i,j);
            string t2 = t;
            reverse(t.begin(),t.end());
            //cout<<t<<"\n";
            //cout<<"i = "<<i<<" j = "<<j<<"\n";
            if(t==t2)
            {
                ans = max(ans,j);
            }
        }
    }   
    cout<<ans<<"\n";
    return 0;
}

C - Slot Strategy 2 (Easy)

思路:贪心

考虑最不利的情况:每个转盘只出现同样的数字一次且在同一位置。这时候我们需要转动三圈才能使得都一样。

三重循暴力匹配即可。因为要是转三圈还是不行那么永远都不可能了。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
string s[N];

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int n;
    cin>>n;
    cin>>s[0]>>s[1]>>s[2];
    int ans = 1<<30;
    for(int i = 0;i <= n*3; i++)
        for(int j = 0;j <= n*3; j++)
            for(int k = 0;k <= n*3; k++)
                if(i==j||i==k||k==j)continue;
                else{
                    if(s[0][i%n]==s[1][j%n]&&s[1][j%n]==s[2][k%n])
                        ans = min(ans,max({i,j,k}));
                }
    if(ans==(1<<30))ans =-1;
 
    cout<<ans<<"\n";
    return 0;
}

D - Relative Position

思路:数据范围很小,直接暴力搜索。一开始还以为是拓扑序(cry).

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
vector<array<ll,3>>e[N*2];
pair<ll,ll>pos[N];
bool vis[N];
int n,m;
void dfs(int u,ll x,ll y)
{
    pos[u]={x,y};
    for(auto [v,xx,yy]:e[u])
    {
        if(!vis[v])
        {
            vis[v] = 1;
            dfs(v,x+xx,y+yy);
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    cin>>n>>m;
    for(int i = 1;i <= m; i++)
    {
        ll a,b,x,y;
        cin>>a>>b>>x>>y;
        e[a].push_back({b,x,y});
        e[b].push_back({a,-x,-y});
    }
    vis[1] = 1;
    dfs(1,0,0);
    for(int i = 1; i <= n; i ++)
    {
        if(vis[i])
            cout<<pos[i].first<<" "<<pos[i].second<<"\n";
        else
            cout<<"undecidable\n";
    }
    return 0;
}

E - Somen Nagashi

思路:用\(set\)模拟。因为\(set\)自带排序功能,这样当一个人回来的时候,下标小的会放在前面。

考虑去维护\(2\)个\(set\),一个表示哪些在当前队伍里面,另一个表示出队的人(以回来时间为第一关键字,编号为第二关键字排序)。如果当前有出去的,判断在当前时刻有没有人回来的,如果回来的就插入第一个\(set\)里面。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
ll a[N];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int n,m;
    cin>>n>>m;
    set<int>in;
    set<pair<ll,int>>back;
  
    for(int i = 1;i <= n; i++)
        in.insert(i);

    for(int i = 1;i <= m; i++)
    {       
        int t,w,s;
        cin>>t>>w>>s;
        while(!back.empty())
        {
            auto x = *back.begin();
            ll bt = x.first;
            int id = x.second;
            if(bt<=t)
            {
                back.erase(back.begin());
                in.insert(id);
            }else break;
        }
        if(!in.empty())
        {
            int now = *in.begin();
            a[now] += w;
            back.insert({t+s,now});
            in.erase(in.begin());
        }
    }
    for(int i = 1;i <= n; i++)
        cout<<a[i]<<"\n";
    return 0;
}

标签:AtCoder,const,int,nullptr,ll,ABCDE,cin,long,320
From: https://www.cnblogs.com/nannandbk/p/17723250.html

相关文章

  • AtCoder Beginner Contest 253 E
    AtCoderBeginnerContest253E-DistanceSequence思路:前缀和优化DP要求$|a[i]-a[i+1]|>=k\(定于\)dp[i][j]:\(前\)i\(个数以\)j\(结尾的合法序列数列\)dp[i][j]+=dp[i-1][1~(j-k)]+dp[i-1][(j+k)~m]$直接写的话复杂度是\(O(nm^2)\)的会TLE,我们发现可以做一个前缀和优化......
  • AtCoder Beginner Contest 313 Ex Group Photo
    洛谷传送门AtCoder传送门考虑若重排好了\(a\),如何判断可不可行。显然只用把\(b\)排序,把\(\min(a_{i-1},a_i)\)也排序(定义\(a_0=a_{n+1}=+\infty\)),按顺序逐个判断是否大于即可。这启示我们将\(\min(a_{i-1},a_i)\)排序考虑。考虑从大到小加入\(a_i\),那么......
  • AtCoder Grand Contest 017
    链接C.SnukeandSpells容易发现合法序列排序后一定是若干段值域连续的部分组成:可以发现最小次数就是重叠/空出的部分大小。每次修改只会对\(O(1)\)个点\(±1\),直接维护即可。#include<iostream>#include<cstdio>#include<cstring>#include<vector>#defineN200010......
  • AtCoder Grand Contest 023 E Inversions
    洛谷传送门AtCoder传送门首先将\(a\)从小到大排序,设\(p_i\)为排序后的\(a_i\)位于原序列第\(p_i\)个位置,\(x_i\)为要填的排列的第\(i\)个数。设\(A=\prod\limits_{i=1}^n(a_i-i+1)\),则\(A\)为排列的总方案数(考虑按\(a_i\)从小到大填即得)。套路地,统......
  • Atcoder Regular Contest 165(A~E)
    赛时45min切A~C,降智不会D,罚坐1h,喜提rk70+->rk170+。A-SumequalsLCM可证明结论:若\(N\)只含有一种质因子则无解,否则有解。B-SlidingWindowSort2这么多cornercase的题竟然10min一发入魂,类目了。由于操作是升序排序,且要求最终字典序最大,所以如果存在一个......
  • AtCoder Beginner Contest 320
    A-LeylandNumbera,b=map(int,input().split(''))print(a**b+b**a)B-LongestPalindromes=input()n=len(s)res=0forlinrange(1,n+1):foriinrange(0,n-l):t=q=s[i:i+l]t=t+t[::-1]......
  • abc320f <dp >
    题目F-FuelRoundTrip总结关键在于状态的定义。因为每个位置尽可加油一次,因此往返会相互影响,因而必须考考虑状态中定义去时经过此地的油量j与回时经过此地的油量k,这样才能成功转移;此外,本题状态转移比较奇特,相邻两个位置的状态的转移,在时间上包含去和回两个不同的时刻,较难......
  • ABC 320
    博主打这一次abc有点乱打,加上晚来了,倒开的,所以赛时只做了abcg,def没看。ef现在还没想,所以这篇文章:abcg正常写,d口胡(应该是对的)submissionsA可以直接for循环求值。(但是我用了快速幂)B枚举左右端点,\(O(|S|)\)判断是否回文。复杂度\(O(|S|^3)\)。优化至\(O(|S|^2)\),......
  • [ARC119F] AtCoder Express 3
    题目链接观察样例1的解释,发现切换类型的方法是比较单一的这种就是直接走一段换一段,我们可以人为钦定换乘时最多走一步,因为相邻的同色也可以视作走车站这种情况复杂一些,需要往回走一段,但是依然可以发现往回走也至多一步,因为如果走了两步说明往回走了一步到达的车站依......
  • abc320
    A题意给你\(A\)和\(B\),输出\(pow(A,B)+pow(B,A)\)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#definelen(x)((int)((x).size()))#defineinf0x3f3f3f3f#definemod998244353//#definemod1000000007voidsolve(){llA......