NOIP day -1 笔记

考前打云斗的模拟赛练一下手,比赛链接

T1

二分答案+差分,每次二分都模拟出一个差分数组来找到要求最严格的值,总时间复杂度为 \(O(n\log(a+k))\)

AC Code
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define endll " "
#define pb push_back
#define eb emplace_back
#define pii pair<int,int>
#define lowbit(x) x&(-x)
#define fi first
#define se second
#define iv inline void
#define it inline int 
#define ib inline bool
#define fre(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#ifndef ONLINE_JUDGE
#pragma GCC optimize(0)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#endif
using namespace std;
const int MAXN=500050;
const int INF=0x3f3f3f3f;
const int mod=998244353;
it gcd(int x,int y){return y==0?x:gcd(y,x%y);}
it lcm(int x,int y){return x/gcd(x,y)*y;}
it max(int x,int y){return x>y?x:y;}
it min(int x,int y){return x<y?x:y;}
it ksm(int x,int m,int mod) 
{
    int res=1,bas=x%mod;
    while(m)
    {
        if(m&1) res=(res*bas)%mod;
        bas=(bas*bas)%mod,m>>=1;
    }
    return res%mod;
}
int n,m,cnt,tot,ans,sum,l,r,x,y,z,head[MAXN],k,c,a[MAXN],mn=INF,add[MAXN];
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());
bool check(int mx)
{
	memset(add,0,sizeof(add));
	int sum=0,res=0,val;
	for(int i=1;i<=n;i++)
	{
		sum+=add[i];
		val=mx-sum-a[i];
		if(val>0)
		{
			sum+=val;
			add[i+c]-=val;
			res+=val;
		}
		if(res>k)
			return 0;
	}
	return 1;
}
signed main()
{
	//fre("");
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k >> c;
	for(int i=1;i<=n;i++)
		cin >> a[i];
	l=1,r=INF;
	while(l<=r)
	{
		int mid=(l+r) >> 1;
		if(check(mid))
			l=mid+1;
		else
			r=mid-1;
	}
	cout<<r;
	return 0;
}

T2

挺有趣的树论题,本质上是计算连通块大小的差分,考虑构建一个假树,即最大生成树的合并树,这样对于每一条边的贡献,就是 \((siz_u-siz_v)^2\) 之后 \(dfs\) 统计每个点的子树贡献

AC Code
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define endll " "
#define pb push_back
#define eb emplace_back
#define pii pair<int,int>
#define lowbit(x) x&(-x)
#define fi first
#define se second
#define iv inline void
#define it inline int 
#define ib inline bool
#define fre(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#ifndef ONLINE_JUDGE
#pragma GCC optimize(0)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#endif
using namespace std;
const int MAXN=500050;
const int INF=0x3f3f3f3f;
const int mod=998244353;
it gcd(int x,int y){return y==0?x:gcd(y,x%y);}
it lcm(int x,int y){return x/gcd(x,y)*y;}
it max(int x,int y){return x>y?x:y;}
it min(int x,int y){return x<y?x:y;}
it ksm(int x,int m,int mod) 
{
    int res=1,bas=x%mod;
    while(m)
    {
        if(m&1) res=(res*bas)%mod;
        bas=(bas*bas)%mod,m>>=1;
    }
    return res%mod;
}
mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count());
int n,m,cnt,tot,ans,sum[MAXN],l,r,x,y,z,head[MAXN],u,v,w,fa[MAXN],siz[MAXN],f[MAXN];
vector<int> h[MAXN];
struct edge
{
	int u,v,w;
}e[MAXN];
int find(int x)
{
	if(x==fa[x])
		return x;
	return fa[x]=find(fa[x]);
}
void merge(int u,int v)
{
	u=find(u),v=find(v);
	if(u==v)
		return;
	fa[u]=v;
	siz[v]+=siz[u];
}
void solve()
{
	for(int i=1;i<=m;i++)
	{
		int u=e[i].u,v=e[i].v,w=e[i].w;
		u=find(u),v=find(v);
		if(u==v)
			continue;
		if(f[u]==w+1 && f[v]==w+1)
		{
			merge(v,u);
			for(int k:h[v])
				h[u].pb(k);
		}
		else if(f[u]==w+1)
		{
			merge(v,u);
			h[u].pb(v);
		}
		else if(f[v]==w+1)
		{
			merge(u,v);
			h[v].pb(u);
		}
		else
		{
			cnt++;
			merge(u,cnt+n);
			merge(v,cnt+n);
			h[n+cnt].pb(u);
			h[n+cnt].pb(v);
			f[n+cnt]=w+1;
		}
		if(siz[n+cnt]==n)
			return;
	}
}
void query(int u)
{
	for(int v:h[u])
	{
		sum[v]=sum[u]+(siz[u]-siz[v])*(siz[u]-siz[v]);
		query(v);
	}
}
bool cmp(edge x,edge y)
{
	return x.w>y.w;
}
signed main()
{
	//fre("");
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		cin >> u >> v >> w;
		e[i]={u,v,w};
	}
	for(int i=1;i<=2*n;i++)
	{
		fa[i]=i;
		if(i<=n)
			siz[i]=1;
		else
			siz[i]=0;
	}
	sort(e+1,e+m+1,cmp);
	solve();
	int root=find(1);
	sum[root]=0;
	query(root);
	for(int i=1;i<=n;i++)
		cout<<sum[i]<<endll;
	return 0;
}
posted @ 2025-11-28 20:50  KLaneX  阅读(0)  评论(0)    收藏  举报