暑期cspj模拟赛2
已结束
ACM/ICPC
开始于: 2025-7-17 16:15
24
小时
主持人:
7
暑期cspj模拟赛2
T1
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
//特判
if(a == 1)
{
cout << 1 << endl;
return 0;
}
long long x = 1;
for(int i = 1;i <= b;i++) //模拟幂运算的过程
{
x *= a;
if(x > 1e9)
{
cout << -1 << endl;
return 0;
}
}
cout << x << endl;
return 0;
}
T2
#include <bits/stdc++.h>
using namespace std;
int main(int argc, const char * argv[]) {
long long k;
scanf("%lld",&k);
while (k--) {
long long n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
long long PsubQ = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
long long PaddQ = n - e * d + 2;
long long P = (PsubQ + PaddQ) / 2;
long long Q = PaddQ - P;
if (P * Q == n && e * d == (P - 1) * (Q - 1) + 1 && P && Q) {
printf("%lld %lld\n",min(P, Q),max(P, Q));
}else {
printf("NO\n");
}
}
return 0;
}
T3
#include <bits/stdc++.h>
using namespace std;
#define N (int)1e6 + 100
char str[N];
int c1[N];
int c2[N];
int l1[N];
int l2[N];
int cnt1;
int cnt2;
int dfs(int l,int r) {//记得先看主函数的预处理
if (c1[r] >= l) {//如果最后一个和 r 同层的 | 在 l 和 r 的范围内
int ans = dfs(l, c1[r] - 1);
if (ans == 1) {
++cnt1;
return 1;
}
return (ans | dfs(c1[r] + 1, r));
}
if (c2[r] >= l) {//如果最后一个和 r 同层的 & 在 l 和 r 的范围内
int ans = dfs(l, c2[r] - 1);
if (ans == 0) {
++cnt2;
return 0;
}
return (ans & dfs(c2[r] + 1, r));
}
if (str[l] == '(' && str[r] == ')') {
return dfs(l + 1, r - 1);
}
return str[l] - '0';
}
int main(int argc, const char * argv[]) {
scanf("%s",str + 1);
int len = strlen(str + 1);
int x = 0;//括号层数
//l1[x] 代表目前最后一个在 x 层括号的 | 运算符
//l2[x] 代表目前最后一个在 x 层括号的 & 运算符
//c1[i] 代表目前和 i 同层的最后一个 | 运算符
//c2[i] 代表目前和 i 同层的最后一个 & 运算符
for (int i = 1; i<=len; ++i) {
if (str[i] == '(') {
++x;
}else if (str[i] == ')') {
--x;
}else if (str[i] == '|') {
l1[x] = i;
}else if (str[i] == '&') {
l2[x] = i;
}
c1[i] = l1[x];//最后一个在 i 这个位置前且与 i 同层的 | 运算符
c2[i] = l2[x];//最后一个在 i 这个位置前且与 i 同层的 & 运算符
}
int ans = dfs(1, len);
printf("%d\n%d %d\n",ans,cnt2,cnt1);
return 0;
}
T4
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
int i,j,p,n,k,f[505][105]; // f[i][j]: 前 i 个点,插入了 j 个点后最大长度
pair<int,int>a[505];
int main()
{
cin>>n>>k;
for(i=1;i<=n;i++)cin>>a[i].x>>a[i].y;
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
{
for(j=0;j<=k;j++)f[i][j]=1+j; // 直接在 i 点前插入 j 个点
}
// 类似最长上升子序列
for(i=2;i<=n;i++)
{
for(j=i-1;j>=1;j--) // j -> i
{
if(a[j].y>a[i].y)continue;
// 从 j 到 i 要插入 d 个点才能满足
int d=a[i].x-a[j].x+a[i].y-a[j].y-1;
for(p=d;p<=k;p++)f[i][p]=max(f[i][p],f[j][p-d]+d+1);
}
}
int ans=0;
for(i=1;i<=n;i++)ans=max(ans,f[i][k]);
cout<<ans;
return 0;
}
- 状态
- 已结束
- 规则
- ACM/ICPC
- 题目
- 4
- 开始于
- 2025-7-17 16:15
- 结束于
- 2025-7-18 16:15
- 持续时间
- 24 小时
- 主持人
- 参赛人数
- 7