CF习题集一

一、CF915E Physical Education Lessons

题目描述

\(Alex\)高中毕业了,他现在是大学新生。虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外。快要期末了,但是不幸的\(Alex\)的体育学分还是零蛋!

\(Alex\)可不希望被开除,他想知道到期末还有多少天的工作日,这样他就能在这些日子里修体育学分。但是在这里计算工作日可不是件容易的事情:

从现在到学期结束还有 \(n\) 天(从 \(1\) 到 \(n\) 编号),他们一开始都是工作日。接下来学校的工作人员会依次发出 \(q\) 个指令,每个指令可以用三个参数 \(l,r,k\) 描述:

如果 \(k=1\),那么从 \(l\) 到 \(r\) (包含端点)的所有日子都变成非工作日。

如果 \(k=2\),那么从 \(l\) 到 \(r\) (包含端点)的所有日子都变成工作日。

帮助\(Alex\)统计每个指令下发后,剩余的工作日天数。

输入格式:

第一行一个整数 \(n\),第二行一个整数 \(q\)\((1\le n\le 10^9,\;1\le q\le 3\cdot 10^5)\),分别是剩余的天数和指令的个数。

接下来 \(q\) 行,第 \(i\) 行有 \(3\) 个整数 \(l_i,r_i,k_i\)​,描述第 \(i\) 个指令\((1\le l_i,r_i\le n,\;1\le k\le 2)\)。

输出格式:

输出 \(q\) 行,第 \(i\) 行表示第 \(i\) 个指令被下发后剩余的工作日天数。

输入输出样例

输入 #1

4

6

1 2 1

3 4 1

2 3 2

1 3 2

2 4 1

1 4 2

输出 #1

2

0

2

3

1

4

分析

这一道题只有区间赋值操作,因此我们用珂朵莉树随便搞搞就可以了

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=3e5+5;
  4. #define sit set<asd>::iterator
  5. struct asd{
  6. int l,r;
  7. mutable int val;
  8. bool operator < (const asd& A)const{
  9. return l<A.l;
  10. }
  11. asd(int aa,int bb,int cc){
  12. l=aa,r=bb,val=cc;
  13. }
  14. asd(int aa){
  15. l=aa;
  16. }
  17. };
  18. set<asd> s;
  19. sit Split(int wz){
  20. sit it=s.lower_bound(asd(wz));
  21. if(it!=s.end() && it->l==wz) return it;
  22. it--;
  23. int l=it->l,r=it->r,val=it->val;
  24. s.erase(it);
  25. s.insert(asd(l,wz-1,val));
  26. return s.insert(asd(wz,r,val)).first;
  27. }
  28. int sum;
  29. void Assign(int l,int r,int val){
  30. sit it2=Split(r+1),it1=Split(l);
  31. for(sit it=it1;it!=it2;it++){
  32. sum-=it->val*(it->r-it->l+1);
  33. }
  34. s.erase(it1,it2);
  35. s.insert(asd(l,r,val));
  36. sum+=(r-l+1)*val;
  37. }
  38. int main(){
  39. int n,q;
  40. scanf("%d%d",&n,&q);
  41. s.insert(asd(1,n,1));
  42. sum=n;
  43. while(q--){
  44. int aa,bb,cc;
  45. scanf("%d%d%d",&aa,&bb,&cc);
  46. if(cc==1){
  47. Assign(aa,bb,0);
  48. } else {
  49. Assign(aa,bb,1);
  50. }
  51. printf("%d\n",sum);
  52. }
  53. return 0;
  54. }

二、CF915C Permute Digits

题目描述

给出两个正整数\(a\),\(b\)。在十进制下重排\(a\),构造一个不超过\(b\)的最大数,不能有前导零。允许不去重排\(a\)。

输入格式:

第一行一个数\(a\) \((1\le a\le 10^{18})\)。第二行一个数\(b\)\((1\le b\le 10^{18})\)

数没有前导零,数据保证有解。

输出格式:

输出一个数,表示\(a\)重排后不超过\(b\)的最大数,不应该有前导零。

输出的数的长度应该与\(a\)相等,它应该是\(a\)的一个排列。

分析

这道题可以用贪心解决,分为两种情况

1、\(a\)的位数小于\(b\)的位数,此时我们把\(a\)的所有位从大到小排一下序即可

2、\(a\)的位数和\(b\)的位数相等,那么\(a\)的最高位一定小于等于\(b\)的最高位

此时又可以分成两种情况

第一种即\(a\)的最高位填的数字比\(b\)的最高位填的数字小

我们把剩下的从大到小排一下序即可

另一种就是\(a\)和\(b\)最高位上的数字相等

我们可以选择一个满足条件的最大值填入\(a\)的第二位,对于其他位也是如此

这样看起来似乎没有什么问题,但是对于下面的这一组数据

15778899

98715689

如果我们用简单的贪心去匹配,那么\(a\)的前\(5\)位会分别被填上\(98715\)

匹配到第\(6\)位时,我们会发现此时没有合适的数字去匹配

因此,我们的贪心要能够支持回溯操作,即可持久化贪心

如果当前匹配不成功的话,那么回溯到上一状态继续匹配

时间复杂度\(O(玄学)\)

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int maxn=25;
  5. int a[maxn],cnt[maxn],ans[maxn],xn[maxn];
  6. char s[maxn],s1[maxn];
  7. signed main(){
  8. scanf("%s%s",s+1,s1+1);
  9. int len=strlen(s+1),len1=strlen(s1+1);
  10. for(int i=1;i<=len;i++) a[i]=s[i]-'0';
  11. if(len1>len){
  12. sort(a+1,a+1+len);
  13. for(int i=len;i>=1;i--) printf("%lld",a[i]);
  14. printf("\n");
  15. return 0;
  16. }
  17. int qnd=0;
  18. for(int i=1;i<=len;i++){
  19. cnt[a[i]]++;
  20. xn[a[i]]++;
  21. }
  22. //处理出每一个数字在原序列中出现的个数
  23. bool bishangyigeda;
  24. if(cnt[s1[1]-'0']){
  25. cnt[s1[1]-'0']--;
  26. ans[1]=s1[1]-'0';
  27. int j=2;
  28. bishangyigeda=0;
  29. while(j<=len1){
  30. bool jud=0;
  31. if(bishangyigeda==0){
  32. for(int k=s1[j]-'0';k>=0;k--){
  33. if(cnt[k]){
  34. cnt[k]--;
  35. ans[j]=k;
  36. jud=1;
  37. if(k!=s1[j]-'0')bishangyigeda=1;
  38. break;
  39. }
  40. }
  41. } else {
  42. for(int k=9;k>=0;k--){
  43. if(cnt[k]){
  44. cnt[k]--;
  45. ans[j]=k;
  46. jud=1;
  47. break;
  48. }
  49. }
  50. }
  51. if(jud==0) qnd=1;
  52. int now=j;
  53. while(qnd==1 && j>=2){
  54. cnt[ans[j-1]]++;
  55. j--;
  56. for(int k=ans[j]-1;k>=0;k--){
  57. if(cnt[k]){
  58. cnt[k]--;
  59. ans[j]=k;
  60. jud=1;
  61. if(k!=s1[j]-'0')bishangyigeda=1;
  62. break;
  63. }
  64. }
  65. if(jud==1) qnd=0;
  66. }
  67. if(j==1 && qnd==1) break;
  68. if(jud==1) qnd=0;
  69. j++;
  70. }
  71. }
  72. //判断a和b的最高位是否相等
  73. if(qnd==0 && xn[s1[1]-'0']){
  74. for(int i=1;i<=len1;i++) printf("%lld",ans[i]);
  75. printf("\n");
  76. } else {
  77. memset(ans,0,sizeof(ans));
  78. for(int i=s1[1]-'0'-1;i>=1;i--){
  79. if(xn[i]) {
  80. xn[i]--;
  81. ans[1]=i;
  82. break;
  83. }
  84. }
  85. int j=2;
  86. while(j<=len1){
  87. for(int k=9;k>=0;k--){
  88. if(xn[k]){
  89. xn[k]--;
  90. ans[j]=k;
  91. break;
  92. }
  93. }
  94. j++;
  95. }
  96. for(int i=1;i<=len1;i++) printf("%lld",ans[i]);
  97. printf("\n");
  98. }
  99. return 0;
  100. }

三、CF766D Mahmoud and a Dictionary

题目描述

给一些单词,它们可能是同义或者反义,给出一些关系定义,从前面的定义开始建立关系,如果有的关系定义和之前的冲突输出\(NO\),否则输出\(YES\)。然后查询\(q\)次单词\(x\)和单词\(y\)的关系。

分析

比较基本的扩展域并查集的题

对于一个点,我们把它拆成两个点,分别代表它本身和它的反义单词

如果原来的单词标号为\(xx\),那么反义单词标号为\(xx+n\)

在建立关系时,如果两个单词\(aa\)、\(bb\)是同义单词,那么我们将\(aa\)和\(bb\),\(aa+n\)和\(bb+n\)并在一起

如果是反义单词,我们将\(aa\)和\(bb+n\),\(bb\)和\(aa+n\)并在一起

查询时同理

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. map<string,int> mp;
  4. const int maxn=1e6+5;
  5. int fa[maxn];
  6. int zhao(int xx){
  7. if(fa[xx]==xx) return xx;
  8. return fa[xx]=zhao(fa[xx]);
  9. }
  10. void bing(int aa,int bb){
  11. fa[zhao(aa)]=zhao(bb);
  12. }
  13. int main(){
  14. for(int i=0;i<maxn;i++) fa[i]=i;
  15. int n,m,k;
  16. cin>>n>>m>>k;
  17. string s;
  18. for(int i=1;i<=n;i++){
  19. cin>>s;
  20. mp[s]=i;
  21. }
  22. int aa;
  23. string s1,s2;
  24. for(int i=1;i<=m;i++){
  25. cin>>aa>>s1>>s2;
  26. int xx=zhao(mp[s1]);
  27. int yy=zhao(mp[s2]);
  28. int zz=zhao(mp[s1]+n);
  29. int qq=zhao(mp[s2]+n);
  30. if(xx==yy){
  31. if(aa==1) printf("YES\n");
  32. else printf("NO\n");
  33. } else if(yy==zz){
  34. if(aa==2) printf("YES\n");
  35. else printf("NO\n");
  36. } else if(xx==qq){
  37. if(aa==2) printf("YES\n");
  38. else printf("NO\n");
  39. }else {
  40. if(aa==1){
  41. bing(mp[s1],mp[s2]);
  42. bing(mp[s1]+n,mp[s2]+n);
  43. } else {
  44. bing(mp[s1],mp[s2]+n);
  45. bing(mp[s2],mp[s1]+n);
  46. }
  47. printf("YES\n");
  48. }
  49. }
  50. for(int i=1;i<=k;i++){
  51. cin>>s1>>s2;
  52. int xx=zhao(mp[s1]);
  53. int yy=zhao(mp[s2]);
  54. int zz=zhao(mp[s1]+n);
  55. int qq=zhao(mp[s2]+n);
  56. if(xx==yy || zz==qq) printf("1\n");
  57. else if(yy==zz || xx==qq) printf("2\n");
  58. else printf("3\n");
  59. }
  60. return 0;
  61. }

四、CF533B Work Group

题目描述

公司有\(n\)个人,\(1\)是总裁,每个人有一个直接上司。每一个人有一个权值,要求找一个集合,使集合中所有人权值之和最大。其中每一个人的下属(直接,间接)总数都必须是偶数。输出最大权值。

分析

树形\(DP\)

我们设\(f[x][0][0]\)为以\(x\)为根的子树选择了偶数个节点,其中编号为\(x\)的节点不选所得到的最大权值

我们设\(f[x][1][0]\)为以\(x\)为根的子树选择了偶数个节点,其中编号为\(x\)的节点选择所得到的最大权值

我们设\(f[x][0][1]\)为以\(x\)为根的子树选择了奇数个节点,其中编号为\(x\)的节点不选所得到的最大权值

我们设\(f[x][1][1]\)为以\(x\)为根的子树选择了奇数个节点,其中编号为\(x\)的节点选择所得到的最大权值

每次转移时,我们记录在\(x\)的儿子节点中选择奇数个节点的最大值\(maxj\),选择偶数个节点的最大值\(maxo\),最后更新\(x\)的\(f\)值即可

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e6+5;
  4. typedef long long ll;
  5. ll f[maxn][2][2],a[maxn];
  6. vector<ll> g[maxn];
  7. void dfs(ll now){
  8. if(g[now].size()==0){
  9. f[now][0][0]=0;
  10. f[now][1][0]=a[now];
  11. f[now][0][1]=f[now][1][1]=-0x3f3f3f3f;
  12. return;
  13. }
  14. ll maxj=0,maxo=0;
  15. for(ll i=0;i<g[now].size();i++){
  16. ll u=g[now][i];
  17. dfs(u);
  18. ll aa=maxj,bb=maxo;
  19. if(aa!=0) maxj=max(aa+max(f[u][0][0],f[u][1][1]),bb+max(f[u][0][1],f[u][1][0]));
  20. else maxj+=(bb+max(f[u][0][1],f[u][1][0]));
  21. if(aa!=0) maxo=max(aa+max(f[u][0][1],f[u][1][0]),bb+max(f[u][0][0],f[u][1][1]));
  22. else maxo+=max(f[u][0][0],f[u][1][1]);
  23. }
  24. f[now][0][0]=maxo;
  25. f[now][1][0]=maxo+a[now];
  26. f[now][0][1]=maxj;
  27. }
  28. int main(){
  29. ll n;
  30. scanf("%lld",&n);
  31. ll rt;
  32. for(ll i=1;i<=n;i++){
  33. ll aa,bb;
  34. scanf("%lld%lld",&aa,&bb);
  35. if(aa==-1) rt=i;
  36. else g[aa].push_back(i);
  37. a[i]=bb;
  38. }
  39. dfs(rt);
  40. printf("%lld\n",max(max(f[rt][0][1],f[rt][0][0]),f[rt][1][0]));
  41. return 0;
  42. }

CF习题集一的更多相关文章

  1. CF习题集二

    CF习题集二 一.CF507E Breaking Good 题目描述 \(Breaking Good\)这个游戏对于有经验的玩家来说也有一定的难度. 游戏的主角小明希望加入一个叫斧头帮的犯罪团伙.这个 ...

  2. CF习题集三

    CF习题集三 一.CF8C Looking for Order 题目描述 \(Lena\)喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她 ...

  3. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  6. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  9. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

随机推荐

  1. 07 . Jenkins忘记root密码

    重置Jenkins用户名密码 忘记用户名密码(如图)不管是忘记用户名密码还是误删jenkins目录下的users文件都可以使用下面的方式找回密码,我的版本是Jenkins 2.134 配置config ...

  2. 基层教师 - CMD命令之net命令与IPC连接

    1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连接: net use \ ...

  3. java 基本语法(十) 数组(三) 二维数组

    1.如何理解二维数组? 数组属于引用数据类型数组的元素也可以是引用数据类型一个一维数组A的元素如果还是一个一维数组类型的,则,此数组A称为二维数组. 2.二维数组的声明与初始化 正确的方式: int[ ...

  4. 10-Python文件操作

    一.文本文件和二进制文件 文本文件存储的是普通“字符”文本,python 默认为unicode 字符集(两个字节表示 一个字符,最多可以表示:65536 个). 二进制文件:二进制文件吧数据内容用‘字 ...

  5. CSS-好玩的样式(用高斯模糊制作平缓突起)

    一.效果图: 应用: 二.上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  6. StringTable结构以及基本调优

    StringTable底层实现类似于HashTable,由数组和链表组成,数组又称为桶数组.比如有这样一段代码: public class Demo4 { public static void mai ...

  7. Ethical Hacking - NETWORK PENETRATION TESTING(17)

    MITM - bypassing HTTPS Most websites use https in their login pages, this means that these pages are ...

  8. dva + umi 学习笔记

    首先,这里的 dva + umi 不是说学习dva和umi,而是基于 dva + umi 的react前端开发脚手架,这是我的目标. 一开始,我在dva文档的例子里看到了 dva + umi 的例子. ...

  9. docker环境部署mysql

    参考文档 docker官方:https://hub.docker.com/_/mysql/?tab=description 部署步骤 1. 拉取镜像 这里我拉取了tag为5.7的镜像 docker p ...

  10. org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication

    Ftp问题 最近遇到了ftp读取中文乱码的问题,代码中使用的是FtpClient.google一下找到了解决方案. FTP协议里面,规定文件名编码为iso-8859-1,FTP类中默认的编码也是这个. ...