【CodeFores 999 (div3) 】 A B C E[scc + 缩点 ] F[DP]

A Mishka and Contest

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int N = (int) 1e5 + 11;
const int M = (int) 1e6 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int PI = acos(-1.0);

int A[N];
int main(){
    int n,m; scanf("%d%d",&n,&m);
    int l = 0, r = n - 1;
    int sum = 0;
    for(int i=0;i<n;i++) scanf("%d",&A[i]);

    for(int i=0;i<n;i++){
        if(A[i]>m){ l = i; break; }
    }
    for(int i=n-1;i>=0;i--){
        if(A[i]>m){
            r = i;break;
        }
    }
    if(r==n-1 && l==0 &&A[0]<=m&&A[n-1]<=m) printf("%d\n", n);
    else printf("%d\n", n-(r-l)-1);
    return 0;
}

B Reversing Encryption

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int N = (int) 1e5 + 11;
const int M = (int) 1e6 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;


vector<int>ve;
void get(int n){
    for(int i = n; i >= 1 ; i--){
        if(n % i == 0) {
            ve.push_back(i);
        //  printf("%d \n", i);
        }
    }
     sort(ve.begin(), ve.end());
}

int main(){
    int n; scanf("%d", &n);
    get(n);
    string s; cin>> s;
    for(int i = 0; i < ve.size(); i++){
        int v = ve[i];
        reverse(s.begin(), s.begin() + v);
    }

    cout<< s<<"\n";
    return 0;
} 

C Alphabetic Removals

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int N = (int) 4e5 + 11;
const int M = (int) 1e6 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;


vector<int> ve[N];
int vis[N];
int main(){
    int n, k; scanf("%d%d", &n, &k);
    string s; cin>>s;
    for(int i = 0; s[i]; i++){
        ve[s[i] - 'a'].push_back(i);
    }
    for(int i = 0; i < 26; i++){
        for(int j = 0; j < ve[i].size(); j++){
            int pos  = ve[i][j];
            vis[pos] = 1;
            k --;
            if(k == 0) break;
        }
        if(k  == 0 )break;
    } 
    for(int i = 0; s[i]; i++){
        if(!vis[i]) printf("%c", s[i]);
    }
    return 0;
} 

E Reachability from the Capital ##

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#define CLR(a,b) memset((a),(b),sizeof(a))
#define inf 0x3f3f3f3f
#define mod 100009
#define LL long long
#define M   11000
#define ll o<<1
#define rr o<<1|1
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
using namespace std;
void read(int &x){
    x=0;char c;
    while((c=getchar())<'0');
    do x=x*10+c-'0';while((c=getchar())>='0');
}
struct Edge {
    int from,to,next;
}edge[M];
int head[M],top;
int n,m;
vector<int>G[M];
vector<int >scc[M];
int scc_cnt,dfs_clock;
int low[M],dfn[M],in[M],out[M];
stack<int>S;int Instack[M];
int sccno[M];
void init()
{
    top=0;
    memset(head,-1,sizeof(head));
    while(!S.empty()) S.pop();
}
void addedge(int a,int b)
{
    Edge e={a,b,head[a]};
    edge[top]=e; head[a]=top++;
}
void getmap()
{
    int i,j;int a,b;
    for(i=0;i<m;i++)
    {
        read(a);read(b);
        addedge(a,b);
    }
}
void tarjan(int now)
{
    int nexts;
    low[now]=dfn[now]=++dfs_clock;
    S.push(now);Instack[now]=1;
    for(int i=head[now];i!=-1;i=edge[i].next)
    {
        Edge e=edge[i];
        if(!dfn[e.to])
        {
          tarjan(e.to);
          low[now]=min(low[e.to],low[now]);
        }
        else if(Instack[e.to])
        low[now]=min(low[now],dfn[e.to]);
    }
    if(dfn[now]==low[now]) 
    {
        scc_cnt++;
        scc[scc_cnt].clear();
        for(;;)
        {
        nexts=S.top();S.pop();Instack[nexts]=0;
        sccno[nexts]=scc_cnt;
        scc[scc_cnt].push_back(nexts);
        if(nexts==now) break;
        }
    }
}
void find_cut(int le,int ri)
{
    memset(low,0,sizeof(low));
    memset(dfn,0,sizeof(dfn));
    memset(Instack,0,sizeof(Instack));
    memset(sccno,0,sizeof(sccno));
    scc_cnt=dfs_clock=0;

    for(int i=le;i<=ri;i++)
    if(!dfn[i]) tarjan(i);
}
void suodian()
{
    int i,j;
    for(i=1;i<=scc_cnt;i++) G[i].clear(),in[i]=0,out[i]=0;
    for(i=0;i<top;i++)
    {
        int u=sccno[edge[i].from];
        int v=sccno[edge[i].to];
        if(v!=u) 
        {
            G[u].push_back(v);
            in[v]++;out[u]++;  // 统计新点的入度和出度
        }
    }
}

 /* 以上是scc + 缩点代码   */

int s;
bool vis[M];
void dfs(int now){
    vis[now] = 1;
    for(int i = 0; i < G[now].size(); i++){
        int v = G[now][i];
        if(!vis[v]) dfs(v);
    } 
}
void solve(){
    dfs(sccno[s]);
    int cnt = 0;
    for(int i = 1; i <= scc_cnt; i++){
        if(!vis[i] && !in[i]) {
             cnt++; dfs(i);  
        }
    }

    printf("%d\n", cnt);
}
int main()
{
    scanf("%d%d%d", &n, &m, &s);
    init();
    getmap();
    find_cut(1,n);
    suodian();
    solve();

    return 0;
}

F Cards and Joy

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int N = (int) 500 + 11;
const int M = (int) 5000 + 11;
const int mod = (int) 1e9 + 7;
const int inf = 0x3f3f3f3f;


map<int, int> cnt, ge;
map<int, int> ::iterator it;
int h[N];
ll dp[M][N];

ll solve(ll k, ll x, ll y){ // 喜欢数字val(随意)的人有x个,本序列总共有y个val,每个人最多选k个
   for(int i = 0; i <= y; i++){
        for(int j = 0; j <= x; j++){
            dp[i][j] = 0;
        }
   }
    //  递推不动当时 TAT 
   for(int i = 1; i <= y; i++){
        for(int j = 1; j <= x; j++){
            for(int u = 1; u <= i && u <= k; u++){
                dp[i][j] = max(dp[i][j], dp[i - u][j - 1] + h[u]);
            }
        }
   }

   return dp[y][x];
}

int main(){

    ll n, k; scanf("%lld%lld", &n, &k);

    for(int i = 0; i < n * k; i++){
        int val; scanf("%d", &val);
        cnt[val]++;
    }
    for(int  i = 0; i < n; i++){
        int f;scanf("%d", &f);
        ge[f] ++;
    }
    for(int i = 1; i <= k; i++) scanf("%d", &h[i]);

    ll ans = 0;
    for(it = ge.begin(); it != ge.end(); it++){
         ans += solve(k, it->second, cnt[it->first]);
    }

    printf("%lld", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37383726/article/details/80794354