首页 > 其他分享 >Codeforces Round #821 (Div. 2) D E

Codeforces Round #821 (Div. 2) D E

时间:2022-09-21 22:23:53浏览次数:83  
标签:return min int Codeforces dfs Div 821 qwq define

E

首先发现无论何时,每个位置上至多只会有一个球。原因:每个时刻每个球都会移动,所以移动到某个点的时间一定,自然出生时间也一定,显然不可能会有 2 个点出生时间相同。

既然如此,假如 \(t\) 时刻某个位置有一个,那么显然它会在下个时刻到达 \(a\) 方向的点,那么下一个点到达这个位置的话,它会去与 \(a\) 相反的方向。这一步很厉害啊!要是分析到的话基本十拿九稳了。

那么既然如此,显然记录前缀时间在某个位置的球数前缀和之后 \(O(n^2)\) 转移。

这一步的思考来源于直接记录某个时刻的肯定不行,考虑前缀时刻的相减性,以及前缀时间的可转移性。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define il inline
using namespace std;
const int N=123;
int a[N][N],b[N][N],n=120;

il int CEIL(int x) {
	if(x%2==0) return x/2;
	return x/2+1; 
}

il int FLOOR(int x) {
	return x/2;
}

int sol(int t,int x,int y) {
//	cout<<"nex\n";
	int qwq=x-1+y-1,s=t-qwq;
	if(s<0) {
		return 0;
	}
//	cout<<qwq<<" "<<s<<" "<<t<<" "<<x<<" "<<y<<'\n';
	memset(a,0,sizeof(a));
	a[1][1]=s+1;
//	for(int i=1;i<=x;i++)
//		for(int j=1;j<=y;j++) b[i][j]=0;
//	for(int nw=1;nw<=qwq;nw++) {
//		memset(b,0,sizeof(b));
		for(int i=1;i<=x;i++) {
			for(int j=1;j<=y;j++) {
				a[i][j+1]+=(a[i][j]+1)/2;
				a[i+1][j]+=a[i][j]/2;
//				a[i][j]+=b[i][j];
			}
		}
//		++a[1][1];
//	}
	return a[x][y];
}

void solve() {
	int t,x,y; cin>>t>>x>>y;
	++x; ++y;
	if(sol(t,x,y)!=sol(t-1,x,y)) cout<<"YES\n"; else cout<<"NO\n";
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) solve();
	return 0;
} 

D

分析操作,典型套路确定每个位置操作奇偶性。

考虑显然最后有合法方案的当且仅当偶数个奇。

显然奇偶这个操作只会在为了 2 个奇使用相邻变换时使用。

偶偶显然废的。

所以仅考虑奇奇即可,即保留所有需要操作奇数的位置。我们发现假如相邻操作花费更少,这个的上界是确定的,我们一定可以通过 4 个分一组来实现全用这种操作。

否则的话,考虑一定当前剩余的是一段区间,不妨设挖空区间中间的 2 个,显然不会更优之类的。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int N=5002;
bool a[N],b[N];
int n,cx,cy,vec[N],f[N][N],tot;

inline int get(int x,int y) {
	bool fl=0;
	if(abs(x-y)==1) fl=1;
	x=vec[x]; y=vec[y];
	if(x>y) swap(x,y);
	if(x+1==y) return min(cx,2*cy);
	int qwq=cy;
	if(fl) qwq=min(qwq,1ll*(y-x)*cx);
	return qwq;
}

int dfs(int l,int r) {
	if(~f[l][r]) return f[l][r];
	if(l>r) return 0;
	int qwq=(int)(2e18);
	qwq=min(qwq,dfs(l+2,r)+get(l+1,l));
	qwq=min(qwq,dfs(l+1,r-1)+get(r,l));
	qwq=min(qwq,dfs(l,r-2)+get(r-1,r));
//	cout<<l<<" "<<r<<" "<<qwq<<'\n';
	return f[l][r]=qwq;
}

void sol() {
	cin>>n>>cx>>cy;
	for(int i=1;i<=n;i++) {
		char ch; cin>>ch; a[i]=ch-'0';
	}
	for(int i=1;i<=n;i++) {
		char ch; cin>>ch; b[i]=ch-'0';
	}
	tot=0;
	for(int i=1;i<=n;i++) {
		if(a[i]!=b[i]) {
			vec[++tot]=i;
//			cout<<i<<' ';
		}
	}
	if(tot&1) {
		cout<<"-1\n"; return ;
	}
	for(int i=0;i<=n;i++)
		for(int j=0;j<=n;j++)
			f[i][j]=-1;
//	cout<<get(1,4)<<' '<<get(2,3)<<" mmm "<<get(1,3)<<'\n';
	if(cy<=cx&&tot>2) {
		cout<<(tot/2)*cy<<'\n'; return ;
	} 
	cout<<dfs(1,tot)<<"\n";
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) sol();
	return 0;
} 

标签:return,min,int,Codeforces,dfs,Div,821,qwq,define
From: https://www.cnblogs.com/xugangfan/p/16717366.html

相关文章

  • Educational Codeforces Round 119 E
    E.ReplacetheNumbers开始想到了一个二分的做法好像是O(nlog)的后来才想了一下可以在两个数组之间反复横跳那我是不是像记忆化搜索一样记录一个路径即可我们记录f[i]......
  • 监听div高度宽度的变化-自定义指令
    上篇内容说到,iframe嵌入其他项目页面,iframe实现自适应高度需要监听div页面高度的变化使用到了局部自定义指定directives:{//使用局部注册指令的方式resize:{//......
  • Codeforces Round #818 (Div. 2) - D. Madoka and The Corruption Scheme
    思维+组合数学Problem-D-Codeforces题意有\(2^n\)个人进行锦标赛,编号1~\(2^n\),每一场输的人失去比赛资格,赢的人继续。Madoka可以选择他们进行的顺序,以及决定哪一......
  • 在 CSS 中使 div 居中的 5 种方法
    在CSS中使div居中的5种方法5waystocenteradivinCSS你觉得很难在CSS中将div居中吗?你并不孤单,我的兄弟,许多开发人员有时会在将div居中时感到困惑,包括......
  • 220821岳麓山腰线全程计划
    岳麓山腰线全程(11.78KM)本线路为岳麓山山腰线路,环线,有四个起步点均可开始徒步或者越野。本线路适合想体验岳麓山超过十公里线路的森林徒步的爱好者,山野因景区护林时间较长,......
  • Codeforces 821 Div2
    T1:大小为n的数组,最多进行k次操作:下标模k意义下相等则可进行交换。求操作后连续k个元素的最大值固定最大值的k个连续因素小标为[0,k),现在只需使得它为最大即可,将可交换位......
  • img和div之间有间隙的原因及解决方法
    div中存在img标签,由于img标签的display:inline-block属性。#####display:inline-block布局的元素在chrome下会出现几像素的间隙,原因是因为我们在编辑器里写代码的......
  • CF 821
    B:n个人比赛,比赛规则,1,2比赛,胜者与3比赛,再胜者与4比赛,一次类推,最后得到冠军。故必定进行n-1次比赛,游戏结束。现在给定x,y,表示对于其中任何一个人,此人赢了x场或输了y场,问......
  • Codeforces Round #821 (Div. 2) - D2. Zero-One (Hard Version)
    区间DPProblem-D2-Codeforces题意给一个长度为\(n(5<=n<=5000)\)的01串,每次操作可选择一个\(l,r(l<r)\),把\(s[l],s[r]\)反转。如果\(l+1==r\),花费为x,否......
  • Codeforces Round #807 (Div. 2) - D. Mark and Lightbulbs
    思维Problem-D-Codeforces题意给两个长度为\(n(3<=n<=2*10^5)\)的01串s与t,求最小操作次数,使s变成t;不存在则输出-1操作为:对于2<=i<=n-1,若\(s_......