Codeforces Round #524 (Div. 2) C. Masha and two friends

C. Masha and two friends

题目链接https://codeforc.es/contest/1080/problem/C

题意:

给出一个黑白相间的n*m的矩阵,现在先对一个子矩阵颜色变为白色,然后再对一个子矩阵颜色变为黑色,问最终白色格子和黑色格子有多少?

题解:

定义w(a,b)为(1,1)到(a,b)中白色的数量,通过观察找规律可以发现w(a,b)=((b+1)/2)*((a+1)/2)+(b/2)*(a/2)。

然后b(a,b)就是格子总数量减去w(a,b)。

现在对于一个子矩阵里面黑色和白色格子数量就比较容易求了。

再来分析两次变化颜色,主要时两个子矩阵交叉时,由于这里给出坐标的大小关系,所以(max(x1,x3),max(y1,y3))与(min(x2,x4),min(y2,y4))即为交叉矩阵的两个端点。

存在交叉矩阵时,黑色的数量会加上交叉矩阵中黑色的格子的数量,白色的数量会减去交叉矩阵中黑色格子的数量(结合前两次变化思考),最后直接求解即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll ;
int t;

ll w(ll a,ll b){
    return ((b+1)/2)*((a+1)/2)+(b/2)*(a/2);
}
ll sub_w(ll x1,ll y1,ll x2,ll y2){
    return w(x2,y2)-w(x1-1,y2)-w(x2,y1-1)+w(x1-1,y1-1);
}
ll sub_b(ll x1,ll y1,ll x2,ll y2){
    return (x2-x1+1)*(y2-y1+1)-sub_w(x1,y1,x2,y2);
}
int main(){
    scanf("%d",&t);
    while(t--){
        ll n,m,x1,x2,x3,x4,y1,y2,y3,y4;
        cin>>n>>m>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
        ll sub_x1 = max(x1,x3),sub_y1=max(y1,y3),sub_x2=min(x2,x4),sub_y2=min(y2,y4);
        ll num_w = w(n,m),num_b = n*m - num_w;
        num_w+=sub_b(x1,y1,x2,y2);num_b-=sub_b(x1,y1,x2,y2);
        num_b+=sub_w(x3,y3,x4,y4);num_w-=sub_w(x3,y3,x4,y4);
        if(sub_x1<=sub_x2 && sub_y1<=sub_y2){
            num_b+=sub_b(sub_x1,sub_y1,sub_x2,sub_y2);
            num_w-=sub_b(sub_x1,sub_y1,sub_x2,sub_y2);
        }
        cout<<num_w<<" "<<num_b<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/heyuhhh/p/10017351.html

时间: 2024-08-02 04:53:08

Codeforces Round #524 (Div. 2) C. Masha and two friends的相关文章

Codeforces Round #524 (Div.2)题解

题解 CF1080A [Petya and Origami] 这道题其实要我们求的就是 \[\lceil 2*n/k \rceil + \lceil 5*n/k \rceil + \lceil 2*n/k \rceil\] 然后就做完了 # include <bits/stdc++.h> # define ll long long int main() { ll n, k; scanf("%lld%lld", &n, &k); ll ans = ((2 *

Codeforces Round #524 (Div. 2) B. Margarite and the best present

B. Margarite and the best present 题目链接:https://codeforces.com/contest/1080/problem/B 题意: 给出一个数列:an=(-1)n,之后有询问,问 [l,r] 之间的ai和为多少. 题解:这个分情况讨论一下就可以了,区间长度的奇偶数丶左端点的奇偶数. 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include

Codeforces Round #524 (Div. 2) codeforces 1080A~1080F

目录 codeforces1080A codeforces 1080B codeforces 1080C codeforces 1080D codeforces 1080E codeforces 1080F codeforces1080A 传送门:https://codeforces.com/contest/1080/problem/A 题意:制造一份邀请函需要2份a物品,5份b物品,8份c物品,一个盒子里面有k份物品(可以为a或b或c)问你制造n份邀请函需要用多少个盒子 题解:直接加起来就行

Codeforces Round #524 (Div. 2)D - TV Shows

题意是给你n个节目,每次租一台电视需要消耗x+(r-l)*y元,问你怎么样安排才能使得看完所有节目并且消费最少,输出最少的金额 做法是按节目开始时间l排序,遍历所有节目,如果该节目不能在已有的电视上播放或者在已有的电视上播放消耗比再去借一台更多的时候, 那么就再去借一台电视机,当有多个电视机可以播放的时候,贪心选择r最大的电视机.由于是按l升序排序,当(tv[i].l-r)*y>x的时候则表明此时 用已有的电视机播放不如再去借一台,而剩下的l只会更大,所以要erase当前的电视机,否则会超时.P

Codeforces Round #524 (Div. 2)

好不容易考完电路,又可以回来刷题了,只是现在恐怕码力连新生都比不上了. A Petya and Origami 开头就是一大水题,意思就是制作一张贺卡需要几张什么颜色的纸,一共做n份,一叠纸有k张纸,问你需要几叠纸. 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int main() 5 { 6 int n,k; 7 scanf("%d%d",&n,&k); 8 p

Codeforces Round #524 (Div. 2) F

题解: 首先这个东西因为强制在线区间查询 所以外面得套线段树了 然后考虑几条线段怎么判定 我们只需要按照右端点排序,然后查询的时候查找最右节点的前缀最大值就可以了 然后怎么合并子区间信息呢 (刚开始我很zz的觉得应该要线段树合并..) 线段树都保证了区间一样大每个点暴力也就会算log次.. 于是就直接暴力合并就好了 复杂度$nlog^2$ 然后因为是cf题..完全不管常数 成功跑了luogu倒数rank1 代码: #include <bits/stdc++.h> using namespace

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我