Codeforces Round #614 (Div. 2)补题


题目

A. ConneR and the A.R.C. Markland-N

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1e3+10;
unordered_map<int,bool>mp;
int main(){
    int t;
    cin>>t;
    int n,s,k;
    while(t--){
        mp.clear();
        int ans=INF;
        scanf("%d%d%d",&n,&s,&k);
        for(int i=1;i<=k;i++){
            int x;
            scanf("%d",&x);
            mp[x]=true;
        }
        for(int i=0;s+i<=n;i++){
            if(!mp[s+i]){
                ans=min(i,ans);
                break;
            }
        }
        for(int i=0;s+i>0;i--){
            if(!mp[s+i]){
                ans=min(-i,ans);
                break;
            }
        }
        cout<<ans<<endl;
    }
}

B. JOE is on TV!

k n i = 1 k 1 n k + 1 \frac{k}{n} \le \sum\limits_{i=1}^{k} \frac{1}{n-k+1}
每次淘汰掉一个为最优

#include<bits/stdc++.h>
int main(){
    double ans=0;
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        ans+=(1.0/i);
    }
    printf("%.12f\n",ans);
}

C. NEKO’s Maze Game

不能通过的情况为邻近的一行的y、y-1或y+1位置存在岩浆,如果不存在上述情况,则为YES

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
int x,y;
friend bool operator <(node a,node b){
    return a.x==b.x?a.y<b.y:a.x<b.x;
}
};
set<pair<node,node> >se;
bool vis[3][maxn];
int main(){
    int n,q;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=q;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        int opx=3-x;
        if(!vis[x][y]){
        vis[x][y]=true;
        for(int k=-1;k<=1;k++){
            if(y+k<=0||y+k>n)
            continue;
          if(vis[opx][y+k]){
            se.insert(make_pair((node){x,y},(node){opx,y+k}));
            se.insert(make_pair((node){opx,y+k},(node){x,y}));
          }
        }
        }
        else{
            vis[x][y]=false;
            for(int k=-1;k<=1;k++){
            if(y+k<=0||y+k>n)
            continue;
          if(vis[opx][y+k]){
            se.erase(make_pair((node){x,y},(node){opx,y+k}));
            se.erase(make_pair((node){opx,y+k},(node){x,y}));
          }
        }
        }
        if(se.empty()){
            puts("YES");
        }
        else{
            puts("NO");
        }
    }
}

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<ll,ll> >vec;
const ll Abs(ll x){
    return x<0?-x:x;
}
int main(){
ll x,y,ax,ay,bx,by,xs,ys,t;
cin>>x>>y>>ax>>ay>>bx>>by>>xs>>ys>>t;
vec.push_back(make_pair(x,y));
while(x<=1e16&&y<=1e16){
    x=ax*x+bx,y=ay*y+by;
    vec.push_back(make_pair(x,y));
}
ll ans=0;
for(ll pos=0;pos<vec.size();pos++){
ll curx=xs,cury=ys,curt=t;
ll curans=0;
for(ll i=pos-1;i>=0;i--){
    if(Abs(curx-vec[i].first)+Abs(cury-vec[i].second)<=curt){
        curt-=Abs(curx-vec[i].first)+Abs(cury-vec[i].second);
        curans++;
        curx=vec[i].first;
        cury=vec[i].second;
    }
    else
        break;
}
for(ll i=pos;i<vec.size();i++){
    if(Abs(vec[i].first-curx)+Abs(vec[i].second-cury)<=curt){
        curt-=Abs(vec[i].first-curx)+Abs(vec[i].second-cury);
        curans++;
        curx=vec[i].first;
        cury=vec[i].second;
    }
    else
        break;
}
//cout<<pos<<' '<<curans<<endl;
ans=max(curans,ans);
}
cout<<ans<<endl;
}

D. Aroma’s Search

1、点数最多log(1e16)
2、考虑当前在某个有宝藏的位置,一定会先往回走拿走之前的宝藏,在往后走那后面的,因为若将从当前宝藏位置走到最初的宝藏位置再返回走过的距离用于往前走,最多只够拿到一个宝藏。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<ll,ll> >vec;
const ll Abs(ll x){
    return x<0?-x:x;
}
int main(){
ll x,y,ax,ay,bx,by,xs,ys,t;
cin>>x>>y>>ax>>ay>>bx>>by>>xs>>ys>>t;
vec.push_back(make_pair(x,y));
while(x<=1e16&&y<=1e16){
    x=ax*x+bx,y=ay*y+by;
    vec.push_back(make_pair(x,y));
}
ll ans=0;
for(ll pos=0;pos<vec.size();pos++){
ll curx=xs,cury=ys,curt=t;
ll curans=0;
for(ll i=pos-1;i>=0;i--){
    if(Abs(curx-vec[i].first)+Abs(cury-vec[i].second)<=curt){
        curt-=Abs(curx-vec[i].first)+Abs(cury-vec[i].second);
        curans++;
        curx=vec[i].first;
        cury=vec[i].second;
    }
    else
        break;
}
for(ll i=pos;i<vec.size();i++){
    if(Abs(vec[i].first-curx)+Abs(vec[i].second-cury)<=curt){
        curt-=Abs(vec[i].first-curx)+Abs(vec[i].second-cury);
        curans++;
        curx=vec[i].first;
        cury=vec[i].second;
    }
    else
        break;
}
//cout<<pos<<' '<<curans<<endl;
ans=max(curans,ans);
}
cout<<ans<<endl;
}

E. Xenon’s Attack on the Gangs

好喜欢这个题啊
不管怎么安排,只有一条有从0开始的最长的连续的链可以对答案产生贡献,我们可以枚举链的两个端点做dp。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=3e3+10;
ll head[maxn];
ll sz[maxn][maxn];
ll f[maxn][maxn];
ll dp[maxn][maxn];
struct Edge{
    ll v,next;
}e[maxn<<1];
ll cnt=0;
void add(ll u,ll v){
    e[cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(ll u,ll fa,ll root){
    sz[root][u]=1;
    f[root][u]=fa;
    for(ll i=head[u];~i;i=e[i].next){
        ll v=e[i].v;
        if(v==fa)continue;
        dfs(v,u,root);
        sz[root][u]+=sz[root][v];
    }
}
ll solve(ll i,ll j){
    if(dp[i][j]!=-1)return dp[i][j];
    if(i==j)return dp[i][j]=0;
    return dp[i][j]=sz[i][j]*sz[j][i]+max(solve(f[i][j],i),solve(f[j][i],j));
}
int main(){
    memset(head,-1,sizeof(head));
    memset(dp,-1,sizeof(dp));
    ll n;
    scanf("%lld",&n);
    for(ll i=1;i<n;i++){
        ll u,v;
        scanf("%lld%lld",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(ll i=1;i<=n;i++){
        dfs(i,-1,i);
    }
    ll ans=0;
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=n;j++){
            ans=max(ans,solve(i,j));
        }
    }
    cout<<ans<<endl;
}
发布了29 篇原创文章 · 获赞 4 · 访问量 676

猜你喜欢

转载自blog.csdn.net/qq_44290978/article/details/104061143