「模拟赛」暑期集训CSP提高模拟3(7.20)
1.「模拟赛」高一下三调5.13(附关于二分图匈牙利建边的详细思考)2.模拟赛3.「模拟赛」CSP提高组模拟1(7.14)4.「模拟赛」暑期集训CSP提高模拟5(7.22)5.「模拟赛」暑期集训CSP提高模拟4(7.21)
6.「模拟赛」暑期集训CSP提高模拟3(7.20)
7.「模拟赛」暑期集训CSP提高模拟2(7.19)8.CSP 集训(9.23-9.26)9.「模拟赛」暑期集训CSP提高模拟17(8.10)10.「模拟赛」暑期集训CSP提高模拟15(8.7)11.「模拟赛」暑期集训CSP提高模拟14(8.6)12.「模拟赛」暑期集训CSP提高模拟11(7.29)13.「模拟赛」暑期集训CSP提高模拟10(7.28)14.joke 学长出题比赛记录15.「模拟赛」暑期集训CSP提高模拟6(7.23)16.CSP 联训 217.CSP 联训 318.「模拟赛」多校 A 层联训 8(更新 T3)19.「模拟赛」CSP-S 模拟 11(T2 超详细)20.「模拟赛」多校 A 层联训 521.「模拟赛」多校 A 层联训 4(卖品:CTH)22.【小 w 的代数】(打什么 n^3,提供一种 n log 的解法)23.「模拟赛」多校 A 层联训 9仍在施工...
B 题挂了 45 分,不然可以 AC 两道题的,呜
题目列表:
A.abc猜想
题意:
给定三个正整数
赛时分析:
大概十天之前 和 GGrun:做过做过这个
,于是十分钟切了。
正解:
求
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a, b, c;
ll qpow(ll x, ll y, ll mod){
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod;
y >>= 1;
}
return ans;
}
signed main(){
// freopen("in.in", "r", stdin); freopen("out.out", "w", stdout);
scanf("%lld%lld%lld", &a, &b, &c);
ll ans = qpow(a, b, c * c) / c;
ans = ans % c;
printf("%lld", ans);
return 0;
}
B.简单的排列最优化题
题意:
对长度为
现在给定长度为
赛时分析:
上来想半天没想到什么正解,于是决定先打上暴力
正解:
枚举移位的位数
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 4e6 + 10;
int n, a[N];
int sm_0, bi_0, b_s[N];
ll sum;
signed main(){
// freopen("in.in", "r", stdin); freopen("out.out", "w", stdout);
scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
sum += (long long)abs(a[i] - i);
if(a[i] - i < 0) sm_0++;
else{
bi_0++;
if(a[i] != n) b_s[a[i]-i]++;
}
}
int ansid = 0; ll ans = sum;
for(int k=1; k<n; k++){
if(a[n-k+1] >= n) bi_0--;
if(a[n-k+1] < n) sm_0--;
bi_0 -= b_s[k-1]; sm_0 += b_s[k-1];
sum = sum + sm_0 - bi_0 + abs(a[n-k+1] - 1) - abs(a[n-k+1] - n);
if(a[n-k+1] != n) b_s[a[n-k+1]-1+k]++;
if(a[n-k+1] < 1) sm_0++;
if(a[n-k+1] >= 1) bi_0++;
if(sum < ans){
ans = sum, ansid = k;
}
}
printf("%d %lld", ansid, ans);
return 0;
}
C.简单的线性做法题
D.简单的线段树题
正解:
雀氏线段树,我们发现对于每一棵树,最多开平方到 1 以后便一直为 1,我们在只需维护一个区间总和,当区间总和等于区间大小时,那么该区间内所有数都为 1,不再需要递归更新,直接返回即可。
code:
#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N = 4e6 + 10, N1 = 1e6 + 10;
int n, m;
ll a[N1];
namespace Segment_tree
{
#define lson rt<<1
#define rson rt<<1|1
ll sum[N];
void pushup(int rt){
sum[rt] = sum[lson] + sum[rson];
}
void build(int rt, int l, int r){
if(l == r){
sum[rt] = a[l];
return;
}
int mid = l + r >> 1;
build(lson, l, mid);
build(rson, mid+1, r);
pushup(rt);
}
void update(int rt, int l, int r, int ql, int qr){
if(l == r){
sum[rt] = sqrt(sum[rt]);
return;
}
if(sum[rt] == r - l + 1) return;
int mid = l + r >> 1;
if(ql <= mid) update(lson, l, mid, ql, qr);
if(qr > mid) update(rson, mid+1, r, ql, qr);
pushup(rt);
}
ll find(int rt, int l, int r, int ql, int qr){
if(ql <= l and r <= qr){
return sum[rt];
}
int mid = l + r >> 1; ll ans = 0;
if(ql <= mid) ans += find(lson, l, mid, ql, qr);
if(qr > mid) ans += find(rson, mid+1, r, ql, qr);
return ans;
}
}
signed main(){
// freopen("in.in", "r", stdin); freopen("out.out", "w", stdout);
scanf("%lld", &n);
for(int i=1; i<=n; i++){
scanf("%lld", &a[i]);
}
Segment_tree::build(1, 1, n);
scanf("%lld", &m);
for(int i=1; i<=m; i++){
int op, l, r;
scanf("%lld%lld%lld", &op, &l, &r);
if(op == 1){
printf("%lld\n", Segment_tree::find(1, 1, n, l, r));
}
else{
Segment_tree::update(1, 1, n, l, r);
}
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡