• Codeforces Round 900 (Div. 3)


    Problem - A - Codeforces

    AC代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. int n,k;
    6. void solve(){
    7. cin>>n>>k;
    8. bool ok=false;
    9. for(int i=1;i<=n;i++){
    10. int x;
    11. cin>>x;
    12. if(x==k) ok=true;
    13. }
    14. if(ok) cout<<"Yes"<
    15. else cout<<"No"<
    16. }
    17. signed main() {
    18. ios::sync_with_stdio(false);
    19. cin.tie(0);
    20. cout.tie(0);
    21. int t=1;
    22. cin>>t;
    23. while(t--) {
    24. solve();
    25. }
    26. return 0;
    27. }

    Problem - B - Codeforces

    AC代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. const int N=2e5+10;
    6. int a[N];
    7. int n;
    8. void solve(){
    9. cin>>n;
    10. a[1]=1;
    11. a[2]=3;
    12. for(int i=3;i<=n;i++){
    13. int cnt=a[i-1]+1;
    14. while((3*cnt)%(a[i-1]+a[i-2])==0) cnt++;
    15. a[i]=cnt;
    16. }
    17. for(int i=1;i<=n;i++) cout<' ';
    18. cout<
    19. }
    20. signed main() {
    21. ios::sync_with_stdio(false);
    22. cin.tie(0);
    23. cout.tie(0);
    24. int t=1;
    25. cin>>t;
    26. while(t--) {
    27. solve();
    28. }
    29. return 0;
    30. }

    Problem - C - Codeforces

    首先我们能确定的是如果要Yes,一定得刚好取k个数,这是不变的,我们取最小的k个数和最大的k个数,如果x在这之间,那么一定能够取k个数和刚好为x

    比如一共5个数,取3个,最小的1 2 3和为6,最大的3 4 5和为12,1 2 4和为7,1 3 4和为8,1 3 5和为9,2 3 5和为10,2 4 5和为11

    每次取k个数都可以确保和多一个1,所以中间的数全部能取到,是连续的

    AC代码:

    1. #include
    2. #define endl '\n'
    3. #define int long long
    4. using namespace std;
    5. int n,k,x;
    6. void solve() {
    7. cin>>n>>k>>x;
    8. int minn=(1+k)*k/2;
    9. int maxn=(1+n)*n/2-(1+n-k)*(n-k)/2;
    10. if(x>=minn&&x<=maxn) cout<<"Yes"<
    11. else cout<<"No"<
    12. }
    13. signed main() {
    14. ios::sync_with_stdio(false);
    15. cin.tie(0);
    16. cout.tie(0);
    17. int t=1;
    18. cin>>t;
    19. while(t--) {
    20. solve();
    21. }
    22. return 0;
    23. }

    Problem - D - Codeforces

    参考Codeforces Round 900 (Div. 3) 题解 | JorbanS_JorbanS的博客-CSDN博客

    任何一个区间[l[i],r[i]]都是独立的,互不重叠

    如果暴力枚举每一个x所确定的区间[l[id],r[id]],一定会超时,那么我们就去寻求某种特殊的性质

    对于一个x,它所确定的区间所在的区间[l[id],r[id]]是唯一的,且对称轴是所在区间[l[id],r[id]]的对称轴

    通过二分来确定区间在哪个区间[l[id],r[id]],然后对于区间[l[id],r[id]]左半边的点,记录其翻转次数,通过差分数组来记录,再求前缀和得到,如果翻转次数为奇数,那么就换

    每个区间都是独立操作,进行差分和前缀和

    AC代码:

    1. #include
    2. #define endl '\n'
    3. //#define int long long
    4. using namespace std;
    5. const int N=2e5+10;
    6. int l[N],r[N];
    7. int a[N];
    8. int sum[N];
    9. int n,k;
    10. string s;
    11. void solve() {
    12. cin>>n>>k;
    13. vectorint>>e(n+1);
    14. cin>>s;
    15. for(int i=1;i<=n;i++) a[i]=sum[i]=0;
    16. for(int i=1;i<=k;i++) cin>>l[i];
    17. for(int i=1;i<=k;i++) cin>>r[i];
    18. int q;
    19. cin>>q;
    20. while(q--){
    21. int x;
    22. cin>>x;
    23. int id=lower_bound(r+1,r+1+k,x)-r;
    24. //第id个区间push_back区间左端点
    25. if(x<=(l[id]+r[id])/2) e[id].push_back(x);
    26. else e[id].push_back(l[id]+r[id]-x);
    27. }
    28. for(int i=1;i<=k;i++){
    29. a[l[i]]=0;
    30. sum[l[i]-1]=0;
    31. for(auto v:e[i]){
    32. int p=v,q=l[i]+r[i]-p;
    33. a[p]++,a[q+1]--;
    34. }
    35. for(int j=l[i];j<=(l[i]+r[i])/2;j++) sum[j]=sum[j-1]+a[j];
    36. for(int j=l[i];j<=(l[i]+r[i])/2;j++){
    37. if(sum[j]%2==1) swap(s[j-1],s[l[i]+r[i]-j-1]);
    38. }
    39. }
    40. cout<
    41. }
    42. int main() {
    43. ios::sync_with_stdio(false);
    44. cin.tie(0);
    45. cout.tie(0);
    46. int t=1;
    47. cin>>t;
    48. while(t--) {
    49. solve();
    50. }
    51. return 0;
    52. }

    Problem - E - Codeforces

    ST表(RMQ)

    以倍增的思想预处理以每个点为起点,2^0,2^1,...2^17为区间长度的区间相与

    相与,不会变大,只会变小,具有单调性

    然后对于起点l,进行贪心,从最大的区间开始枚举,如果相与大于等于k,则选用

    AC代码:

    1. #include
    2. #define endl '\n'
    3. //#define int long long
    4. using namespace std;
    5. const int N=2e5+10,M=18;
    6. int a[N];
    7. int f[N][M];
    8. int n;
    9. void init(){
    10. for(int j=0;j
    11. for(int i=1;i+(1<-1<=n;i++){
    12. if(!j) f[i][j]=a[i];
    13. else f[i][j]=f[i][j-1]&f[i+(1<<(j-1))][j-1];
    14. }
    15. }
    16. }
    17. int query(int l,int k){
    18. int r=l;
    19. int now=f[l][0];
    20. if(nowreturn -1;
    21. for(int i=17;i>=0;i--){
    22. if(r+(1<1&&(now&f[r][i])>=k){
    23. now&=f[r][i];
    24. r+=(1<
    25. }
    26. }
    27. return r-1;
    28. }
    29. void solve() {
    30. cin>>n;
    31. for(int i=1;i<=n;i++) cin>>a[i];
    32. init();
    33. int q;
    34. cin>>q;
    35. while(q--){
    36. int l,k;
    37. cin>>l>>k;
    38. cout<<query(l,k)<<' ';
    39. }
    40. cout<
    41. }
    42. int main() {
    43. ios::sync_with_stdio(false);
    44. cin.tie(0);
    45. cout.tie(0);
    46. int t=1;
    47. cin>>t;
    48. while(t--) {
    49. solve();
    50. }
    51. return 0;
    52. }
  • 相关阅读:
    iNFTnews | 互联网巨头「百度」的元宇宙应用场景探索
    线程运行状态
    如何设计一个支撑数亿用户的系统
    2.6 Python 基本数据类型
    安卓手机APP开发__媒体开发部分__使用媒体会话对播放进行控制和加广告
    【无标题】
    Oracle用户详细操作
    量子笔记:单比特量子门、泡利矩阵
    计算机图形学入门28:相机、透镜和光场
    滴滴可观测平台 Metrics 指标实时计算如何实现了又准又省?
  • 原文地址:https://blog.csdn.net/m0_74087709/article/details/133462927