Manthan, Codefest 18 (rated, Div. 1 + Div. 2)(A~F)

A

a n s = l o g 2 ( x ) + 1
自行证明

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
int main()
{
    int n = read();
    int sum = 0;
    while(n) n/=2,sum++;
    printf("%d\n",sum);
    return 0;
}

B

贪心的把中间的变成中位数即可

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
ll ans;
int a[201000];
int main()
{
    int n = read() , k = read();
    rep(i,1,n) a[i] = read();
    sort(a+1,a+n+1);
    int pl = n/2+1;
    if(a[pl] < k)
    {
        for(int i = pl+1;i <= n;++i)
        {
            if(a[i] < k) ans += k-a[i];
            else break;
        }
        ans += k - a[pl];
    }
    else 
    {
        for(int i = pl-1;i >= 1;--i)
        {
            if(a[i] > k) ans += a[i] - k;
        }
        ans += a[pl]-k;
    }
    cout<<ans;
    return 0;
}

C

易发现
只有交换两个相邻不合法且不同的会比逐个翻转优秀
把相邻不合法且不同的交换后其余的翻转即可

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
ll ans;
int a[201000];
int main()
{
    int n = read() , k = read();
    rep(i,1,n) a[i] = read();
    sort(a+1,a+n+1);
    int pl = n/2+1;
    if(a[pl] < k)
    {
        for(int i = pl+1;i <= n;++i)
        {
            if(a[i] < k) ans += k-a[i];
            else break;
        }
        ans += k - a[pl];
    }
    else 
    {
        for(int i = pl-1;i >= 1;--i)
        {
            if(a[i] > k) ans += a[i] - k;
        }
        ans += a[pl]-k;
    }
    cout<<ans;
    return 0;
}

D

其实直接模拟就可以了。。
很多大佬根据各种东西判断然后FST了

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
int n;
int dep[201000];
int linkk[201000] , t;
int f[201000];
int son[201000];
bool vis[201000];
struct node{
    int n , y;
}e[401000];
void insert(int x,int y)
{
    e[++t].y = y;e[t].n = linkk[x];linkk[x] = t;
    e[++t].y = x;e[t].n = linkk[y];linkk[y] = t;
}
void dfs(int x,int fa)
{
    f[x] = fa;
    dep[x] = dep[fa] + 1;
    rept(i,x)
        if(e[i].y != fa)
            dfs(e[i].y,x),son[x]++;
}
int a[201000];
queue<int>q;
int main()
{
    n = read();
    rep(i,1,n-1)
    {
        int x = read() , y = read();
        insert(x,y);
    }
    dfs(1,0);
    rep(i,1,n) a[i] = read();
    rep(i,2,n) if(dep[a[i]] < dep[a[i-1]]) {printf("No");return 0;}
    q.push(a[1]);
    int i = 2;
    while(!q.empty())
    {
        int x = q.front();q.pop();
        rep(j,1,son[x]) 
            if(f[a[i+j-1]] != x) {printf("No");return 0;}
            else q.push(a[i+j-1]);
        i += son[x];
    }
    printf("Yes");
    return 0;
}

E

从后往前做
每次把度数小于k的删掉并把邻接的点度数–即可

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
int linkk[201000] , t , du[201000];
int n , m , k;
int ans[201000];
struct node{
    int n , x , y;
    bool flag;
}e[401000];
void insert(int x,int y)
{
    e[++t].y = y;e[t].x = x;e[t].n = linkk[x];linkk[x] = t;du[y]++;
    e[++t].y = x;e[t].x = y;e[t].n = linkk[y];linkk[y] = t;du[x]++;
}
bool inq[201000];
int sum;
queue<int>q;
void dele(int x)
{
    if(!inq[x])
    {
        du[x]--;
        if(du[x] < k) inq[x] = true,sum--,q.push(x);
    }
}
int main()
{
    n = read();m = read();k = read();t = 1;
    sum = n;
    rep(i,1,m)
    {
        int x = read() , y = read();
        insert(x,y);
    }
    rep(i,1,n) if(du[i] < k) q.push(i),inq[i] = true,sum--;
    while(!q.empty())
    {
        int x = q.front();
        rept(i,x) if(!e[i].flag){dele(e[i].y);e[i].flag = e[i^1].flag = true;}
        q.pop();
    }
    ans[m] = sum;
    if(sum != 0)
    {
        repp(i,m,2)
        {
            int x = e[2*i].x , y = e[2*i].y;
            if(!e[2*i].flag){dele(x);dele(y);e[2*i].flag = e[(2*i)^1].flag = true;}
            while(!q.empty())
            {
                int xx = q.front();
                rept(j,xx) if(!e[j].flag){dele(e[j].y);e[j].flag = e[j^1].flag = true;}
                q.pop(); 
            }
            if(sum == 0) break;
            ans[i-1] = sum;
        }
    }
    rep(i,1,m) printf("%d\n",ans[i]);
    return 0;
}

F

数学题推式子即可

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long long
const int p = 1e9+7;
int n , k;
int L[1001000] , R[1001000];
int a[1001000];
int ans;
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
stack<int>q;
int main()
{
    n = read();k = read();
    rep(i,1,n) a[i] = read();
    rep(i,1,n)
    {
        while(!q.empty() && a[i] > a[q.top()]) q.pop();
        if(q.empty()) L[i] = 1;
        else L[i] = q.top()+1;
        q.push(i);
    }
    while(!q.empty()) q.pop();
    repp(i,n,1)
    {
        while(!q.empty() && a[i] >= a[q.top()]) q.pop();
        if(q.empty()) R[i] = n;
        else R[i] = q.top()-1;
        q.push(i);
    }
    k--;
    rep(i,1,n)
    {
        int x = i - L[i] , y = R[i] - i;
        if(x > y) swap(x,y);
        int N = x/k , M = y/k , H = (x+y)/k;
        ans=ans+(1ll*N*(N+1)/2*k%p+N)*a[i]%p;ans%=p;
        ans=ans+(1ll*(x+1)*(M-N)%p)*a[i]%p;ans%=p;
        ans=ans+(1ll*(x+y+1ll)*(H-M)%p)*a[i]%p;ans%=p;
        ans=ans-((H-M)*(H+M+1LL)/2*k%p)*a[i]%p;ans%=p;
        ans %= p;
    }
    ans = (ans + p)%p;
    printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/a1035719430/article/details/82349517