首页 > 其他分享 >ABC 273 ABCD

ABC 273 ABCD

时间:2022-11-04 21:45:00浏览次数:75  
标签:ABCD insert ABC rs -- LL cin 273 cs

https://atcoder.jp/contests/abc273
A - A Recursive Function

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
LL f[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        for(int i=0;i<=n;i++)
        {
            if(i==0) f[i]=1;
            else f[i]=i*f[i-1];
        }
        cout<<f[n]<<endl;
    }
    return 0;
}

B - Broken Rounding

题目大意:

给定一个数字,找和10^i离得最近的数字。
Sample Input 1 
2048 2
Sample Output 1 
2100

好像前几天刚写了一个cf长得极其相似的题目。
学学佬儿的写法

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=2002;
LL f[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n,k;
        cin>>n>>k;
        for(int i=0;i<=15;i++)
        {
            if(i==0) f[i]=1;
            else f[i]=f[i-1]*10;
            //cout<<f[i]<<" ";
        }
        //cout<<endl;
        for(int i=1;i<=k;i++)
        {
            LL mod=n%f[i];
            if(mod<f[i]/2) n-=mod;
            else n+=(-mod)+f[i];
        }
        cout<<n<<endl;
    }
    return 0;
}

C - (K+1)-th Largest Number

题目大意:

看得懂的自己看吧,看不懂的看图描述。

(反正我是服了这出题人,读题读了两天,还是找的别人的题解才看懂的意思)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
LL a[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        set<LL> s;
        map<LL,LL> mp;
        for(LL i=1;i<=n;i++)
        {
            LL x;
            cin>>x;
            mp[x]++;//记录个数
            s.insert(x);//自动排列
        }
        LL len=s.size();
        LL k=0;
        for(auto i:s)
        {
            k++;
            a[len-k]=mp[i];//因为是从第0个位置开始放置最大值的个数
        }
        for(LL i=0;i<n;i++)
        {
            cout<<a[i]<<endl;//按照从0到n的顺序输出。其实1到n也行(上面改一下)
        }
    }
    return 0;
}

D - LRUD Instructions

题目大意:

给定一个h*w的矩阵,再给定初始位置(rs,cs)

有n个障碍物,障碍物不可以进入也不可以跨越;

有q条指令:指令每次都有LRUD四个方向,然后还有行进的步数。

当碰到障碍物时即可停止,问我们每一步操作后到达的位置是在哪里?
Sample Input 2 
6 6 6 3
7
3 1
4 3
2 6
3 4
5 5
1 1
3 2
10
D 3
U 3
L 2
D 2
U 3
D 3
U 3
R 3
L 3
D 1
Sample Output 2 
6 3
5 3
5 1
6 1
4 1
6 1
4 1
4 2
4 1
5 1

(模拟题) 题目意思倒是不难,难的是如何省时判断以及移动,写法如何优化

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=5000200,M=2002;
LL h,w,rs,cs,n,q;
set<LL>::iterator it;
map<LL,set<LL>> row,col;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>h>>w>>rs>>cs;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            LL r,c;
            cin>>r>>c;
            row[r].insert(c);
            col[c].insert(r);
        }
        cin>>q;
        while(q--)
        {
            char op;
            int x;
            cin>>op>>x;
            if(op=='L')//不改变x,左移y
            {
                //插入左右边界
                row[rs].insert(0);
                row[rs].insert(w+1);
                it=row[rs].upper_bound(cs);//因为找的是比当前x第一大的数字,所以就找到了后面的大的第一个,但是我们想要的是左边的最后一个(也就是和cs挨的最近的)
                it--;//所以--就找到啦!
                cs=max(cs-x,(*it)+1);//因为有可能还是在0的位置上,要保证不出界
            }
            else if(op=='R')//不改变x,右移y
            {
                //插入左右边界
                row[rs].insert(0);
                row[rs].insert(w+1);
                it=row[rs].upper_bound(cs);//这里就是正常的找的比cs大一丢丢的最近的数字
                cs=min(cs+x,(*it)-1);//但是也是不可以出界o
            }
            else if(op=='U')//不改变y,上移x
            {
                //插入上下边界
                col[cs].insert(0);
                col[cs].insert(h+1);
                //与第一个if情况类似,因为我们找的是比rs小一丢丢的数字,但是找到了比它大一丢丢的数字,所以直接--
                it=col[cs].upper_bound(rs);
                it--;//这样就可以直接找到这个数字的位置
                rs=max(rs-x,(*it)+1);
            }
            else if(op=='D')//不改变y,下移x
            {
                //插入上下边界
                col[cs].insert(0);
                col[cs].insert(h+1);
                it=col[cs].upper_bound(rs);//正常比它大一丢丢的数字
                rs=min(rs+x,(*it)-1);//但是以防出界,还是得--一个位置
            }
            cout<<rs<<" "<<cs<<endl;
        }
    }
    return 0;
}

好好学学写法

标签:ABCD,insert,ABC,rs,--,LL,cin,273,cs
From: https://www.cnblogs.com/Vivian-0918/p/16859201.html

相关文章

  • ABC275 E~F
    E:披着概率外皮的简单数数题。CodeF:简单DP,设\(f_{i,j,0/1}\)表示前\(i\)个数,选的数的和为\(j\),第\(i\)个数选不选的最小操作次数。转移很显然,不清楚可以看代码......
  • ABC 274 ABCD(*)
    https://atcoder.jp/contests/abc274/tasksA-BattingAverage#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;const......
  • 洛谷P2730 [USACO3.2]魔板 Magic Squares
    题目链接:点这里 一般这种从某种状态转移到目标状态的最短距离,都可以使用BFS来做。从题目给定的初始状态,依次执行题目给定的三种操作,分别是交换上下两行(操作A)、将最后......
  • Atcoder Beginner Contest ABC 275 Ex (H) Monster 题解
    先明确\(a_i\)是一个怪物的血量,\(b_i\)是攻击的代价。发现如果我们想攻击一个怪物,不如找出一个极大的包含它的区间,满足这个区间内所有怪物的攻击代价都不大于它本身的代价,......
  • Sugoroku 4 (Atcoder abc275 T5) DP
    题目描述题目链接https://atcoder.jp/contests/abc275/tasks/abc275_e题意从\(0\)到\(n\)有\(n+1\)个方格,你现在在第\(0\)个格子。每次移动可以随机走\(1\)......
  • ABC273 E~G
    E:考虑维护当前所在位置的指针。设当前点为\(u\)。对于第一个操作,我们可以将\(u\)新增一个儿子\(x\),并将指针转移到\(x\)。对于第二个操作,把指针转移到\(fa_u\)......
  • 等腰三角形ABC中,AB=AC,D是AC上一点,AE//BD,点F是AE上一点,CF交BD于点M,∠EBD=2∠ABC=2∠CMD
    2022年11月3日20点48分END......
  • ABC272 E~G
    E:考虑最后的答案一定在\([0,n]\)中,所以对于每个\(i\)都保留它在这个范围内的值。至多有\(\sum_{i}\dfrac{n}{i}=n\logn\)个有效值,用set保存下来即可。CodeF:......
  • 梯形ABCD中,AD//BC,角ABC=2倍角DCB,AB=AD。E为AD上一点,F为CD上一点,角BEF=角BAD。求证:BF=E
    2022年11月2日21点15分END......
  • ABC271 E~F
    E:按给出的顺序依次松弛每条边就好了。CodeF:折半搜索典题,双倍经验。CodeG:啥玩意啊不想做Ex:啥玩意啊不想做......