AtCoder Beginner Contest 174

目录

        • A Air Conditioner
        • B Distance
        • C Repsept
        • D Alter Altar
        • E Logs
        • F Range Set Query


A B C D E F

( √:做出; ●:尝试未做出; ○:已补题 )


题目地址:https://atcoder.jp/contests/abc174

这一次的题目好简单。



A Air Conditioner

题意:签到题。

思路

代码

#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include 
#include 
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
    int x=0,flag=1; char c=getchar();
    while((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') flag=0,c=getchar();
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return flag?x:-x;
}

int main()
{
    int n=read();
    puts(n>=30?"Yes":"No");

    return 0;
}



B Distance

题意:签到题。

思路

代码

#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include 
#include 
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
    int x=0,flag=1; char c=getchar();
    while((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') flag=0,c=getchar();
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return flag?x:-x;
}

int main()
{
    int tot=0,n=read();
    LL d=read();
    while(n--)
    {
        LL x=read(),y=read();
        if(x*x+y*y<=d*d) tot++;
    }
    cout<<tot;

    return 0;
}



C Repsept

题意:有一个序列 7, 77, 777, 7777, .... ,现在给出一个正整数 K,问这个序列中最早第几项,可以被 K 整除。如果每个都不能则输出 -1 。

思路:一开始卡了卡没思路,后来发现只要暴力计算 1e6 项序列的每个值取模 K 就行了,如果余数为 0 说明可以整除。(刹那间忘记了整除对应取模为0……)

代码

#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include 
#include 
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
    int x=0,flag=1; char c=getchar();
    while((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') flag=0,c=getchar();
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return flag?x:-x;
}

int main()
{
    LL k=read(),x=7%k,t=1;
    while(1)
    {
        if(!x) break;
        if(t>1000000) break;
        x=x*10+7;
        x%=k;
        t++;
    }
    if(!x) cout<<t;
    else cout<<"-1";

    return 0;
}



D Alter Altar

题意:签到题。

思路:两个指针扫一遍,如果相反就交换就行了。

代码

#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include 
#include 
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
    int x=0,flag=1; char c=getchar();
    while((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') flag=0,c=getchar();
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return flag?x:-x;
}

const int maxn=2e5+5;
char s[maxn];
int l,r;

int main()
{
    int n=read();
    scanf("%s",s+1);
    l=1,r=n;
    int ans=0;
    while(l<=r)
    {
        while(l<=n && s[l]=='R') l++;
        while(r>=1 && s[r]=='W') r--;
        if(l<r) swap(s[l],s[r]),ans++;
    }
    cout<<ans;

    return 0;
}



E Logs

题意:水水的二分题。

思路:因为不理解 round up 是“向上取整”的意思(一直以为是四舍五入,因为有道是这么翻译的_(¦3」∠)_)然后就 WA 了两次。

代码

#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include 
#include 
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
    int x=0,flag=1; char c=getchar();
    while((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') flag=0,c=getchar();
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return flag?x:-x;
}

const int maxn=2e5+5;
LL K,n;
double a[maxn],eps=1e-6;

bool can(double len)
{
    LL tot=0;
    REP(i,1,n)
    {
        LL x=a[i]/len;
        if(fabs(a[i]-len*x)>eps) x++;
        tot+=x-1;
        if(tot>K) return 0;
    }
    return 1;
}

int main()
{
    n=read(),K=read();
    REP(i,1,n) a[i]=read();
    double l=1e-5,r=1e9,mid;
    while(l<r-0.000001)
    {
        mid=(l+r)/2;
        if(can(mid)) r=mid;
        else l=mid;
    }
    LL x=r+1-eps;
    cout<<x;

    return 0;
}



F Range Set Query

题意:有 n 个球,每个球有一种颜色,给出 Q 个询问,每次询问给出 l i ,   r i l_i, \ r_i li, ri ,要求计算 [ l i , r i ] [l_i,r_i] [li,ri] 区间内的球有多少种不同的颜色。

思路:很经典的主席树(莫队其实也可以,不过复杂度大一点点)。然后权值线段树或树状数组那些什么的也是可以做的。主席树的做法的话好像是设 L[i] 表示第 i 个位置的颜色上一次出现的位置,然后每次询问实际上要统计的就是 ∑ i = l r ( L [ i ] < l ) \sum\limits_{i=l}^r(L[i]i=lr(L[i]<l) ,这个可以用主席树维护。

下面的代码显然是离线算法,所以用的不是主席树,我也忘了自己当时用的什么方法了,反正这份代码是直接从洛谷 copy 过来的。

代码

#define DIN freopen("input.txt","r",stdin);
#define DOUT freopen("output.txt","w",stdout);
#include 
#include 
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,a,b) for(int i=(a);i<=(int)(b);i++)
#define REP_(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<LL,LL> P;
int read()
{
    int x=0,flag=1; char c=getchar();
    while((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') flag=0,c=getchar();
    while(c<='9' && c>='0') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return flag?x:-x;
}

#define chl k<<1
#define chr k<<1|1

const int maxn=5e5+5;
int a[maxn],book[2*maxn],n,m,tree[maxn*3],t,ans[maxn];
struct node {int l,r,bianhao;};
node h[maxn];

bool cmp(node &a,node &b)
{
    return a.r<b.r;
}

void add(int k,int l,int r,int j,int v)
{
    if(j<l || j>r) return;
    if(l==r && l==j) {tree[k]+=v;return;}
    tree[k]+=v;
    int mid=(l+r)>>1;
    add(chl,l,mid,j,v);
    add(chr,mid+1,r,j,v);
}

int sum(int k,int l,int r,int ll,int rr)
{
    if(rr<l || ll>r) return 0;
    if(l>=ll && r<=rr) return tree[k];
    int mid=(l+r)>>1;
    return sum(chl,l,mid,ll,rr)+sum(chr,mid+1,r,ll,rr);
}

int main()
{
    n=read(); m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=0;i<m;i++) h[i].l=read(),h[i].r=read(),h[i].bianhao=i;
    sort(h,h+m,cmp);

    for(int i=0;i<m;i++)
    {
        int l=h[i].l,r=h[i].r;
        for(int j=t+1;j<=r;j++)
        {
            if(!book[a[j]]) book[a[j]]=j,add(1,1,n,j,1);
            else
            {
                add(1,1,n,book[a[j]],-1);
                book[a[j]]=j;
                add(1,1,n,j,1);
            }
        }
        t=r;
        ans[h[i].bianhao]=sum(1,1,n,l,r);
    }
    for(int i=0;i<m;i++)
        printf("%d\n",ans[i]);

	return 0;
}

你可能感兴趣的:(atcoder)