• 1355C - Count Triangles,2021CCPC桂林 C,D


    14天阅读挑战赛

    1355C - Count Triangles 

    枚举i=x+y的值,i一定是要>=c+1的,那么z的取值就是min(d+1,i)-c,再去看x和y的值,

    x属于[a,b],y属于[b,c],a+b<=i<=b+c--->i-b>=a,i-c<=b,那么对于每一个y,x的取值就是max(i-c,a),min(i-b,b),那么x可取的数就是min(i-b,b)-max(i-c,a)+1,然后将x和z的个数相乘就是这个i对答案的贡献

    C. Count Triangles(组合数学)_Harris-H的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define int long long
    5. const int N = 2e5+5;
    6. //const int mod=1e9+7;
    7. const int inf=1e18;
    8. const double eps=1e-8;
    9. const double pi=acos(-1);
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a;
    16. a=a*a;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. //int getinv(int a){return qpow(a,mod-2);}
    22. int Lcm(int a,int b){return a*b/__gcd(a,b);}
    23. int a,b,c,d;
    24. signed main()
    25. {
    26. //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    27. //freopen("in.txt","r",stdin);
    28. cin>>a>>b>>c>>d;
    29. int ans=0;
    30. for(int i=max(a+b,c+1);i<=b+c;i++)
    31. {
    32. ans+=(min(d+1,i)-c)*(min(i-b,b)-max(i-c,a)+1);
    33. }
    34. cout<
    35. return 0;
    36. }
    37. //

    G - Occupy the Cities 二分

    二分答案,check函数就是看看第i个零距离两侧的1是否小于等于x,不然就让右边的1向左感染,然后标记右边的1,表示这个右边的1如果作为左边的1的话已经被用了,不可以再向右感染了;否则可以向右感染;

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define int long long
    5. const int N = 2e6+5;
    6. //const int mod=1e9+7;
    7. const int inf=1e18;
    8. const double eps=1e-8;
    9. const double pi=acos(-1);
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a;
    16. a=a*a;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. //int getinv(int a){return qpow(a,mod-2);}
    22. int Lcm(int a,int b){return a*b/__gcd(a,b);}
    23. int n,t,pre[N],suf[N],pos[N],vis[N];
    24. char s[N];
    25. bool check(int x)
    26. {
    27. for(int i=1;i<=n;i++) pos[i]=i,vis[i]=0;
    28. pos[0]=-inf;pos[n+1]=inf;
    29. vis[0]=vis[n+1]=0;
    30. for(int i=1;i<=n;i++)
    31. {
    32. if(s[i]=='1') continue;
    33. int l=pre[i],r=suf[i];
    34. if(pos[l]==l&&!vis[l]) pos[l]=pos[l]+1;
    35. int minn=min(i-pos[l]+1,pos[r]-i+1);
    36. //cout<
    37. if(minn<=x) continue;
    38. int tmp=pos[r]-1;vis[r]=1;
    39. minn=min(i-pos[l]+1,tmp-i+1);
    40. if(minn>x) return 0;
    41. }
    42. return 1;
    43. }
    44. signed main()
    45. {
    46. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    47. //freopen("in.txt","r",stdin);
    48. cin>>t;
    49. while(t--)
    50. {
    51. cin>>n;
    52. cin>>(s+1);
    53. for(int i=1;i<=n;i++) pre[i]=suf[i]=pos[i]=0;
    54. int last=0;
    55. for(int i=1;i<=n;i++)
    56. {
    57. pre[i]=last;
    58. if(s[i]=='1') last=i;
    59. }
    60. last=n+1;
    61. for(int i=n;i>=1;i--)
    62. {
    63. suf[i]=last;
    64. if(s[i]=='1') last=i;
    65. }
    66. pos[0]=-inf;pos[n+1]=inf;
    67. int l=0,r=n,ans=n;
    68. while(l<=r)
    69. {
    70. int mid=l+r>>1;
    71. if(check(mid)) ans=mid,r=mid-1;
    72. else l=mid+1;
    73. }
    74. cout<
    75. }
    76. return 0;
    77. }
    78. //
    79. /*
    80. 11
    81. 000100001000
    82. */

    1474C - Array Destruction multiset

    每次都要选数组里的最大值,因为不选的话以后就没机会选了,然后再找一个上一个最大值与该最大值的差就可以,因为第一个最大值所对应的差值是不确定的,那就去枚举,除最大值外所有的数,然后看看是否符合条件

    C. Array Destruction(思维+树形结构+枚举)_小菜鸡加油的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define int long long
    5. const int N = 2e6+5;
    6. //const int mod=1e9+7;
    7. const int inf=1e18;
    8. const double eps=1e-8;
    9. const double pi=acos(-1);
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a;
    16. a=a*a;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. //int getinv(int a){return qpow(a,mod-2);}
    22. int Lcm(int a,int b){return a*b/__gcd(a,b);}
    23. int t,n,a[2005],m,flag;
    24. multiset<int>s;
    25. vectorint,int>>ans;
    26. bool sol(int x)
    27. {
    28. for(int i=1;i
    29. {
    30. int maxx=*prev(s.end());
    31. s.erase(s.find(maxx));
    32. if(s.find(x-maxx)!=s.end())
    33. {
    34. s.erase(s.find(x-maxx));
    35. ans.push_back({maxx,x-maxx});
    36. x=maxx;
    37. }
    38. else break;
    39. }
    40. return ans.size()==n;
    41. }
    42. signed main()
    43. {
    44. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    45. //freopen("in.txt","r",stdin);
    46. cin>>t;
    47. while(t--)
    48. {
    49. cin>>n;
    50. m=2*n;flag=0;
    51. for(int i=1;i<=m;i++) cin>>a[i];
    52. sort(a+1,a+m+1);
    53. for(int i=1;i
    54. {
    55. s.clear();ans.clear();
    56. for(int j=1;j
    57. {
    58. if(j!=i) s.insert(a[j]);
    59. }
    60. ans.push_back({a[m],a[i]});
    61. if(sol(a[m])){flag=1;break;}
    62. }
    63. if(flag)
    64. {
    65. cout<<"YES\n";
    66. cout<0].first+ans[0].second<
    67. for(auto [x,y]:ans) cout<" "<
    68. }
    69. else cout<<"NO\n";
    70. }
    71. return 0;
    72. }
    73. //
    74. /*
    75. 11
    76. 000100001000
    77. */

    D - Assumption is All You Need 构造

    大的数只能往右走,小的数只能往左走,每次交换较大的两个数,直到较大数回到正确的位置,然后次大数再继续走,这样会留出更多的机会给后面的数,也就是每次枚举大数往下走

    D. Assumption is All You Need_chmpy的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. #define endl '\n'
    4. #define int long long
    5. const int N = 3e5+5;
    6. const int mod=1e9+7;
    7. const int inf=1e18;
    8. const double eps=1e-8;
    9. const double pi=acos(-1);
    10. int qpow(int a,int b)
    11. {
    12. int res=1;
    13. while(b)
    14. {
    15. if(b&1) res=res*a;
    16. a=a*a;
    17. b>>=1;
    18. }
    19. return res;
    20. }
    21. //int getinv(int a){return qpow(a,mod-2);}
    22. int Lcm(int a,int b){return a*b/__gcd(a,b);}
    23. int t,n,a[2025],b[2035],posa[2035],posb[2035];
    24. vectorint,int>>ans;
    25. signed main()
    26. {
    27. ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    28. //freopen("in.txt","r",stdin);
    29. cin>>t;
    30. while(t--)
    31. {
    32. ans.clear();
    33. cin>>n;
    34. int flag=1;
    35. for(int i=1;i<=n;i++) cin>>a[i],posa[a[i]]=i;
    36. for(int i=1;i<=n;i++) cin>>b[i],posb[b[i]]=i;
    37. for(int i=n;i>=1;i--)
    38. {
    39. for(int j=i-1;j>=1;j--)
    40. {
    41. if(posa[j]>posa[i]&&posa[j]<=posb[i])
    42. {
    43. ans.push_back({posa[i],posa[j]});
    44. swap(a[posa[i]],a[posa[j]]);
    45. swap(posa[i],posa[j]);
    46. }
    47. }
    48. if(posa[i]!=posb[i])
    49. {
    50. flag=0;break;
    51. }
    52. }
    53. if(!flag) cout<<"-1\n";
    54. else
    55. {
    56. cout<size()<
    57. for(auto [x,y]:ans) cout<" "<
    58. }
    59. }
    60. return 0;
    61. }
    62. //

  • 相关阅读:
    全栈开发实战 | SSM框架整合完整教程
    AWS认证SAA-C03每日一题
    【每日一句】名人金句学英语(20221130)
    【RealTek sdk-3.4.14b】RTL8812F 5G WiFi ETSI认证增加144~165信道支持修改
    MySQL8.0优化 - 优化MySQL服务器、优化MySQL的参数、优化数据类型
    解决网络编程中的EOF违反协议问题:requests库与SSL错误案例分析
    面向对象设计原则-一句话总结设计原则
    vue cube-ui 搜索栏子组件封装
    第3.1章:StarRocks数据导入——Insert into 同步模式
    【MySQL】聚合函数:汇总、分组数据
  • 原文地址:https://blog.csdn.net/weixin_52621204/article/details/127530120