• Codeforces Round #814 (Div. 2)(A~D)


    A. Chip Game

    在一个n*m大小的棋盘上,从左下角移动到右上角,每次只能向一个方向移动奇数个格子(向右或向上),最后不能移动的输,B先手,问最后谁赢。

    思路:每次移动奇数,那所有奇数的性质相同,偶数性质相同。易得出n和m奇偶性质相同时,T赢,反之则B赢。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. const int N=1e5+5;
    4. const int mod=1e9+7;
    5. int t,n,m;
    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>>m;
    13. if(n%2==m%2) std::cout<<"Tonya"<<'\n';
    14. else std::cout<<"Burenka"<<'\n';
    15. }
    16. return 0;
    17. }

    B. Mathematical Circus

     给出n和k,将1~n分为两两一组,并规定其中某个数为a,某个数为b,满足(a+k)*b为4的倍数,问是否存在满足条件的分组方式,有则输出分组方式。

    思路:满足是4的倍数,要么两个因数各有2,要么其中一个数为4的倍数,首先k为0一定不行,因为最小的1,2组合需要加入大数才能满足条件;若不为0,则判断是否满足整除4的条件,即交换a和b的值。易得分组为相邻两数两两互组。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. typedef std::pair<int,int>PII;
    4. const int N=1e5+5;
    5. const int mod=1e9+7;
    6. int t,n,k;
    7. int main(){
    8. std::ios::sync_with_stdio(false);
    9. std::cin.tie(0);
    10. std::cout.tie(0);
    11. std::cin>>t;
    12. while(t--){
    13. std::cin>>n>>k;
    14. if(k&1){
    15. std::cout<<"YES"<<'\n';
    16. for(int i=1;i<=n;i+=2){
    17. std::cout<' '<1<<'\n';
    18. }
    19. }
    20. else{
    21. bool flag=true;
    22. std::vectorans;
    23. for(int i=1;i<=n;i+=2){
    24. if((k+i+1)%4==0){
    25. ans.push_back({i+1,i});
    26. }
    27. else if((i+1)%4==0){
    28. ans.push_back({i,i+1});
    29. }
    30. else{
    31. flag=false;
    32. break;
    33. }
    34. }
    35. std::cout<<(flag?"YES":"NO")<<'\n';
    36. if(flag){
    37. for(int i=0;i2;i++){
    38. std::cout<' '<'\n';
    39. }
    40. }
    41. }
    42. }
    43. return 0;
    44. }

     C. Fighting Tournament

    给出n个数,从左侧依次拿出两个数比较,大的留下,小的置于队尾,若某个数大于比较的数,则赢一次,给出比较轮数,q次询问,每次回答每个数赢得次数。

    思路: 观察可以发现,一个数会赢的条件是没有遇到比自己大的数;若是整个数组中最大的数,则在开始比较后全赢;若是该数前面存在比它大的数,则一直为0。根据这个条件,分类讨论即可。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. typedef std::pair<int,int>PII;
    4. const int N=1e5+5;
    5. const int mod=1e9+7;
    6. int t,n,q,id,k;
    7. int a[N],cnt[N];
    8. int main(){
    9. std::ios::sync_with_stdio(false);
    10. std::cin.tie(0);
    11. std::cout.tie(0);
    12. std::cin>>t;
    13. while(t--){
    14. std::cin>>n>>q;
    15. memset(cnt,0,sizeof(cnt));
    16. for(int i=1;i<=n;i++){
    17. std::cin>>a[i];
    18. }
    19. int pos=1,max=a[1];
    20. for(int i=2;i<=n;i++){
    21. if(a[i]0;
    22. else{
    23. cnt[pos]=i;
    24. pos=i;
    25. max=a[i];
    26. }
    27. }
    28. cnt[pos]=-1;
    29. while(q--){
    30. std::cin>>id>>k;
    31. if(cnt[id]==0){
    32. std::cout<<0<<'\n';
    33. }
    34. else if(cnt[id]==-1){
    35. if(k>=std::max(1,id-1)) std::cout<max(0,id-1-1)<<'\n';
    36. else std::cout<<0<<'\n';
    37. }
    38. else{
    39. int max=cnt[id]-1;
    40. if(k
    41. if(kmax(1,id-1)) std::cout<<0<<'\n';
    42. else std::cout<max(0,id-1-1)<<'\n';
    43. }
    44. else{
    45. std::cout<max(0,id-1-1)-1<<'\n';
    46. }
    47. }
    48. }
    49. }
    50. return 0;
    51. }

    os:WA麻了

    D2. Burenka and Traditions (hard version)

    给出n个数,每次选择一个x,将一个区间异或x,问最少的操作次数,使得数组全为0。

    思路:大佬的思路显然最多的操作数是n,把每一个数都亦或上自己即可。为了尽可能减少操作次数,显而易见的是对于一段连续的相同的数比如2222,我们也可以通过一次操作把他变为0。但是本质其实是对于一个新的数,我们要判断前面的数载操作后能否顺便把这个数也变成0。

    我们需要的是在操作一个新数前的所有的后缀异或和。比如一串序列a, b, c。我们在操作a,b后并保证ab都变成0的情况下,c可能的取值是c,b^c,a^b^c,模拟一下即可。那么所有的后缀就是b和a^b,我们用set来维护所有的后缀,然后在枚举新数的时候判断是否出现在后缀里即可。

    AC Code:

    1. #include
    2. int t,n;
    3. int main(){
    4. std::ios::sync_with_stdio(false);
    5. std::cin.tie(0);
    6. std::cout.tie(0);
    7. std::cin>>t;
    8. while(t--){
    9. std::cin>>n;
    10. std::vector<int>a(n+1,0);
    11. for(int i=1;i<=n;i++){
    12. std::cin>>a[i];
    13. }
    14. int res=0;
    15. std::set<int>s;
    16. s.insert(0);
    17. int suf=0;
    18. for(int i=1;i<=n;i++){
    19. if(s.count(a[i]^suf)||a[i]==0) s.clear(),suf=0;
    20. else res++,s.insert(suf),suf^=a[i];
    21. }
    22. std::cout<'\n';
    23. }
    24. return 0;
    25. }

    os:这思维太顶了

  • 相关阅读:
    使用Java实现汉诺塔问题~
    STM32——HAL库中寄存器地址名称映射分析
    Appium和Android常用9种自动化测试框架对比有哪些优势?
    零代码编程:用ChatGPT将特定文件标题重命名为特定格式
    JavaScript 编写一个 数值转换函数 万以后简化 例如1000000 展示为 100万 万以下原来数值返回
    2022英特尔® FPGA中国技术周
    记录----RabbitMQ踩坑(一)
    Laravel9版本的CMS出现Invalid datetime format异常
    基于SSM的医院科室人员管理系统
    Flutter 全能型选手GetX —— 路由管理
  • 原文地址:https://blog.csdn.net/m0_62289613/article/details/126450764