CF622

CF622A

实际上就是找到 \(n\) 包含的所有完整的序列 然后删去 剩下的 \(n\) 就是答案

这个直接暴力做就行 或者我们发现前 \(x\) 个序列总长度为 \(x(x+1)/2\)

那么找到最大的 \(x\) 满足 \(x(x+1)/2<n\) 二分/解方程均可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long 
#define int ll
#define endl '\n'
const int N=2e2+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return x*f;
}
inl void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n;
bool ed;
signed main(){
    n=read();
    int l=0,r=1e9,ans;
    while(l<=r){
        int mid=l+r>>1;
        if(mid*(mid+1)<n*2)ans=mid,l=mid+1;
        else r=mid-1;
    }
    writel(n-ans*(ans+1)/2);
    return 0;
}

CF622B

这题真没啥可说的。直接模拟就行。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long 
#define int ll
#define endl '\n'
const int N=2e2+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return x*f;
}
inl void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n;
bool ed;
signed main(){
    int x=(getchar()-'0')*10+(getchar()-'0');getchar();
    int y=(getchar()-'0')*10+(getchar()-'0');
    int n=read();
    y+=n;x+=(y/60);y%=60;x%=24;
    printf("%02d:%02d",x,y);
    return 0;
}

CF622C

只想到了莫队怎么说。

维护 \(pos_i\) 表示颜色和当前点 \(i\) 相同的左侧最远位置

对于每个询问 考虑 \(r\) 颜色是否为 \(x\) 不是的话直接选 否则看是否 \(pos_r<=l\) 是则一定没有答案 否则答案为 \(pos_r-1\)

CF622D

稍微转换一下形式: \(s=\sum\limits_{i=1}^n(n-i)\times\left\vert d_i-(n-i)\right\vert\)

显然 对于每个 \(i\) 放到距离为 \(n-i\) 的两个地方最优

那么 \(1\) 可以放到 \(1,n\)\(2\) 放到 \(n+1,n\times2-1\)\(3\) 放到 \(2,n-1\)......

对于 \(n\) 由于 \(n-i\) 等于0 塞到剩下的两个位置即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long 
#define int ll
#define endl '\n'
const int N=1e6+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return x*f;
}
inl void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n,m,a[N],pos[N],lp,rp,llp,rrp;
bool ed;
signed main(){
    n=read();
    lp=1,rp=n,llp=n+1,rrp=(n<<1)-1;
    for(int i=1;i<=n-1;i++){
        if(i&1){
            a[lp++]=a[rp--]=i;
        }else a[llp++]=a[rrp--]=i;
    }
    if(n&1)a[lp]=a[n<<1]=n;
    else a[llp]=a[n<<1]=n;
    for(int i=1;i<=(n<<1);i++)writei(a[i]);
    return 0;
}

CF622E

首先 发现根节点与其他节点不同 蚂蚁可以一次进入多个 最后答案就是根节点各子树的最大答案

对于每个子树 我们可以求出每个节点的深度 那么每个叶子在不用等着的情况下 答案就是他的深度

考虑把叶子深度从小到大排序 看当前答案(深度)与前一个是否冲突 如果矛盾改为前一个答案加1

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define inl inline
#define ll long long 
#define endl '\n'
const int N=1e6+5;
const int M=1e5+5;
const int inf=0x3f3f3f3f;
const int base=131;
const int mod=998244853;
inl int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return x*f;
}
inl void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
inl void writei(int x){write(x);putchar(' ');}
inl void writel(int x){write(x);putchar(endl);}
bool st;
int n,m,dep[N],tim[N],res;
vector<int>v;
int head[N],to[N],nxt[N],cnt;
inl void add(int u,int v){
    nxt[++cnt]=head[u];
    to[cnt]=v;
    head[u]=cnt;
}
inl void dfs(int x,int fa){
    int son=0;dep[x]=dep[fa]+1;
    for(int i=head[x];i;i=nxt[i]){
        int y=to[i];
        if(y==fa)continue;
        dfs(y,x);son=1;
    }
    if(!son)v.push_back(dep[x]);
}
bool ed;
signed main(){
    n=read();
    for(int i=1;i<=n-1;i++){
        int u=read(),v=read();
        add(u,v);add(v,u);
    }
    for(int i=head[1];i;i=nxt[i]){
        int y=to[i];v.clear();
        dfs(y,1);
        sort(v.begin(),v.end());
        tim[0]=v[0];
        for(int i=1;i<v.size();i++){
            if(v[i]<=tim[i-1])tim[i]=max(v[i],tim[i-1]+1);
            else tim[i]=max(v[i],tim[i]);
        }
        res=max(res,tim[v.size()-1]);
    }
    writel(res);
    return 0;
}

CF622E

不会数学。

posted @ 2023-11-20 07:24  xiang_xiang  阅读(7)  评论(0编辑  收藏  举报