• Daily Practice: Codeforces Round #816 (Div. 2)


    因为第二天要去学校所以这一场没有打,,VP*n

    A. Crossmarket

    现有两人,其中一人要从左下角走到右上角,另一人要从左上角走到右下角,左下到右上的人每走一格会在当前格制作一个传送门,当某一人在一个有传送门的格子时,可以传送到另一个具有传送门的格子,每走一格需要一个单位的能量,问两人最少一共需要多少能量。

    思路:可以制作传送门的人很显然只能一格一格走到终点,另一人尽可能传送最长的距离,计算一下即可。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. const int N=1e5+5;
    4. int t,n,m;
    5. int main(){
    6. std::ios::sync_with_stdio(false);
    7. std::cin.tie(0);
    8. std::cout.tie(0);
    9. std::cin>>t;
    10. while(t--){
    11. std::cin>>n>>m;
    12. if(n==1&&m==1){
    13. std::cout<<0<<'\n';
    14. continue;
    15. }
    16. std::cout<-2+std::min(n,m)<<'\n';
    17. }
    18. return 0;
    19. }

    B. Beautiful Array

    定义一个数组的beauty值为数组中每个数除以k向下取整的值之和,现在给出数组中元素个数,k的值,beauty值,所有元素之和,能否构造一个数组满足条件。

    思路:我们可以尽量使构造方法简单。即beauty值集中在一个数。若是总和除以k小于b,那一定无法构造;若除以k大于b,我们可以让其中一个贡献beauty值的数为(b+1)*k-1,尽可能使用总和,其他的给每一个剩余位置赋值k-1(如果可以的话),若全部赋完值s还有剩余的数,那就不可能存在满足条件的数组。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. const int N=1e5+5;
    4. int t;
    5. ll n,k,b,s;
    6. int main(){
    7. std::ios::sync_with_stdio(false);
    8. std::cin.tie(0);
    9. std::cout.tie(0);
    10. std::cin>>t;
    11. while(t--){
    12. std::cin>>n>>k>>b>>s;
    13. if(s/k
    14. std::cout<<-1<<'\n';
    15. continue;
    16. }
    17. std::vectorans(n+1,0);
    18. if(s/k==b){
    19. std::cout<
    20. for(int i=1;i
    21. std::cout<<' '<<0;
    22. }
    23. std::cout<<'\n';
    24. continue;
    25. }
    26. ans[1]=(b+1)*k-1;
    27. s-=ans[1];
    28. for(int i=2;i<=n;i++){
    29. if(s>=k-1) ans[i]=k-1,s-=(k-1);
    30. else if(s) ans[i]=s,s=0;
    31. else if(s==0) ans[i]=0;
    32. }
    33. if(s){
    34. std::cout<<-1<<'\n';
    35. continue;
    36. }
    37. for(int i=1;i<=n;i++){
    38. std::cout<" \n"[i==n];
    39. }
    40. }
    41. return 0;
    42. }

     os:没开ll WA了一发

    C. Monoblock

     一个序列可以根据相邻数字是否相同分段,现给出一个数组,每次修改其中一个值,对于每次修改,输出其所有子串的分段数和。

    思路:因为所有的修改都是基于原数组的,所以一开始计算原数组的值是必要的。可以采用双指针的方式从后向前计算以i为开头的子串的值。对于每次修改,讨论会对答案造成影响的情况,若第i个值与i-1个不同,但是修改完成为相同的,那相应的值会-1,然后找到包含这个数的区间作相应的修改,即(n-x+1)*(x-1),相反情况则是加上这个数。对于i个i+1的讨论同理。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. ll n,m;
    4. int main(){
    5. std::ios::sync_with_stdio(false);
    6. std::cin.tie(0);
    7. std::cout.tie(0);
    8. std::cin>>n>>m;
    9. std::vectora(n+2,0),f(n+2,0);
    10. for(int i=1;i<=n;i++){
    11. std::cin>>a[i];
    12. }
    13. ll sum=0;
    14. for(int i=n;i>=1;i--){
    15. int j=i;
    16. while(j&&a[j-1]==a[i]) j--;
    17. f[i]=f[i+1]+n-i+1;
    18. sum+=f[i];
    19. for(int k=i-1;k>=j;k--){
    20. f[k]=f[k+1]+1,sum+=f[k];
    21. }
    22. i=j;
    23. }
    24. while(m--){
    25. ll x,y;
    26. std::cin>>x>>y;
    27. if(a[x]==y){
    28. std::cout<'\n';
    29. continue;
    30. }
    31. if(y==a[x-1]&&a[x]!=a[x-1]) sum-=(n-x+1)*(x-1);
    32. if(y!=a[x-1]&&a[x]==a[x-1]) sum+=(n-x+1)*(x-1);
    33. if(y==a[x+1]&&a[x]!=a[x+1]) sum-=(n-x)*x;
    34. if(y!=a[x+1]&&a[x]==a[x+1]) sum+=(n-x)*x;
    35. std::cout<'\n';
    36. a[x]=y;
    37. }
    38. return 0;
    39. }

    D. 2+ doors

     给出q个关系,对于每个关系给出x,y,v三个值,表示a[x]|a[y]=v,构造一个字典序最小的数组,满足给出的条件。

    思路:实质就是对于二进制下的v按照它的0或1分配给两个数0或1因为要字典序最小,所以尽可能多的赋0。对于v的位是0的情况,那一定是两数该位都是0,若是1的情况,则一定是一个0一个1,x和y靠前的那个赋0。但是最后会出现一些矛盾,即0和1的位置,那就按照前面的赋值来决定该位的情况。注意x==y时直接等于v。

    AC Code:

    1. #include
    2. #define int long long
    3. const int N=2e5+5;
    4. int n,m;
    5. int ans[N];
    6. struct node{
    7. int x,v;
    8. };
    9. std::vectorvec[N];
    10. signed main(){
    11. std::ios::sync_with_stdio(false);
    12. std::cin.tie(0);
    13. std::cout.tie(0);
    14. std::cin>>n>>m;
    15. for(int i=1;i<=m;i++){
    16. int a,b,c;
    17. std::cin>>a>>b>>c;
    18. vec[a].push_back({b,c});
    19. vec[b].push_back({a,c});
    20. }
    21. for(int i=1;i<=n;i++){
    22. ans[i]=(1<<30)-1;
    23. for(auto e:vec[i])
    24. ans[i]&=e.v;
    25. if(!vec[i].size()) ans[i]=0;
    26. }
    27. for(int i=1;i<=n;i++){
    28. for(int j=0;j<30;j++){
    29. if(ans[i]>>j&1){
    30. bool flag=false;
    31. for(auto e:vec[i])
    32. if(!(ans[e.x]>>j&1)||e.x==i)
    33. flag=true;
    34. if(!flag) ans[i]-=(1<
    35. }
    36. }
    37. }
    38. for(int i=1;i<=n;i++){
    39. std::cout<' ';
    40. }
    41. std::cout<<'\n';
    42. return 0;
    43. }

    感觉这场CD还好?虽然没做出来。。。

  • 相关阅读:
    Python 一网打尽<排序算法>之先从玩转冒泡排序开始
    在Linux命令行中查找空目录
    E : DS堆栈--逆序输出(STL栈使用)
    java毕业设计茶叶企业管理系统Mybatis+系统+数据库+调试部署
    Oracle连接和使用
    用Python画出圣诞树,瞧瞧我这简易版的吧
    ANR无响应介绍
    系列八、Mybatis一对多查询,只查询出了一条记录
    JSP指令,JSP九大内置对象
    OpenCV(三十二):轮廓检测
  • 原文地址:https://blog.csdn.net/m0_62289613/article/details/126464016