A
核心思路:简单的结论题就是需要RL就可以了。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e3 + 10,INF=0x3f3f3f3f;
int n, ans = -INF;
int a[N];
void solve()
{
int len;
cin >> len;
string s;
cin >> s;
int ans = -1;
int flag = 0;
for (int i = 0;i < len;i++)
{
if (s[i] == 'L' && s[i + 1] == 'R')
{
ans = i;
break;
}
if (s[i] == 'R' && s[i + 1] == 'L')
{
flag = 1;
break;
}
}
if (flag == 1)
{
cout << 0 << endl;
return ;
}
else if (flag == 1 && ans != -1)
{
cout << ans + 1 << endl;
return;
}
else if (flag == 0 && ans != -1)
{
cout << ans + 1 << endl;
return;
}
else if (flag == 0 && ans == -1)
{
cout << -1<<endl;
return;
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
B
核心思路:这是一道很好的构造题。也就是一个列方程组的过程 ,首先模拟n=3然后就是n=5的情况。我们会发现一个规律。
t bt t bt t bt ....
所以我们只需要列方程组解出来b就好了。所以还是得一步一步来,如果看不出规律的话。设参一定要注意不要搞糊涂了。一步一步来就不会错。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e3 + 10,INF=0x3f3f3f3f;
int n, ans = -INF;
int a[N];
void solve()
{
int n;
cin >> n;
if (n % 2)
{
if (n == 3)
{
cout << "NO" << endl;
return;
}
else
{
cout << "YES" << endl;
int m = ceil((double)n / 2.0);
int a = 1+m-n;
double b = (m - 1);
for (int i = 1;i <= n - 1;i++)
{
if (i & 1)
cout << a << " ";
else
cout << b << " ";
}
cout << a << endl;
}
}
else
{
int flag = 1;
cout << "YES" << endl;
for (int i = 1;i <= n;i++)
{
cout << flag << " ";
flag = -flag;
}
cout << endl;
}
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
C
核心思路:首先我们观察题目,看能不能抽象为数学模型和图形模型。我们首先假设\(sum[L,R]=a[L]+a[L+1]+a[L+2]+....+a[R]\).
然后我们分类讨论:
- k<=m
- \(a[1,k]\geq a[1,m]\Rightarrow a[k+1,m]\leq0\)
- 因为\(k\geq1,所以我们对于任意的i属于[2,m],都有a[i,m]\leq0\)
- k>m
- $a[1,k]\geq a[1,m]\Rightarrow a[m+1,k]\geq 0 $
- 所以可以得到对于任意的i属于[m+1,n],都存在\(a[m+1,i]\geq 0\)
推到了这个关键的式子整个问题就迎刃而解了,所以我们需要建立合适的数学模型。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e6 + 10,INF=0x3f3f3f3f;
int n,m, ans = -INF;
LL a[N];
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)cin >> a[i];
LL sum = 0;
multiset<int>st;
int ans = 0;
for (int i = m + 1; i <= n; i++) { // [m + 1,i]
sum += a[i];
st.insert(a[i]);
if (sum < 0) {//我们希望大于 0 如果有小于0的地方,就给最小的一个添加上负号
int mi = *st.begin();
sum -= 2 * mi;
ans++;
st.erase(st.begin());
}
}
st.clear();
sum = 0;
for (int i = m; i >= 2; i--) { //[i,m]
sum += a[i];
st.insert(a[i]);
if (sum > 0) {
int mx = *prev(st.end());
sum -= 2 * mx;
ans++;
st.erase(prev(st.end()));
}
}
cout << ans << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
D
核心思路:我们首先想什么情况下可以共用刀片呢,首先我们不可以砍去我们不该砍去的部分。所以我们可以使用st表来求RMQ.来判断是否是否可以共用,可以共用的话那么我们就可以省一个刀片。
所以接下来就是一个大模拟了,我们做模拟题其实可以先写题解,在写代码。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10,INF=0x3f3f3f3f;
int f[N][21],a[N],b[N];
int n,m;
void build()
{
for (int i = 1;i <= n;i++)
f[i][0] = b[i];
for (int i = 1;i <= 21;i++)
{
for (int j = 1;j + (1 << i) - 1 <= n;j++)
{
f[j][i] = max(f[j][i - 1], f[j + (1 << (i-1))][i - 1]);
}
}
}
int query(int l, int r)
{
int k = log2(r - l + 1);
return max(f[l][k], f[r - (1 << k) + 1][k]);
}
void solve()
{
cin >> n;
for (int i = 1;i <= n;i++)
cin >> a[i];
for (int i = 1;i <= n;i++)
cin >> b[i];
cin >> m;
map<int, int> cnt;
for (int i = 1;i <= m;i++)
{
int X;
cin >> X;
cnt[X]++;
}
build();
for (int i = 1;i <= n;i++)
{
if (a[i] < b[i])
{
cout << "NO" << endl;
return;
}
}
map<int, vector<int>> mp;
for (int i = 1;i <= n;i++)
{
mp[b[i]].push_back(i);
}
for (auto p : mp)
{
int val = p.first;
vector<int>& pos = p.second;
vector<int> cut;
for (auto i : pos)
{
if (a[i] != b[i])
cut.push_back(i);
}
int need_cut = cut.size();
for (int i = 1;i < cut.size();i++)
{
int L = cut[i - 1];
int R = cut[i];
if (query(L, R) <= val)//可以共用刀片的前提下是需要那个区间的需要小于等于我们的刀片,不然就把那些不需要切除的给切了。
{
need_cut--;
}
}
if (need_cut > cnt[val])//这里用到了cnt
{
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
int main()
{
int T;
cin >> T;
while (T--)
{
solve();
}
}
标签:cut,int,ans,long,2023,INF,include,Hello
From: https://www.cnblogs.com/xyh-hnust666/p/17028810.html