牛客周赛85 DEF

不行了,活不了了
我怎么那么菜:(

D

题意:

枚举1~n的前缀将其删除后,问是否能选定一个后缀使其删除后序列变为双生串

思路:

这题暴力能过你敢信?

void solve(){
    int n;cin>>n;string s;cin>>s;
    s=" "+s;
    int cnt=0;
    for(int i=1;i<=n;i++){
        int cur=0;
        for(int j=i+1;j<=n;j++){
            if(s[j]=='0')cur^=1;else cur^=2;
            if(cur==0){
                cnt++;break;
            }
        }
    }
    double ans=cnt*1.0/n;
    cout<<fixed<<setprecision(15)<<ans<<endl;
}

说是01串状态太少O(n方)实际是O(n)
吐了🤮
后来写出真正O(n)的解:
对于字符串的每一位先预处理记录其前缀拥有的0,1子串的奇偶情况
0->00:0偶,1偶
1->01:0偶,1奇
2->10:0奇,1偶
3->11:0奇,1奇
用二进制数来代替状态
将4个状态数存在一个表中
当真正要删除前缀时,枚举1~n
当此时的状态在表中至少有两处存在,(比如此时:0偶,1偶,后面也有0偶,1偶的状态)
说明将其删除后,可以通过删除后缀达成条件
注意答案精度要15位小数点

map<int,int>mp;
void solve(){
	int n;cin>>n;string s;cin>>s;
	int prea=0,preb=0;
	for(int i=0;i<n;i++){
		prea+=(s[i]=='0')?1:0;
		preb+=(s[i]=='0')?0:1;
		int p=prea%2,q=preb%2;
		int state=(p<<1)+q;
		mp[state]++;
	}
	prea=0,preb=0;
	int cnt=0;
	for(int i=0;i<n;i++){
		prea+=(s[i]=='0')?1:0;
		preb+=(s[i]=='0')?0:1;
		int p=prea%2,q=preb%2;
		int state=(p<<1)+q;
		mp[state]--;
		if(mp[state]>0){
			cnt++;
		}
	}
	double ans=cnt*1.0/n;
	cout<<fixed<<setprecision(15)<<ans<<endl;
}

E

构造,发现当一处有至少三条线段相交时一定不满足涂色条件
所以至多有两条线段相交
把紫色线段和红色线段的编号分别存在两个集合A,B中
我们尽可能多地能涂紫就涂紫
发现当前遍历到的线段左端点比紫色线段最大右端点小后,这就相交了,于是就要把它涂成红色
能不能涂成红色呢?同样的,如果它的左端点比红色线段最大右端点小,那么也相交,输出-1退出
反之,就把它放到红色线段集合中
实现方面主要需要按左端点为第一关键字排序,然后才是右端点
顺便一提,数据好像也是水的,直接把集合A,B最末尾的线段右端点当作两个集合的最大右端点也能过

struct node{
	int l,r;int id;
	bool operator<(const node& a)const{
		if(a.l!=l)return l<a.l;
		return r<a.r;
	}
};
void solve(){
	int n;cin>>n;
	vector<node>interval(n);
	for(int i=0;i<n;i++){
		cin>>interval[i].l>>interval[i].r;
		interval[i].id=i+1;
	}
	sort(interval.begin(),interval.end()); 
	vector<pii>a,b;
	int ar=0,br=0;
	a.pb({interval[0].r,interval[0].id});
	ar=interval[0].r;
	for(int i=1;i<n;i++){
		int left=interval[i].l;
		if(left>ar){
		a.pb({interval[i].r,interval[i].id});
		ar=max(ar,interval[i].r);}
		else{
			if(!b.size()){
			b.pb({interval[i].r,interval[i].id});
			br=interval[i].r;}
			else{
				if(left<=br){
					cout<<-1<<endl;return;
				}else{
					b.pb({interval[i].r,interval[i].id});
					br=max(br,interval[i].r);
				}
			}
		}
	}
	cout<<a.size()<<endl;
	for(int i=0;i<a.size();i++){
		cout<<a[i].se<<' ';
	}
}

F

题意:

染色至多k个节点,问最大连通块的最小值

思路:

二分最大连通块的大小,如果check到了,说明还能更小,否则需要更大
check函数的具体逻辑:
我们至多用k次机会让一个节点染色,所以贪心的想从根往下深搜,当当前节点u的连通块大小:cnt[u]大于了mid,说明要耗费一次机会让其cnt[u]=0(即染色)
(意思其实是贪心从叶子节点往上的节点如果大于mid直接染色,不过连通块代码是dfs因此无法这样至底向上实现)
看是否需要染色的节点数大于k

vector<int>e[maxn];
int cnt[maxn];
int need,n,k;
void dfs(int mid,int u,int fa){
	for(int v:e[u]){
		if(v==fa)continue;
		dfs(mid,v,u);
		cnt[u]+=cnt[v];
	}
	if(cnt[u]>mid){
		need++;
		cnt[u]=0;
	}
}
bool check(int mid){
	for(int i=1;i<=n;i++)cnt[i]=1;
	dfs(mid,1,0);
	if(need>k)return false;
	return true;
}
void solve(){
	cin>>n>>k;
	for(int i=1;i<=n-1;i++){
		int u,v;cin>>u>>v;
		e[u].pb(v);e[v].pb(u);
	}
	int l=0,r=maxn;
	int res=0;
	while(l<=r){
		int mid=l+r>>1;
		need=0;
		if(check(mid)){
			r=mid-1;res=mid;
		}else{
			l=mid+1;
		}
	}
	cout<<res<<endl;
}

我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....我好菜.....

posted @ 2025-03-17 16:58  Marinaco  阅读(3)  评论(0)    收藏  举报
//雪花飘落效果