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 守恒
本文来自博客园,作者:whrwlx,转载请注明原文链接:https://www.cnblogs.com/whrwlx/p/18498861