CF Round #524 (Div. 2)

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
题目链接:https://codeforces.com/contest/1080

A题

题意:一个请帖需要2个红色,5个绿色,8个蓝色。一个notebook包含了k个相同的颜色。问最少需要多少个notebook能制作n和请帖

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int MOD = 1e9+7;
ll n,k;
int main(){
	cin>>n>>k;
	ll ans = 0;
	ans += (n*2)%k? n*2/k+1:n*2/k;
	ans += (n*5)%k? n*5/k+1:n*5/k;
	ans += (n*8)%k? n*8/k+1:n*8/k;
	cout<<ans;
	return 0;
}

B题

题意:序列 − 1 , 2 , − 3 , 4 , − 5 , 6... -1,2,-3,4,-5,6... 1,2,3,4,5,6...问从第L个数加到第R个数的和是多少?

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int MOD = 1e9+7;
ll q,l,r,ans;
int main(){
	cin>>q;
	fo(i,1,q){
		cin>>l>>r;
		if(l==r){
			if(l&1)cout<<-l<<endl;
			else cout<<l<<endl;
		}else{
			if(l&1){
				if(r&1){
					ans = -r + (r-l)/2;
				}else{
					ans = (r-l+1)/2;
				}
			}else{
				if(r&1){
					ans = -(r-l+1)/2;
				}else{
					ans = r - (r-l)/2;
				}
			}
			cout<<ans<<endl;
		} 
	}
	
	return 0;
}

C题

题意:有一个黑白棋盘,把其中一个矩阵全涂白,再把其中一个矩阵全涂黑,输出剩下的黑白个数
解法:要考虑融斥,也就是有部分矩阵先被涂白了又被涂黑了
一份不简洁的代码,还有一份简洁的代码

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;

int t;
ll n,m,a1,b1,c1,d1,a2,b2,c2,d2;
ll wh = 0, bk = 0;
// 黑涂白 
void tu1(ll a, ll b, ll c, ll d){ //白 
	ll t1 = (c-a)+1;
	ll t2 = (d-b)+1;
	ll sum = t1*t2;
	if(((a&1)&&(b&1)) || !(a&1)&&!(b&1)){ // 白多点 
		if(sum&1){ // 白多 
			wh += sum/2;
			bk -= sum/2;
		}else{
			wh += sum/2;
			bk -= sum/2;
		}
	}else{ // 黑多点 
		if(sum&1){// 黑多 
			wh += sum/2+1;
			bk -= sum/2+1;
		}else{
			wh += sum/2;
			bk -= sum/2;
		} 
	}
}
// 白涂黑 
void tu2(ll a, ll b, ll c, ll d){ //涂黑 
	ll t1 = (c-a)+1;
	ll t2 = (d-b)+1;
	ll sum = t1*t2;
	if(((a&1)&&(b&1)) || !(a&1)&&!(b&1)){ // 白多点 
		if(sum&1){ // 白多 
			wh -= sum/2+1;
			bk += sum/2+1;
		}else{
			wh -= sum/2;
			bk += sum/2;
		}
	}else{ // 黑多点 
		if(sum&1){// 黑多 
			wh -= sum/2;
			bk += sum/2;
		}else{
			wh -= sum/2;
			bk += sum/2;
		} 
	}
}
// 把原来黑被涂白的再次涂黑 
void tu3(ll a, ll b, ll c, ll d){ //白 
	ll t1 = (c-a)+1;
	ll t2 = (d-b)+1;
	ll sum = t1*t2;
	// 奇奇,偶偶,可简化为相加为偶 
	if(((a&1)&&(b&1)) || !(a&1)&&!(b&1)){ // 白多点 
		if(sum&1){ // 白多 
			wh -= sum/2;
			bk += sum/2;
		}else{
			wh -= sum/2;
			bk += sum/2;
		}
	}else{ // 黑多点 
		if(sum&1){// 黑多 
			wh -= sum/2+1;
			bk += sum/2+1;
		}else{
			wh -= sum/2;
			bk += sum/2;
		} 
	}
}
void solve(){
	if((n&1)&&(m&1)){
		wh = n*m/2 +1;
		bk = n*m/2;
	}else{
		wh = bk = n*m/2;
	}
	// 计算相交矩阵
	ll X1 = max(a1,a2); ll Y1 = max(b1,b2);
	ll X2 = min(c1,c2); ll Y2 = min(d1,d2);	
	if(X2>=X1 && Y2>=Y1){
		tu1(a1,b1,c1,d1);// 黑涂白 
		tu2(a2,b2,c2,d2);// 白涂黑 
		tu3(X1,Y1,X2,Y2);// 把原来黑被涂白的再次涂黑
	}else{
		tu1(a1,b1,c1,d1);
		tu2(a2,b2,c2,d2);
	}
	cout<<wh<<" "<<bk<<endl; 
}
int main(){
	cin>>t;
	while(t--){
		ll ax,ay,bx,by,cx,cy,dx,dy;
		cin>>n>>m;
		cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy;
		a1 = min(ax,bx); b1 = min(ay,by);
		c1 = max(ax,bx); d1 = max(ay,by);
		a2 = min(cx,dx); b2 = min(cy,dy);
		c2 = max(cx,dx); d2 = max(cy,dy);
		solve();
	} 	
	return 0;
}

简洁的

#include<bits/stdc++.h>
using namespace std;
#define ALL(X) X.begin(),X.end()
typedef long long ll;
ll N,M;
ll ASWH(ll r1,ll c1,ll r2,ll c2) // 计算白色有多少个 
{
    return ((r2-r1+1)*(c2-c1+1)+((r1+c1)%2==0))/2;
}
ll ASBH(ll r1,ll c1,ll r2,ll c2) // 黑色数=总数减去白色数 
{
    if(r1>r2||c1>c2)return 0;
    return (r2-r1+1)*(c2-c1+1)-ASWH(r1,c1,r2,c2);
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>N;
    for(ll i=1;i<=N;i++)
    {
        ll RR,CC,r1,r2,c1,c2,r3,r4,c3,c4;
        cin>>RR>>CC>>r1>>c1>>r2>>c2>>r3>>c3>>r4>>c4;
        ll W=ASWH(1,1,RR,CC); // 总共的白色数 
        W+=ASBH(r1,c1,r2,c2); // 加上涂白的黑色数 
        W-=ASWH(r3,c3,r4,c4); // 剪去涂黑的白色数 
        W-=ASBH(max(r1,r3),max(c1,c3),min(r2,r4),min(c2,c4)); // 减去相交矩阵的白色数 
        cout<<W<<' '<<RR*CC-W<<'\n';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值