1.聰明的小羊肖恩 - 藍橋云課 (lanqiao.cn)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=100000007;
const int N=200010;
int n,L,R;
int a[N];
LL calc(int v){//計算數組a中兩個數之和小于等于v的數對數量int l=1,r=n;LL ans=0;while(l<r){while(l<r&&a[l]+a[r]>v){r--;//不符合條件需要減小值,}//符合條件則通過r-l計算ans +=r-l;//[l,r]這個區間內都可以,l與[l+1,r]中有r-l種組合l++;}return ans;
}
void solve(){cin>>n>>L>>R;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);cout<<calc(R)-calc(L-1)<<'\n';
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);solve();return 0;
}
?1.神奇的數組 - 藍橋云課 (lanqiao.cn)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n, res;
int s[N], a[N], c[N];
inline void solve()
{cin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i], s[i] = s[i - 1] + a[i];for (int i = 1; i <= n; i ++ ) c[i] = c[i - 1] ^ a[i];//異或前綴和for (int i = 1,j=0; i <= n; i ++ ){//雙指針模板while (((s[j] - s[i - 1]) == (c[j] ^ c[i - 1])) && j <= n) j ++;res += (j - i);//是個數而不是長度,最后一個位置是不符合條件的}cout << res << '\n';
}
signed main(){cin.tie(nullptr) -> sync_with_stdio(0);solve();return 0;
}
1.可湊成的最大花束數 - 藍橋云課 (lanqiao.cn)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int a[N];int n,k;
int check(int mid){//花束個數int res=0;//有效花束總數for(int i=1;i<=n;i++){res+=min(mid,a[i]);//每個花的貢獻值}//res表示的是所有花的數量 然后 /mid得到的是一束花中的花朵數return res/mid;//一束中花數
}
void solve()
{cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];int l=0,r=2e14+1;while(l<r){int mid=(l+r+1)/2;if(check(mid)>=k) l=mid;//如果一束中的花數大于k,就可以包裹成更多的花束else r=mid-1;//找最多的向右邊找}cout<<l;
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);solve();return 0;
}
1.最大通過數 - 藍橋云課 (lanqiao.cn)
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
const int N=2e5+2;
typedef long long ll;
ll a[N]={0},b[N]={0};
bool check(ll mid){//輸入通過的關卡數之和
//枚舉每一種情況 然后取最小值 找到通過這么多關卡所需要的最小水晶數ll t=mid;ll sum=0;ll mn=1e14;while(t--){sum=0;if(t>n)continue;//防止越界if(mid-t>m)break;//防止越界sum+=a[t]+b[mid-t];mn=1ll*min(mn,sum);}return mn<=k;//下能通過的關卡數更多
}
int main()
{cin>>n>>m>>k;//a[i]表示通過前i個關卡需要的水晶數量是a[i]for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];}for(int i=1;i<=m;i++){cin>>b[i];b[i]+=b[i-1];}//前綴和ll l=0,r=n+m+2;while(l<r){ll mid=(l+r+1)/2;//右-需要還if(check(mid))l=mid;else r=mid-1;//右-}cout<<r<<'\n';return 0;
}
?1.體育健將 - 藍橋云課 (lanqiao.cn)
// 解題思路: 枚舉小藍參加的最后一個項目item[i],則剩余時間為temp - item[i].et,
// 然后我們按總時間(參賽+休息)排序,并求出其前綴和數組s,s[i]的含義是前i件項目
// 的時間和,準備好這些之后,二分答案。check函數我們將枚舉的答案x帶入s數組中,求出
// 前x件項目時間之和,隨后與剩余時間time比較,這里有個細節是,如果前x件項目中包含
// 枚舉的i,我們需要將其刪去并將s[x]改為s[x+1]。
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5;
int n,k,ans;
long long s[N];
struct node {int et,br;
}item[N];
bool cmp(const node &a, const node &b) {return a.et + a.br <= b.et + b.br;
}
bool check(int x, int y,int time) {if(x < y) { if(s[x] <= time) return true;return false;}else {if(x + 1 > n) return false;//超出了if(s[x + 1] - item[y].br <= time) return true;//還是比總時間更小的else return false;//減去這個比賽}
}
int main() {ios::sync_with_stdio(false),cin.tie(0);cin>>n>>k;for(int i = 1; i <= n; i ++) cin>>item[i].et;for(int i = 1; i <= n; i ++) cin>>item[i].br;sort(item+1,item+1+n,cmp);//sort可以保證選的都是用的時間少的 //所以前綴和數組才右意義for(int i = 1; i <= n; i ++) s[i] = s[i-1] + item[i].et + item[i].br;for(int i = 1; i <= n; i ++) {//枚舉第i個比賽最后參加int temp = k;if(temp < item[i].et) continue;//總時間小于這個比賽的參加時間 肯定不行temp -= item[i].et;//最后參加這個比賽int l = 0, r = n;while(l < r) {int mid = (l + r + 1) >> 1;//參加mid個比賽if(check(mid,i,temp)) l = mid;else r = mid-1;}ans = max(r+1,ans);//加上一個1}cout<<ans;return 0;
}