D2 求 hack
  • 板块题目总版
  • 楼主__vector__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/26 01:01
  • 上次更新2024/8/26 01:51:02
查看原帖
D2 求 hack
507348
__vector__楼主2024/8/26 01:01

赛时没调出来.....
wa on #2
可能有点难看懂,希望有大佬能给个 hack。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
template<class T>
void ckmx(T& a,T b){
    a=max(a,b);
}
template<class T>
void ckmn(T& a,T b){
    a=min(a,b);
}
template<class T>
T gcd(T a,T b){
    return !b?a:gcd(b,a%b);
}
template<class T>
T lcm(T a,T b){
    return a/gcd(a,b)*b;
}
#define gc getchar()
#define eb emplace_back
#define pc putchar
#define ep empty()
#define fi first
#define se second
#define pln pc('\n');

const int maxn=3e5+5;
int n,m;
vi seq[maxn];
int l[maxn];
pii get(vi& seq){
    map<int,int> vis;
    for(int& v:seq){
        vis[v]=1;
    }
    int mex=0;
    while(vis[mex])mex++;
    int semex=mex+1;
    while(vis[semex])semex++;
    return mkpr(mex,semex);
}
ll gas(ll fir,ll _ed){
    return (fir+_ed)*(_ed-fir+1)/2ll;
}
struct Disc{
    int disc[maxn*2],top;
    void add(int x){
        disc[++top]=x;
    }
    void bd(){
        sort(disc+1,disc+top+1);
        top=unique(disc+1,disc+top+1)-disc-1;
    }
    int rk(int x){
        return lower_bound(disc+1,disc+top+1,x)-disc;
    }
    int val(int x){
        return disc[x];
    }
    void init(){
        top=0;
    }
}disc;
int up[maxn],dw[maxn];
map<int,int> spe_calc;
vi g[maxn*2];
int ind[maxn*2];
void solve(int id_of_test){
	scanf("%lld%lld",&n,&m);
    FOR(i,1,n){
        scanf("%lld",&l[i]);
        FOR(j,1,l[i]){
            int nw;
            scanf("%lld",&nw);
            seq[i].eb(nw);
        }
       auto tmp=get(seq[i]);
       dw[i]=tmp.fi;
       up[i]=tmp.se;
       disc.add(dw[i]);
       disc.add(up[i]);
    }
    disc.bd();
    FOR(i,1,n){
        dw[i]=disc.rk(dw[i]);
        up[i]=disc.rk(up[i]);
        g[up[i]].eb(dw[i]);
        ind[dw[i]]++;
    }
    queue<int> q;
    FOR(i,1,disc.top){
        if(!ind[i]){
            q.push(i);
            spe_calc[disc.val(i)]=disc.val(i);
        }
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        int dpu=spe_calc[disc.val(u)];
        for(int& v:g[u]){
            ind[v]--;
            ckmx(spe_calc[disc.val(v)],dpu);
            if(!ind[v]){
                q.push(v);
            }
        }
    }
    int global_mx=0;
    map<int,int> dwct;
    FOR(i,1,n){
        if(dwct.find(dw[i])!=dwct.end()){
            ckmx(dwct[dw[i]],max(disc.val(up[i]),spe_calc[disc.val(up[i])]));
            ckmx(global_mx,dwct[dw[i]]);
        }
        ckmx(dwct[dw[i]],max(disc.val(up[i]),spe_calc[disc.val(up[i])]));
    }
    ll ans;
    //printf("globalmx = %d\n",global_mx);
    if(global_mx>=m){
        ans=(ll)global_mx*ll(m+1);
    }else{
        ans=(ll)global_mx*ll(global_mx+1ll)+gas(global_mx+1,m);
    }
    for(auto [x,val]:spe_calc){
      //  printf("%d: %d\n",x,val);
        ans-=(ll)max(x,global_mx);
        ans+=(ll)max(max(x,global_mx),val);
    }
    printf("%lld\n",ans);
    // clear
    FOR(i,1,n){
        seq[i].clear();
    }
    FOR(i,1,disc.top){
        g[i].clear();
        ind[i]=0;
    }
    disc.init();
    spe_calc.clear();
}
signed main()
{
	int T;
	scanf("%lld",&T);
	FOR(_,1,T){
		solve(_);
	}
	return 0;
}

2024/8/26 01:01
加载中...