首页 > 其他分享 >Educational Codeforces Round 1

Educational Codeforces Round 1

时间:2023-07-28 10:33:07浏览次数:29  
标签:Educational int res ned Codeforces vis ans push Round

Educational Codeforces Round 1

A. Tricky Sum

int fac[N],p2[N];
void init(){
    fac[0]=1;p2[0]=1;
    for(int i=1;i<=33;i++){
        fac[i]=fac[i-1]*2;
        p2[i]=p2[i-1]+fac[i];
    }
}
void solve(){
    int n=read();
    int sum=(1+n)*n/2;
    cout<<sum-p2[(int)log2(n)]*2<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

B. Queries on a String

void solve(){
    string s;
    cin>>s;
    int n=s.size();
    s=' '+s;
    // cout<<"chushi:"<<s<<" end"<<'\n';
    int q=read();
    for(int i=1;i<=q;i++){
        int l=read(),r=read(),k=read()%(r-l+1);
        string t=" ";
        for(int j=1;j<=l-1;j++){
            t+=s[j];
        }
        for(int j=r-k+1;j<=r;j++){
            t+=s[j];
        }
        for(int j=l;j<r-k+1 ;j++){
            t+=s[j];
        }
        for(int j=r+1;j<=n;j++){
            t+=s[j];
        }
        s=t; 
        // cout<<s<<'\n';
    }
    for(int i=1;i<=n;i++){
        cout<<s[i];
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

C. Nearest vectors

极角排序后判断相邻的两个是否是更优

因为有还不会的知识点\((极角排序)\)所以没写出来

const long double pi=acos(-1);
pair<long double,int> a[N];
void solve(){
    int n=read();
    for(int i=1;i<=n;i++){
        long double x,y;
        cin>>x>>y;
        long double e=atan2(y,x);
        a[i]={e,i};
    }
    sort(a+1,a+1+n);
    a[n+1]=a[1];
    long double minn=inf;
    int ansx=-1,ansy=-1;
    for(int i=1;i<=n;i++){
        long double d=fabs(a[i+1].first-a[i].first);
        if(d>pi)d=pi*2-d;
        if(d<minn){
            minn=d;
            ansx=a[i].second;
            ansy=a[i+1].second;
        }
    }
    cout<<ansx<<" "<<ansy<<"\n";
    //puts(ans>0?"YES":"aNO");
    //puts(ans>0?"Yes":"No");
}

D. Igor In the Museum

int ans[N][N],vis[N][N],n,m;
char a[N][N];
void bfs(int xx,int yy){
    queue<PII>q;
    q.push({xx,yy});
    vis[xx][yy]=1;
    int res=0;
    while(q.size()){
        int x=q.front().first,y=q.front().second;
        q.pop();
        if(a[x+1][y]=='.'&&vis[x+1][y]==0)q.push({x+1,y}),vis[x+1][y]=1;;
        if(a[x-1][y]=='.'&&vis[x-1][y]==0)q.push({x-1,y}),vis[x-1][y]=1;;
        if(a[x][y+1]=='.'&&vis[x][y+1]==0)q.push({x,y+1}),vis[x][y+1]=1;;
        if(a[x][y-1]=='.'&&vis[x][y-1]==0)q.push({x,y-1}),vis[x][y-1]=1;;
        if(a[x+1][y]=='*')res++;
        if(a[x-1][y]=='*')res++;
        if(a[x][y+1]=='*')res++;
        if(a[x][y-1]=='*')res++;
    }
    q.push({xx,yy});
    ans[xx][yy]=res;
    while(q.size()){
        int x=q.front().first,y=q.front().second;
        q.pop();
        if(a[x+1][y]=='.'&&ans[x+1][y]==0)q.push({x+1,y}),ans[x+1][y]=res;
        if(a[x-1][y]=='.'&&ans[x-1][y]==0)q.push({x-1,y}),ans[x-1][y]=res;
        if(a[x][y+1]=='.'&&ans[x][y+1]==0)q.push({x,y+1}),ans[x][y+1]=res;
        if(a[x][y-1]=='.'&&ans[x][y-1]==0)q.push({x,y-1}),ans[x][y-1]=res;
    }
}   
void solve(){
    n=read(),m=read();
    int q=read();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(ans[i][j]==0&&a[i][j]=='.')bfs(i,j);
        }
    }
    for(int i=1;i<=q;i++){
        int x=read(),y=read();
        cout<<ans[x][y]<<'\n';
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

E. Chocolate Bar

记忆化搜索,用\(F[i][j][ned]\)分别表示,从\(i*j\)的矩形切出\(ned\)个巧克力的消耗

对于每个矩形只有横着掰和竖着掰

让我想起上一场\(div3\)的记忆化搜索也差点没写出来

int f[35][35][55];
int dfs(int n,int m,int ned){
    if(n*m==ned||ned==0)return f[n][m][ned]=0;
    if(n>m)swap(n,m);
    if(f[n][m][ned]){
        return f[n][m][ned];
    }
    int minn=inf;
    for(int i=1;i<=n/2;i++){
        for(int j=0;j<=ned;j++){
            minn=min(minn,m*m+dfs(i,m,j)+dfs(n-i,m,ned-j));
        }
    }
    for(int i=1;i<=m/2;i++){
        for(int j=0;j<=ned;j++){
            minn=min(minn,n*n+dfs(n,i,j)+dfs(n,m-i,ned-j));
        }
    }
    return f[n][m][ned]=minn;
}
void solve(){
    int n=read();
    for(int i=1;i<=n;i++){
        int x=read(),y=read(),ned=read();
        if(x>y)swap(x,y);
        dfs(x,y,ned);
        cout<<f[x][y][ned]<<'\n';
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

F. Cut Length

*2900 计算几何

标签:Educational,int,res,ned,Codeforces,vis,ans,push,Round
From: https://www.cnblogs.com/edgrass/p/17586929.html

相关文章

  • CodeForces 1268E Happy Cactus
    洛谷传送门AtCoder传送门考虑一些简单的情况,比如树。设\(f_u\)为当前\(u\)能通过边权递增的路径到达的点数(包括它自己)。为了让两个点对在边权递增路径的边权最小的那条边被统计,我们倒序枚举边。当枚举到\((u,v)\)时,我们有\(f_u=f_v=f_u+f_v\)。这是因为\(u\)......
  • Codeforces Round 888 (Div. 3)记录
    A.EscalatorConversations#include<cstdio>#include<algorithm>#include<cmath>#include<vector>#include<string.h>#include<set>#include<string>#include<map>#include<iostream>#include<queue>......
  • Codeforces Round 618 (Div. 2)
    CodeforcesRound618(Div.2)https://codeforces.com/contest/1300A.Non-zero要求和,积都不为0,则先把全部0操作一次,然后再check和是否为0,是的话再对任意数操作一次即可。#include<bits/stdc++.h>usingnamespacestd;constintN=105;intn,x,s,ans;voidsolve......
  • Codeforces Round 888 (Div. 3) A-F
    A.EscalatorConversations题意:有一个扶梯,有n个人要站扶梯,这个扶梯有m个位置,第i个位置的高度为i*k,Vlad高H,第i个人高h[i],当且仅当两个人所处的位置高度加上自身身高刚好相同时才能谈话,问能和Vlad谈话的有多少人。Solution直接计算即可voidsolve(){ intn,m,k,H;cin>>n>>m>>......
  • Codeforces Round 888 (Div. 3) - D
    目录D.PrefixPermutationSumsCodeforcesRound888(Div.3)赛后摘记D.PrefixPermutationSums题意判断给定的长为n-1数组,是否为某个1~n的序列的前缀和数组漏了一个数形成的数组思路就是判断能否变回去,毫无感情的判断机器法一:统计给定前缀和数组的差分数组得......
  • Codeforces Round 888 (Div. 3)
    A.EscalatorConversations#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){intn,m,k,H;cin>>n>>m>>k>>H;vector<int>h(n);intres=0;for(inth,......
  • Codeforces Round 888 (Div. 3)F(异或小技巧)
    题意:给你一个数组长度为n的a数组,要求a数组的值为非负整数,再给你一个k,a的值全小于2的k次方,找到一个小于a的k次方的值x,再从a中找到两个值,让他们(ai⊕x)&(aj⊕x)最小结论:n个数的最小异或对的答案就是排序后最小的相邻异或和思路:(ai⊕x)&(aj⊕x)的最高位为1,可以把它先转换成二进制......
  • 【题解】Educational Codeforces Round 150(CF1841)
    赛时过了A-E,然后就开摆了,为什么感觉C那么无厘头[发怒][发怒]排名:25thA.GamewithBoard题目描述:Alice和Bob玩游戏,他们有一块黑板。最初,有\(n\)个整数\(1\)。Alice和Bob轮流操作,Alice先手。轮到时,玩家必须在棋盘上选择几个(至少两个)相等的整数,擦除它们,然后写一个......
  • Codeforces 1852A Ntarsis' Set 题解
    题目传送门:Codeforces1852ANtarsis'Set题意给定一个集合,里面初始有\(1,2,3...10^{1000}\),告诉你每天会拿掉其中的第\(a_1,a_2,a_3...a_n\)个,询问这样的\(k\)天之后剩下的最小的数是多少。分析思考如果\(x\)在这天没有被删掉,那么哪些被删掉的位置会对它产生什么......
  • Codeforces Round 886 (Div. 4) D - H
    D.BalancedRoundProblem-D-Codeforces双指针,贪心题意:​ 给出\(n\)个数,我们可以删去其中若干个数,使得删完后的数重新排列任意相邻的数之差绝对值不超过\(k\),输出最小删去数的个数思路:​ 很明显可以先将给出的数组进行排序。对于排序后的数组,我们可以将其分为若干个相邻......