A. Park Lighting

公园是一张n行m列的长方形桌子,桌子的格子是正方形,格子之间的边界是街道。外部边界也是街道。每条街道的长度都是1。例如,n=m=2的公园有12条街道。

你可以在街道中间放灯笼。这盏灯在它附近亮两个正方形(如果它位于公园的边界上,则只亮一个正方形)。

判断一下奇偶分类讨论即可

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#define form(i,n) for(int i=1;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
typedef pair<int,int> P ;
const int N=1e5;
typedef unsigned long long ull;
typedef long long ll;
const int MAX_N=1e5+20;
struct node{
    int x,y;
};
int n,m;
int main(){
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while (T--){
        ll ans=0;
        cin>>n>>m;
        if(n%2==0&&m%2==0){
            cout<<n*m/2<<endl;
        }else if(n&1&&m%2==0){
            cout<<m/2*n<<endl;
        }else if(m&1&&n%2==0){
            cout<<n/2*m<<endl;
        }else{
            cout<<n/2*m+m/2+1<<endl;
        }
    }
}

B. Maria Breaks the Self-isolation

有n个人在屋子里

你可以一次叫出很多个人 这些人出来的时候可以相互看到 也可以看到院子里已经有的人
第i个人出来时必须看到包括玛利亚但不包括自己的至少ai个人 

问最多院子里能有多少个人(包括玛利亚)

阅读理解题,这里注意一下最后算人的时候要算上玛利亚本人,而之前不算

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#define form(i,n) for(int i=1;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
typedef pair<int,int> P ;
const int N=1e5;
typedef unsigned long long ull;
typedef long long ll;
const int MAX_N=1e5+20;
struct node{
    int x,y;
};
int n,m;
ll a[N];
int main(){
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while (T--){
        cin>>n;
        ll in=0;
        ll rd=1;
        forn(i,n){
            cin>>a[i];
        }
        sort(a,a+n);
        for(int i=0;i<n;i++){
            if(a[i]<=in+rd){
                in=in+rd;
                rd=1;
            }else{
                rd++;
            }
        }
        cout<<in+1<<endl;
    }
}

C. Celex Update

给你这样的一个格子 给你两个坐标 
从第一个坐标移动到第二个坐标 每次只能向下或向右
每遇到一个数字就把这个数字加到自己的sum里

问最后可获得多少种sum

一开始做这题:这不就是在总共m+n-1里随便选m个位置的组合问题吗
Time limited
哦,1e9,那天晚上脑子抽了居然关心的不是时间复杂度而是大整数并决定用py...

题解借用官方的一张图

每次往右会比往下少1,最大是下到底再右,最小是右到底再下,所以答案是x+y+1

#include <bits/stdc++.h>
#define form(i,n) for(int i=1;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
typedef pair<int,int> P ;
const int N=1e5;
typedef unsigned long long ull;
typedef long long ll;
const int MAX_N=1e5+20;
ll x,y,xx,yy;
int n,m;
ll a[1000][1000];
int main(){
    ios::sync_with_stdio(0);
    cin>>n;
    while (n--){
        cin>>x>>y>>xx>>yy;
        x=xx-x;
        y=yy-y;
        cout<<x*y+1<<endl;
    }
}

D. The Best Vacation

有n个月 每个月d天 日期是1 2 3 ……d 给x天 问从哪天开始走,走x天 日期的和最大

可以从今年跨越到明年 

取到最大值的时候结尾必须要在每个月的月底那天,所以我们枚举每个月底

然后用前缀和维护 二分查询 时间复杂度o(nlogn)


#include <bits/stdc++.h>
#define form(i,n) for(int i=1;i<=n;i++)
#define forn(i,n) for(int i=0;i<n;i++)
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
typedef pair<int,int> P ;
const int N=1e5;
typedef unsigned long long ull;
typedef long long ll;
const int MAX_N=4e5+20;
ll m,n,x,y,xx,yy,ans;
ll d[N];
int main(){
scanf("%lld%lld", &n, &m);
for (ll i = 1; i <= n; i++){
scanf("%lld", d + i);
d[i + n] = d[i];
}
n = n * 2;
ll l = 1;
ll len = 0, nw = 0;
for (ll i = 1; i <= n; i++){
len += d[i];
nw += d[i] * (d[i] + 1) / 2;
while (len > m){
len -= d[l];
nw -= d[l] * (d[l] + 1) / 2;
l++;
}
if (l > 1) ans = max(ans, nw + (d[l - 1] + d[l - 1] - (m - len) + 1) * (m - len) / 2);
else ans = max(ans, nw);
}
printf("%lld\n", ans);
return 0;
}