ABC366
A
link
判断一下少的那个人加上剩下的所有票是否会超过另一个人,如果超过,不确定,否则目前票多的必胜。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
signed main(){
int n,a,b;
cin >> n >> a >> b;
int s = n-a-b;
if(a < b){
if(a+s > b){
cout << "No";
}
else cout << "Yes";
}
else{
if(b+s > a){
cout << "No";
}
else cout << "Yes";
}
return 0;
}
B
link
我并没有看下面讲解只看了描述(竖线中的)
略一看样例便可知道,是一列一列从下往上输出,对于一列,如果这个位置有字符,输出,否则,如果后面(也就是上面)还有字符,输出一个*
,否则break
。
那么我们可以存一下每一列最靠后的字符(也就是最靠上的字符),如果超出了这个,就结束。
别忘了存一下最大长度。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s[105];
int w[105],mx;
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i){
cin >> s[i];
int sn = s[i].length();
if(sn > mx) mx = sn;
for(int j = 0;j < s[i].length();++ j)
w[j] = (w[j] == 0)?i:w[j];
}
for(int i = 0;i < mx;++ i){
for(int j = n;j >= 1&&j >= w[i];-- j){
int sn = s[j].length();
if(sn <= i) cout << '*';
else cout << s[j][i];
}
cout << endl;
}
return 0;
}
C
link
我觉得C<B
开一个桶,如果是一个新的,个数加一,如果减没了,个数减一。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int q;
int x,tp;
int bucket[1000005],sum;
signed main(){
cin >> q;
for(int i = 1;i <= q;++ i){
cin >> tp;
if(tp == 1){
cin >> x;
bucket[x]++;
if(bucket[x] == 1) sum++;
}
else if(tp == 2){
cin >> x;
bucket[x]--;
if(bucket[x] == 0) sum--;
}
else cout << sum << endl;
}
return 0;
}
D
link
三维前缀和。这里提供两种思考方式。
直接想三维前缀和
考虑类比二位前缀和的容斥原理,脑补一下,反正我没脑补出来图,奇加偶减(具体可以学习一下容斥原理),那么就有
这个容斥原理的适用于所有维前缀和。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int n;
int q;
int a[105][105][105];
int qzh[105][105][105];
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i)
for(int j = 1;j <= n;++ j)
for(int k = 1;k <= n;++ k){
cin >> a[i][j][k];
qzh[i][j][k] = qzh[i-1][j][k]+qzh[i][j-1][k];
qzh[i][j][k] += qzh[i][j][k-1];
qzh[i][j][k] -= qzh[i-1][j-1][k];
qzh[i][j][k] -= qzh[i-1][j][k-1];
qzh[i][j][k] -= qzh[i][j-1][k-1];
qzh[i][j][k] += qzh[i-1][j-1][k-1]+a[i][j][k];
}
cin >> q;
while(q--){
int li,ri,lj,rj,lk,rk;
cin >> li >> ri >> lj >> rj >> lk >> rk;
int ans = qzh[ri][rj][rk];
ans -= qzh[li-1][rj][rk];
ans -= qzh[ri][lj-1][rk];
ans -= qzh[ri][rj][lk-1];
ans += qzh[li-1][lj-1][rk];
ans += qzh[li-1][rj][lk-1];
ans += qzh[ri][lj-1][lk-1];
ans -= qzh[li-1][lj-1][lk-1];
cout << ans << endl;
}
return 0;
}
考虑分层
考虑按高度分层,分
这个思路只是一时兴起,但是是降维作用的。
神奇的代码
#include<bits/stdc++.h>
using namespace std;
int n;
int q;
int a[105][105][105];
int qzh[105][105][105];
signed main(){
cin >> n;
for(int i = 1;i <= n;++ i){
for(int j = 1;j <= n;++ j){
for(int k = 1;k <= n;++ k){
cin >> a[i][j][k];
qzh[i][j][k] = qzh[i-1][j][k]+qzh[i][j-1][k];
qzh[i][j][k] -= qzh[i-1][j-1][k];
qzh[i][j][k] += a[i][j][k];
}
}
}
for(int i = 1;i <= n;++ i)
for(int j = 1;j <= n;++ j)
for(int k = 1;k <= n;++ k)
qzh[i][j][k] += qzh[i][j][k-1];
cin >> q;
while(q--){
int li,ri,lj,rj,lk,rk;
cin >> li >> ri >> lj >> rj >> lk >> rk;
int ans = qzh[ri][rj][rk]-qzh[ri][rj][lk-1];
int jian = qzh[ri][lj-1][rk]-qzh[ri][lj-1][lk-1];
ans -= jian;
jian = qzh[li-1][rj][rk]-qzh[li-1][rj][lk-1];
ans -= jian;
jian = qzh[li-1][lj-1][rk]-qzh[li-1][lj-1][lk-1];
ans += jian;
cout << ans << endl;
}
return 0;
}
E
link
我们把它当做一个数学题,光考虑式子,不考虑图形。
首先
先把
问题就转化为了求
枚举了
神奇的代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,d;
int x[200005],y[100005];
int f[1000005],g[1000005];
int ans;
void suan(int a[],int w[]){
sort(a+1,a+1+n);
a[0] = -2e6,a[n+1] = 2e6+1;
int q = 0,h = 0;
for(int i = 1;i <= n;++ i) h += a[i];
for(int i = 0;i <= n;++ i){
if(i) q += a[i],h -= a[i];
for(int j = a[i];j < a[i+1];++ j){
int x = (2*i-n)*j-q+h;
if(x <= d) w[x]++;
}
}
}
signed main(){
cin >> n >> d;
for(int i = 1;i <= n;++ i) cin >> x[i] >> y[i];
suan(x,f);suan(y,g);
for(int i = 1;i <= d;++ i) g[i] += g[i-1];
for(int i = 0;i <= d;++ i) ans += f[i]*g[d-i];
cout << ans;
return 0;
}
F
link
首先考虑顺序问题,假设就是把这简单推理一下。
首先考虑一下从
到 (这里我们说从什么到什么默认是从里到外)的顺序答案是什么。先以 个的为例, ,拆括号, ,看出规律了吗? (这个式子十分没有用,看前面那个足矣)。
考虑和 的顺序对答案的影响,先考虑它们的顺序对哪几项有影响(我们对项的标号以 的 为准,第一项我们标为第 项,我们可以认为 ),发现只有第 项和第 项受影响, 之前的没有 和 ,有 和 交换后不受影响, 之后的 和 的 和 就都不含了,也没有影响, 和 项只看 就肯定会受影响。交换后本来 乘的变成了 乘,本来 乘的变成了 乘,肯定会受影响。(有点啰嗦。。。)
再看受了啥影响。之前的是,后来的是 ( 和 换一下),如果前面的小于后面的那么换了就更优( ),但是这个式子太长了,化简一下。
首先把约掉, ,这个时候已经可以排序了(写在 函数里),但是我继续化简了一下, 。
那么现在我们只要在这个顺序里选
考虑
神奇的代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int f[200005][15];
struct nd{
int a,b;
}x[200005];
bool cmp(nd l,nd r){
return l.b*(r.a-1) > r.b*(l.a-1);
}
signed main(){
cin >> n >> k;
for(int i = 1;i <= n;++ i)
cin >> x[i].a >> x[i].b;
sort(x+1,x+1+n,cmp);
f[0][0] = 1;
for(int i = 1;i <= n;++ i){
for(int j = 0;j <= min(i,k);++ j){
f[i][j] = f[i-1][j];
if(j)
f[i][j] = max(f[i][j],f[i-1][j-1]*x[i].a+x[i].b);
}
}
cout << f[n][k];
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!