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 ", ans);
return 0;
}