10.13~20 代码源 2024 CSP-S 模拟赛 Day 15~20

有几天没打

DAY 15

  • T1 写的暴力,然后赛后发现是二分
  • T2 也不知道咋想的逆天贪心,然后第一发 \(97\) 第二发 \(100\)
  • T3 T4 没看
T2 の 逆天贪心(DMY SPJ 太水,全输出 1 能过……)
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fd(i,a,b) for(int i=(a);i<=(b);i=-~i)
#define bd(i,a,b) for(int i=(a);i>=(b);i=~-i)
#define db(x) cout<<"DEBUG "<<#x<<" = "<<x<<endl;
using namespace std;

const int N=2e5+509,M=1e6+509,mod=998244353;

//让尽量多的重叠区间个数 >=k 的区间有 k 种颜色

struct Line
{
	int x,flag,id;
	friend bool operator<(Line x,Line y)
	{
		return (x.x==y.x&&x.flag<y.flag)||(x.x<y.x);
		//如果左右端点在一点,右端点放前边
	}
}line[N<<1];
int c[N],ans,tot,n,k;
priority_queue<int> col;//未使用过的颜色
queue<int> wil;//待定的区间

inline void paintl(int id)
{
	if(col.empty()) wil.push(id);//没颜色了,待定
	else c[id]=col.top(),col.pop();//涂上颜色
}

inline int r1k() {return ((rand()^rand())*rand()%k+rand())%k+1;}
inline void paintr(int id)
{
	if(c[id]) col.push(c[id]);//把用过的颜色收回
	else c[id]=r1k();//没有分配颜色,没有贡献,随便涂
}

inline void work()
{
	while((!col.empty())&&(!wil.empty()))
	{
		int p=wil.front();wil.pop();
		if(c[p]) continue;
		//可能有待定的被涂上了
		c[p]=col.top();col.pop();
		//剩的颜色给待定的
	}
}

signed main()
{
// #define FJ
#ifdef FJ
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
#else
	// freopen("ex_A3.in","r",stdin);
	// freopen("A.out","w",stdout);
#endif
	
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	srand(time(0));
	srand(rand()+20090509);
	
	cin>>n>>k;
	fd(i,1,n)
	{
		int l,r;cin>>l>>r;
		line[++tot]={l,1,i};
		line[++tot]={r,-1,i};
		c[i]=0;
	}
	
	bd(i,k,1) col.push(i);
	sort(line+1,line+tot+1);
	
	fd(i,1,tot)
	{
		if(col.empty()) ans+=line[i].x-line[i-1].x;
		//为空,该点到上一个点之间被覆盖过 k 次
		if(line[i].flag==1) paintl(line[i].id);
		else paintr(line[i].id);
		work();
	}

	cout<<ans<<'\n';
	fd(i,1,n) cout<<c[i]<<' ';
	
	return 0;
}

DAY 16

老师没让打,但是还是看了看

然后 T1 写了个二分+DP,然后 \(70\)

另外 \(30\) 是链,也不知道怎么卡掉我的……

加个特判然后是最优解了()

对比一下时间和码风,可以发现这位改都没改

AC Code
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define fd(i,a,b) for(int i=(a);i<=(b);i=-~i)
#define bd(i,a,b) for(int i=(a);i>=(b);i=~-i)
#define db(x) cout<<"DEBUG "<<#x<<" = "<<x<<endl;
using namespace std;

const int N=1e5+509,M=1e13,mod=998244353;

int n,k,r1,r2;
int a[N],b[N];
bool fl=0;

struct edge{int y,a,b;};
vector<edge> e[N];

namespace SubI
{
    int siz[N],f[N][32],c[32],ans;
    int l=1,r;

    void dfs(int x,int fa,int mid)
    {
        fd(i,0,k) f[x][i]=1e18;
        f[x][0]=siz[x]=0;
        for(auto now:e[x])
        {
            int y=now.y,a=now.a,b=now.b;
            if(y==fa) continue;
            dfs(y,x,mid);
            fd(i,0,min(siz[y]+siz[x]+1,k)) c[i]=1e18;
            fd(i,0,min(siz[y],k))
            {
                fd(j,0,min(siz[x]+siz[y]+1,k)-i)
                {
                    if(f[x][j]+f[y][i]+a<=mid) c[j+i+1]=min(c[j+i+1],max(f[x][j],f[y][i]+a));
                    if(f[x][j]+f[y][i]+b<=mid) c[j+i]=min(c[j+i],max(f[x][j],f[y][i]+b));
                }
            }
            siz[x]+=siz[y]+1;
            fd(i,0,min(siz[x],k)) f[x][i]=c[i];
        }
    }

    inline bool check(int x)
    {
        dfs(n/2,0,x);
        if(f[n/2][k]<=x) return 1;
        return 0;
    }

    inline void Main()
    {
        r=min((r1+r2)/3,M);
        while(l<=r)
        {
            int mid=(((r-l)>>1)+l);
            if(check(mid)) r=mid-1,ans=mid;
            else l=mid+1;
        }
        cout<<ans;
        exit(0);
    }
}

namespace SubII
{
    int fl=1,ad[N],sumb;
    inline void Main()
    {
        fd(i,1,n-1) ad[i]=(a[i]-b[i]),sumb+=b[i];
        sort(ad+1,ad+n);
        fd(i,1,k) sumb+=ad[i];
        cout<<sumb;
        exit(0);
    }
}

signed main()
{
// #define FJ
#ifdef FJ
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#else
    // freopen("A.in","r",stdin);
    // freopen("A.out","w",stdout);
#endif
    
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

	cin>>n>>k;
	fd(i,1,n-1)
	{
		int x,y;cin>>x>>y>>a[i]>>b[i];
		e[x].push_back({y,a[i],b[i]});
		e[y].push_back({x,a[i],b[i]});
		r1+=max(a[i],b[i]),r2+=min(a[i],b[i]);
        fl|=(x!=y-1);
	}

    if(!fl) SubII::Main();
    else SubI::Main();

    return 0;
}

DAY 18

  • T1 想了一个小时发现 \(d\le 1\) 然后 dfs A 了
  • T2 很容易想到一个贪心(正解就是贪心),但是我的假了
  • T3 T4 没看

DAY 19

  • T1 也是贪心,但是题没看完就开始想,然后浪费很多时间,然后贪心 \(>\) 写成 \(<\) 假了,但是大样例过了(水死了,然后很多人 T1 都挂了)
  • T2 写的 \(35\) 分的,但是加一个记忆化 \(35->65\),然后改成预处理再优化一下就 \(100\)
  • T3 T4 没看

DAY 20

最后一场了……

  • T1 发现 \(n,m=400\)\(T \le 6\) 而不是题上给的 \(T \le 200\),因为 \(\sum nm\le 1e6\),然后写了个 \(n^2m\) 的贪心和一个暴力,但是贪心假了,然后改改贪心,用 bitset 优化一下就 A 了
  • T2 T3 T4 没看

总结

没啥可说的了,还是要平衡心态,多对拍,然后认真审题

希望 RP 守恒

posted @ 2024-10-24 09:31  whrwlx  阅读(13)  评论(0编辑  收藏  举报