A. Tit for Tat

从前往后枚举,把前面的数减到0,然后给最后一个数加上去。操作次数没了就停止

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long sum=1;
bool vis[N];
int a[N];
int main()
{int t;cin>>t;while(t--){int n,k,g=0;cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];int now=a[i];a[i]=max(0,a[i]-k);k-=now-a[i];g+=now-a[i];}for(int i=1;i<n;i++)printf("%d ",a[i]);cout<<a[n]+g;cout<<endl;}return 0;
}

B. AGAGA XOOORRR

用前缀异或。
比如异或出来的前缀数组是
a数组 1 4 5 7 0 4 3 4 0 9 8
下标:1 2 3 4 5 6 7 8 9 10 11
可以发现在0前面的任何一个数x,都可以让0前面变成两段。两段各自的异或就可以是x。比如1-3区间异或为a[3]=5。4-5的异或为a[5]^a[3]=5。则这两段异或值相同
记录最后一个0的位置,如果0在最后。则区间划分成两段。
否则划分成3段。记录0前面有没有数等于0后面的异或值即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
long long sum=1;
int a[N];
int main()
{int t;cin>>t;while(t--){int n;cin>>n;bool f=0;int q=0;for(int i=1;i<=n;i++){cin>>a[i];a[i]^=a[i-1];if(a[i]==0)q=i;} int sum=a[n];for(int i=1;i<q;i++)if(a[i]==sum)f=1;if(f||q==n)puts("YES");else puts("NO");}return 0;
}

C. Baby Ehab Partitions Again

用f[i][j]f[i][j]f[i][j]表示前i个物品取体积不超过j的最大价值。这里把价值当作体积。
某个子序列的和是x 则f[n][x]==xf[n][x]==xf[n][x]==x,否则说明取不到和是x的子序列
如果有两个子序列和一样,那么这个和加起来一定是偶数。
如果是奇数,直接输出0
否则 令当前所有物品体积和为s。看是否有和是s/2,如果没有则输出0。否则一定会删除1个数。遍历一遍每个数,如果是奇数直接输出。因为偶数-奇数=奇数,一定不会有两个一样的和加起来是偶数。或者不存在(s-a[i])/2的和也直接输出

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int f[N][N*2000+10],a[N];
int main()
{int n;cin>>n;int m=n*2000,s=0;for(int i=1;i<=n;i++){cin>>a[i];s+=a[i];for(int j=a[i];j<=m;j++){f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+a[i]);}}if(s&1)cout<<0;else{if(f[n][s/2]!=s/2){cout<<0;return 0;}cout<<1<<endl;for(int i=1;i<=n;i++){if(a[i]&1||(f[n][(s-a[i])/2]!=(s-a[i])/2)){cout<<i;return 0;}}}return 0;
}

D Cut

首先要使分割的每一段里面的数两两都是互质的。
比如有两个数质因数分解分别为 a=23∗34∗52a=2^3*3^4*5^2a=23∗34∗52 和b=21∗35b=2^1*3^5b=21∗35
则他们的乘积就是24∗39∗522^4*3^9*5^224∗39∗52 lcm为23∗34∗522^3*3^4*5^223∗34∗52
要使乘积等于lcm,则每个质因子只能a有或者只能b有。

1.考虑ne[i]ne[i]ne[i]:位置i左边最近的非互质的数的位置
a: 2 3 10 7 5 14
ne :0 0 1 0 3 4
有了ne[i]我们已经可以计算答案了,假如i位置跳到ne[i],我们自然会想把ne[i]+1~i划分为一组。但如果这里面还有两个数是非互质的呢
比如 14 10 5 7 ne[4]=1 ne[3]=2显然我们只能把5和7这两个数组划分为一组。
所以ne[i]=max(ne[i],ne[i-1])即可
2.计算 ne[i] ,从前往后对每个数质因数分解,当前枚举到位置 i ,对a[i]所有的质因子j 。ne[i]=max(ne[i],wei[j])ne[i]=max(ne[i],wei[j])ne[i]=max(ne[i],wei[j])。。。wei[j]wei[j]wei[j]表示j这个数的位置。然后更新记录这质因子的位置为wei[j]=i;wei[j]=i;wei[j]=i;
3.用倍增法快速跳跃。一步步跳可能会超时。倍增法枚举log次即可。
f[i][j]f[i][j]f[i][j]表示从 j 这个位置跳2i2^i2i步到的位置。
则f[i][j]=f[i−1][f[i−1][j]];f[i][j]=f[i-1][f[i-1][j]];f[i][j]=f[i−1][f[i−1][j]];
即先跳一半再跳一半嘛。
4.计算答案。i从20开始枚举因为2202^{20}220>1e51e^51e5,即从跳2i2^i2i步开始枚举,从r往l跳,只要跳到范围没有超过l(<l)就跳过去。然后答案加上2i2^i2i,最终答案还要加上1,要多跳一下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int ne[N],a[N],wei[N],f[20][N];//wei表示i这个数的位置
int main()
{int n,q;cin>>n>>q;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){int x=a[i];for(int j=2;j*j<=x;j++){if(x%j==0){ne[i]=max(ne[i],wei[j]);wei[j]=i;while(x%j==0){x/=j;}}}if(x>1){ne[i]=max(ne[i],wei[x]);wei[x]=i;}ne[i]=max(ne[i],ne[i-1]);f[0][i]=ne[i];}for(int i=1;i<=19;i++){for(int j=1;j<=n;j++)f[i][j]=f[i-1][f[i-1][j]];}while(q--){int l,r,x,ans=0;cin>>l>>r;x=r;for(int i=19;i>=0;i--){if(f[i][x]>=l){ans+=1<<i;x=f[i][x];}}printf("%d\n",ans+1);}return 0;
}
/*
5 3
2 14 10 5 7
1 5
*/

有不懂的欢迎评论出来一起探讨!

Codeforces Round #717 (Div. 2)(ABCD)相关推荐

  1. Codeforces Round #717 (Div. 2) D. Cut 倍增

    传送门 文章目录 题意: 思路: 题意: 给定长度为nnn的序列,有qqq个询问,每次询问一个区间,输出至少将这个区间分成多少个连续区间才能使每个区间内的数互质. 思路: 首先要判断互质,这个比较容易 ...

  2. Codeforces Round #717 (Div. 2) D(倍增dp)

    Codeforces Round #717 (Div. 2) D 题意:n个数 q个询问,每一个询问有l和r,问你l到r这段区间中最少能分成几段,每一段中的数都是互质的. 思路:首先预处理出每一个点向 ...

  3. Codeforces Round #717 (Div. 2)

    Codeforces Round #717 (Div. 2) CodeForces 1516 题号 题目 知识点 A Tit for Tat 贪心 B AGAGA XOOORRR 思维题 C Baby ...

  4. Codeforces Round #143 (Div. 2) (ABCD 思维场)

    题目连链接:http://codeforces.com/contest/231 A. Team time limit per test:2 seconds memory limit per test: ...

  5. Codeforces Round #250 (Div. 2) (ABCD题解)

    比赛链接:http://codeforces.com/contest/437 A. The Child and Homework time limit per test:1 second memory ...

  6. Codeforces Round #717 (Div. 2) 1516 A. Tit for Tat(模拟)

    LINK 记∑i=1n−1ai=sum\sum\limits_{i=1}^{n-1}a_i=sumi=1∑n−1​ai​=sum 如果可以,我们可以让前n−1n-1n−1个数都减成000,然后ana_ ...

  7. Codeforces Round #717 Div.2

    凌晨睡不着 练cf算了 A. Tit for Tat 题意:一行数字,最多k个操作,每次操作可以把不同的两个数一个+1一个-1,并且操作完数字不能为负,问字典序最小的方案. sb题,选头部数字减尾部数 ...

  8. Codeforces Round #777 (Div. 2) ABCD题解

    A-Madoka and Math Dad 题目大意: 一个十进制数字(不含0),各个位上的和为n(n<=1000),且相邻位没有相同的数字,问这个数字最大可以是多少. 思路: 显然要使这个数字 ...

  9. Codeforces Round #695 (Div. 2)ABCD题解详析

    A. Wizard of Orz 首先保证第一块板子是999,那么第二块板子不可能是999,那么令第二块板子为888 只要在第二块板到达888的时候按下暂停,那么第一块是999,第三块板子也是999 ...

最新文章

  1. inline-block代替浮动布局float:left列表布局最佳方案
  2. 游戏美术干货:各大MOBA类游戏视觉包装设计解析
  3. Bitmap尺度变换
  4. Python框架篇之Django(基本流程、命令行、配置文件)
  5. atsl android auto吗,二十万就能开上凯迪拉克ATS-L,还有人在纠结买ATS还是GS?
  6. 数据库系统由计算机硬件软件,集美大学计算机工程学院数据库软件04B卷答案.doc...
  7. Redis 安装,主从配置及Sentinel配置自动Failover
  8. 文件服务器minio
  9. Houdini在UE4特效中的尝试分享
  10. java毕向东练习题,java中的String类的练习(来自毕向东老师视频资料)
  11. LabVIEW编程LabVIEW开发PXI-6704输出大于20mA的电流例程与相关资料
  12. 大叔配萝莉/正太的电影一般都不会差。。。
  13. 计算机主板品牌排行榜,电脑主板十大品牌排行榜
  14. 2019数学建模国赛C题
  15. 国际短信发不出去是怎么回事?
  16. 强化学习策略梯度方法之: REINFORCE 算法(从原理到代码实现)
  17. 将腾讯视频Qlv格式转为MP4格式(亲测可用)
  18. Microsoft OLE DB Provider for ODBC Drivers (0x80004005) 操作必须使用一个可更新的查询”错误的解决办法
  19. 【Baltic2008】黑手党(Mafia)(BSOI2891)
  20. 了解如何执行在Linux上运行的应用程序

热门文章

  1. SpringBoot从入门到精通-佟刚-专题视频课程
  2. python snownlp情感分析和词云分析
  3. 什么是RPN,ROIAlign?
  4. Cadence Allegro 17.4学习记录开始26-PCB Editor 17.4软件PCB中铺铜操作
  5. 【LintCode】Backpack 背包问题
  6. STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)
  7. 大学计算机专业实习报告
  8. 如何确定Z检验的值(查正态分布表时要注意中间的数字都是面积,最左边一列和最上面一行都是Z值)...
  9. 『华为』 [行业要闻]华为VS思科:21世纪的第一场战争 。
  10. linux内核中linux中readl()和writel()函数---用于读写寄存器