Candy Replenishing Robot

Find the Minimum Number

直接模拟

Melodious password

dfs输出方案

Poles

题意:有多个仓库,只能从后面的仓库运动前面的仓库,现在要把仓库合并成k个,移动一个仓库i到另个仓库j的代价是costi*(xi-xj),问最小代价。

解一下就会发现是个斜率优化,做k次就可以了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #define maxn 100101
  6. #define LL long long
  7. #define rep(i,l,r) for(int i=l;i<=r;i++)
  8. #define dow(i,l,r) for(int i=r;i>=l;i--)
  9. using namespace std;
  10.  
  11. LL sumd[maxn],sumw[maxn],f[][maxn],d[maxn],w[maxn];
  12. int n,m,p[maxn];
  13.  
  14. LL calc(int x,int y)
  15. {
  16. return f[y][x]-sumd[x];
  17. }
  18. int main()
  19. {
  20. scanf("%d %d",&n,&m);
  21. dow(i,,n) scanf("%lld %lld",&d[i],&w[i]);
  22. rep(i,,n) {
  23. sumw[i]=sumw[i-]+w[i];
  24. sumd[i]=sumd[i-]+d[i]*w[i];
  25. }
  26. // rep(i,1,n) printf("%d %lld %lld %lld\n",i,d[i],sumw[i],sumd[i]);printf("\n");
  27. int now=;
  28. rep(i,,n) f[][i]=-(sumw[i]-sumw[])*d[i]+sumd[i]-sumd[];
  29. // rep(i,1,n) printf("%lld ",f[0][i]);printf("\n");
  30. rep(i,,m) {
  31. now=-now;
  32. rep(j,,n) f[now][j]=;
  33. int head,tail;
  34. head=tail=;
  35. p[]=i-;
  36. rep(j,i,n) {
  37. // printf("%d %d\n",head,tail);
  38. // rep(k,head,tail) printf("%d ",p[k]);printf("\n");
  39. while (head<tail &&
  40. d[j]*(sumw[p[head+]]-sumw[p[head]])<calc(p[head],-now)-calc(p[head+],-now))
  41. ++head;
  42. f[now][j]=(sumw[p[head]]-sumw[j])*d[j]+(sumd[j]-sumd[p[head]])+f[-now][p[head]];
  43. // printf("%lld %lld\n",calc(p[tail],1-now),calc(j,1-now));
  44. while (head<tail &&
  45. (calc(p[tail],-now)-calc(j,-now))*(sumw[p[tail]]-sumw[p[tail-]])>(calc(p[tail-],-now)-calc(p[tail],-now))*(sumw[j]-sumw[p[tail]]))
  46. --tail;
  47. p[++tail]=j;
  48. }
  49. // rep(j,1,n) printf("%lld ",f[now][j]);printf("\n");
  50. }
  51. printf("%lld\n",f[now][n]);
  52. return ;
  53. }

Range Modular Queries

给一个数组,每次查询[l,r]中取模x为y的个数。

我使用莫队直接写的,复杂度比较迷,其实可以预处理出模数为[1,10]的情况再莫队

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #define maxn 50000
  6. #define LL long long
  7. #define rep(i,l,r) for(int i=l;i<=r;i++)
  8. using namespace std;
  9.  
  10. typedef struct {
  11. int l,r,k,id,x,y;
  12. }Que;
  13. Que que[maxn];
  14. int cmp(Que x,Que y)
  15. {
  16. if (x.k!=y.k) return x.k<y.k;
  17. return x.r<y.r;
  18. }
  19. int num[maxn],c[maxn],n,m,ans[maxn];
  20.  
  21. int main()
  22. {
  23. scanf("%d %d",&n,&m);
  24. rep(i,,n-) scanf("%d",num+i);
  25. int len=sqrt(n);
  26. rep(i,,m-) {
  27. scanf("%d %d %d %d",&que[i].l,&que[i].r,&que[i].x,&que[i].y);
  28. que[i].id=i;
  29. que[i].k=que[i].l/len;
  30. }
  31. sort(que,que+m,cmp);
  32. int i=;
  33. while (i<m) {
  34. // printf("%d\n",i);
  35. int k=que[i].k;
  36. memset(c,,sizeof(c));
  37. rep(j,que[i].l,que[i].r) ++c[num[j]];
  38. int now;
  39. now=que[i].y;
  40. while (now<maxn) ans[que[i].id]+=c[now],now+=que[i].x;
  41. // printf("!!\n");
  42. ++i;
  43. while (que[i].k==k&&i<m) {
  44. // printf("!!\n");
  45. rep(j,que[i].l,que[i-].l-) c[num[j]]++;
  46. rep(j,que[i-].l,que[i].l-) c[num[j]]--;
  47. rep(j,que[i-].r+,que[i].r) c[num[j]]++;
  48. rep(j,que[i].r+,que[i-].r) c[num[j]]--;
  49. now=que[i].y;
  50. while (now<maxn) ans[que[i].id]+=c[now],now+=que[i].x;
  51. ++i;
  52. }
  53. // printf("!!!\n");
  54. }
  55. rep(i,,m-) printf("%d\n",ans[i]);
  56. return ;
  57. }

标解的方法显然更好,

分两部分处理,1-k和k到n(k=sqrt(n));

对于第一部分,建立一个pos[i][j]的vector表示模数为i,结果为j的数的下标,每次查询就直接二分找出下标,相减就是个数。

对于第二部分,建立一个poss[i]的vector表示数为i的下标,对于每次询问从x开始,每次查询l,r区间有多少个这个数,一样是二分查找下标相减

A Graph Problem

题意:给一个图,让你选出其中一些点,使得这些点中边组成的三角形/点的个数最大。

求比值最大显然是01分数规划,化简一下就是y-g*x=0,这是一个最大权闭合图,用网络流建图解决。记住收益=正的收益-最小割(最大流),收益>0就是存在方案。不过最后要输出方案我gg了,一个是精度,另一个是最后要用l重新跑一遍,然后找出和s不在一个集合的点,就是从s开始dfs找不到的点,

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #define LL long long
  6. #define maxn 100000
  7. #define maxm 100000
  8. #define rep(i,l,r) for(int i=l;i<=r;i++)
  9. #define dow(i,l,r) for(int i=r;i>=l;i--)
  10. #define repedge(i,x) for(int i=cur[x];i>=0;i=e[i].next)
  11. #define repedge2(i,x) for(int i=cur[x];i>=0;i=e[i].next)
  12. #define inf 10000
  13. using namespace std;
  14.  
  15. typedef struct {
  16. int toward,next;
  17. double cap;
  18. } Edge;
  19.  
  20. Edge e[maxm];
  21. int d[maxn],chose[maxn],gap[maxn],fi[maxn],cur[maxn],n,m,tot1,total,tar[maxn][],ap[][],s,t;
  22. double esp=0.000000001;
  23.  
  24. void add(int j,int k,double l)
  25. {
  26. e[total].toward=k;
  27. e[total].next=fi[j];
  28. fi[j]=total;
  29. e[total].cap=l;
  30. ++total;
  31. }
  32.  
  33. void addedge(int j,int k,double l)
  34. {
  35. add(j,k,l);
  36. add(k,j,);
  37. }
  38.  
  39. double sap(int x,double flow)
  40. {
  41. // printf("%d %lf\n",x,flow);
  42. if (x==t) return flow;
  43. double now=;
  44. repedge(i,x) {
  45. int too=e[i].toward;
  46. if (d[x]==d[too]+ && e[i].cap>) {
  47. double more=sap(too,min(e[i].cap,flow-now));
  48. e[i].cap-=more;
  49. e[i^].cap+=more;
  50. cur[x]=i;
  51. if (flow==(now+=more)) return flow;
  52. }
  53. }
  54. if (!(--gap[d[x]])) d[s]=t;
  55. gap[++d[x]]++;
  56. cur[x]=fi[x];
  57. return now;
  58. }
  59.  
  60. double maxflow()
  61. {
  62. rep(i,,t) d[i]=,gap[i]=,cur[i]=fi[i];
  63. gap[]=t;
  64. double sum=;
  65. while (d[s]<t) sum+=sap(s,inf);
  66. return sum;
  67. }
  68.  
  69. void dfs(int x)
  70. {
  71. // printf("%d\n",x);
  72. chose[x]=;
  73. repedge2(i,x) {
  74. int too=e[i].toward;
  75. // printf("\t%d %lf\n",too,e[i].cap);
  76. if (e[i].cap>esp && !chose[too]) dfs(too);
  77. }
  78. }
  79. int main()
  80. {
  81. scanf("%d",&n);
  82. rep(i,,n)
  83. rep(j,,n) scanf("%d",&ap[i][j]);
  84. tot1=;
  85. rep(i,,n)
  86. rep(j,i+,n)
  87. rep(k,j+,n)
  88. if (ap[i][j] && ap[i][k] && ap[j][k]) {
  89. ++tot1;
  90. tar[tot1][]=i;
  91. tar[tot1][]=j;
  92. tar[tot1][]=k;
  93. }
  94. s=n+tot1+;t=n+tot1+;
  95. double l=,r=;
  96. while (r-l>=esp) {
  97. double mid=(l+r)/2.0;
  98. // printf("%lf\n",mid);
  99. total=;
  100. rep(i,,t) fi[i]=-;
  101. rep(i,,tot1)
  102. rep(j,,) addedge(tar[i][j],i+n,inf);
  103. rep(i,,n) addedge(s,i,mid);
  104. rep(i,,tot1) addedge(i+n,t,);
  105. if (tot1-maxflow()>) l=mid;
  106. else r=mid;
  107. }
  108. // printf("%lf %lf %lf\n",l,r,(l+r)/2);
  109. total=;
  110. rep(i,,t) fi[i]=-;
  111. rep(i,,tot1)
  112. rep(j,,) addedge(tar[i][j],i+n,inf);
  113. rep(i,,n) addedge(s,i,l);
  114. rep(i,,tot1) addedge(i+n,t,);
  115. maxflow();
  116. memset(chose,,sizeof(chose));
  117. dfs(s);
  118. int tot2=;
  119. rep(i,,n) if (!chose[i]) ++tot2;
  120. printf("%d\n",tot2);
  121. rep(i,,n) if (!chose[i]) printf("%d ",i);
  122. printf("\n");
  123. return ;
  124. }

Substring Queries

给多个字符串,求出其中某两个字符串的lcp。

建立一个广义后缀数组。然后记录每个字符串的后缀在sa[]中的位置,对于一个询问,s1,s2,取出s1的每一个后缀和s2的每一个后缀算一个lcp,可以发现只会和s2中最接近这个后缀的两个后缀有关系,也就是每次都是单调的,一次询问就是s1+s2的后悔次数,然后做两个小优化,一个是把询问一样的一起处理,一个是每次s1选取那个短一点的,最后摊下来是一个比较好看的复杂度。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<vector>
  6. #define maxn 210000
  7. #define maxm 210000
  8. #define rep(i,l,r) for(int i=l;i<=r;i++)
  9. #define dow(i,l,r) for(int i=r;i>=l;i--)
  10. using namespace std;
  11.  
  12. vector<int> vec[maxn];
  13. int len,n,f[][maxn],tot,sa[maxn],ran[maxn],h[maxn],num[maxn],d[maxn],ans[maxn],x[maxn],y[maxn],c[maxn],m,size[maxn],col[maxn];
  14. char s[maxn],st[maxn];
  15.  
  16. typedef struct {
  17. int l,r,id;
  18. }Que;
  19. Que que[maxn];
  20. int cmp(Que a,Que b)
  21. {
  22. if (a.r!=b.r) return a.r<b.r;
  23. return a.l<b.l;
  24. }
  25.  
  26. void makesa()
  27. {
  28. for(int p=;p<len;p*=) {
  29. // printf("%d\n",p);
  30. rep(i,,p) y[i]=len-p+i;
  31. int j=p;
  32. rep(i,,len)
  33. if (sa[i]>p) y[++j]=sa[i]-p;
  34. rep(i,,len) x[i]=ran[y[i]];
  35. memset(c,,sizeof(c));
  36. rep(i,,len) c[x[i]]++;
  37. rep(i,,tot) c[i]+=c[i-];
  38. dow(i,,len) sa[c[x[i]]--]=y[i];
  39. x[sa[tot=]]=;
  40. rep(i,,len) {
  41. tot+=(ran[sa[i]]!=ran[sa[i-]] || ran[sa[i]+p]!=ran[sa[i-]+p]);
  42. x[sa[i]]=tot;
  43. }
  44. rep(i,,len) ran[i]=x[i];
  45. // rep(i,1,len) printf("%s\n",&s[sa[i]]);
  46. if (tot==len) break;
  47. }
  48. rep(i,,len) sa[ran[i]]=i;
  49. }
  50.  
  51. void makeheight()
  52. {
  53. h[]=;
  54. int last=;
  55. rep(i,,len) {
  56. last=max(last-,);
  57. if (ran[i]==) continue;
  58. int j=sa[ran[i]-];
  59. while (s[i+last]==s[j+last]) ++last;
  60. h[ran[i]]=last;
  61. }
  62. }
  63.  
  64. void into()
  65. {
  66. scanf("%d %d",&n,&m);
  67. len=;
  68. rep(i,,n) {
  69. scanf("%s",st);
  70. size[i]=strlen(st);
  71. s[++len]='#';
  72. rep(j,,size[i]-) {
  73. s[++len]=st[j];
  74. d[len]=size[i]-j;
  75. col[len]=i;
  76. }
  77. }
  78. s[++len]='$';
  79. memset(c,,sizeof(c));
  80. rep(i,,len) c[x[i]=s[i]]++;
  81. rep(i,,) c[i]+=c[i-];
  82. dow(i,,len) sa[c[x[i]]--]=i;
  83. ran[sa[tot=]]=;
  84. rep(i,,len)
  85. ran[sa[i]]=(tot+=(x[sa[i]]!=x[sa[i-]]));
  86. // printf("%d\n",tot);
  87. // rep(i,1,len) printf("%s\n",&s[sa[i]]);
  88. makesa();
  89. // printf("!!!\n");
  90. makeheight();
  91. // printf("!!!\n");
  92. // rep(i,1,len) printf("%3c",s[i]);printf("\n");
  93. // rep(i,1,len) printf("%3d",sa[i]);printf("\n");
  94. // rep(i,1,len) printf("%3d",rank[i]);printf("\n");
  95. // rep(i,1,len) printf("%3d",h[i]);printf("\n");
  96. // rep(i,1,len) printf("%3d",col[i]);printf("\n");
  97. // rep(i,1,len) printf("%s\n",&s[sa[i]]);
  98. rep(i,,len) h[i]=min(h[i],d[sa[i]]);
  99. rep(i,,len) {
  100. int j=col[sa[i]];
  101. // printf("%d %d\n",j,i);
  102. if (j) vec[j].push_back(i);
  103. }
  104. // rep(i,1,n) {
  105. // printf("%d:%d",i,vec[i].size());
  106. // rep(j,0,vec[i].size()-1) printf("%3d",vec[i][j]);
  107. // printf("\n");
  108. // }
  109. rep(i,,len) f[][i]=h[i];
  110. rep(i,,)
  111. rep(j,,len-(<<i)+)
  112. f[i][j]=min(f[i-][j],f[i-][j+(<<(i-))]);
  113. // rep(i,0,16)
  114. // rep(j,1,len-(1<<i)+1)
  115. // printf("%d %d %d %d\n",i,j,j-1+(1<<i),f[i][j]);
  116. // printf("!!\n");
  117. rep(i,,len) num[i]=(int)floor(log(i)/log());
  118. }
  119.  
  120. int calc(int l,int r)
  121. {
  122. // printf("%d %d\n",l,r);
  123. if (l>r) swap(l,r);
  124. l++;
  125. int i=num[r-l+];
  126. return min(f[i][l],f[i][r+-(<<i)]);
  127. }
  128.  
  129. void ask()
  130. {
  131. rep(i,,m-) {
  132. scanf("%d %d",&que[i].l,&que[i].r);
  133. ++que[i].r;
  134. ++que[i].l;
  135. if (size[que[i].l]<size[que[i].r]) swap(que[i].l,que[i].r);
  136. que[i].id=i;
  137. }
  138. sort(que,que+m,cmp);
  139. // printf("!!\n");
  140. // rep(i,0,m-1) printf("%d %d %d\n",que[i].l,que[i].r,que[i].id);
  141. rep(i,,m-) {
  142. if (i && que[i].l==que[i-].l && que[i].r==que[i-].r) ans[que[i].id]=ans[que[i-].id];
  143. else {
  144. int now=,x=que[i].r,y=que[i].l,last=;
  145. rep(j,,size[x]-) {
  146. while (now+<size[y] && vec[y][now+]<vec[x][j]) ++now;
  147. last=max(last,calc(vec[x][j],vec[y][now]));
  148. if (now<size[y]) last=max(last,calc(vec[x][j],vec[y][now+]));
  149. }
  150. ans[que[i].id]=last;
  151. }
  152. }
  153. rep(i,,m-) printf("%d\n",ans[i]);
  154. }
  155. int main()
  156. {
  157. into();
  158. ask();
  159. return ;
  160. }

说到底还是自己太弱,很怠惰,本来倒数第二题思路是对的一直不敢写,想想这星期除了cf就只有这一点点练习,真是的!

【hackerrank】Week of Code 30的更多相关文章

  1. 【hackerrank】Week of Code 26

    在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题…… Army Game 然后给出n*m,问需要多少个小红点能全部占领 解法:乘 ...

  2. 【LeetCode】89.Gary Code

    Problem: The gray code is a binary numeral system where two successive values differ in only one bit ...

  3. 【转】Visual Studio Code必备插件

    先ctrl+shift+p,弹出命令面板-选中Extensions:Install Extensions 或者直接点击左侧栏这个扩展按钮(Ctrl+Shift+X) 然后左侧栏就会显示出很多插件,如图 ...

  4. 【HackerRank】Running Time of Quicksort

    题目链接:Running Time of Quicksort Challenge In practice, how much faster is Quicksort (in-place) than I ...

  5. 【LeetCode】89. Gray Code

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...

  6. 【转】Visual Studio Code 使用Git进行版本控制

    原文链接:https://www.cnblogs.com/xuanhun/p/6019038.html?utm_source=tuicool&utm_medium=referral 本来认为此 ...

  7. 【编辑器】Visual Studio Code

    1.官网:https://code.visualstudio.com/Download 2.插件:https://marketplace.visualstudio.com/VSCode https:/ ...

  8. 【HackerRank】How Many Substrings?

    https://www.hackerrank.com/challenges/how-many-substrings/problem 题解 似乎是被毒瘤澜澜放弃做T3的一道题(因为ASDFZ有很多人做过 ...

  9. 【EF】EF框架 Code First Fluent API

    在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreatin ...

随机推荐

  1. 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  2. steam更新出错 应用运行中

    游戏程序没有完全关闭,仍在后台运行. 打开任务处理器,选择进程,下面找到TslGame,关闭之.

  3. react-native android 初始化问题

    最近开始接触rn,官方起手,装了一堆工具,然后启动项目的时候出现了一堆问题,这里针对我遇到的一些问题提供一些解决方案. 本人开发环境mac,在启动ios的时候没啥大问题,可以直接启动,这里提示一点,因 ...

  4. cf#516C. Oh Those Palindromes(最多回文子串的字符串排列方式,字典序)

    http://codeforces.com/contest/1064/problem/C 题意:给出一个字符串,要求重新排列这个字符串,是他的回文子串数量最多并输出这个字符串. 题解:字典序排列的字符 ...

  5. uvaoj1225Digit Counting(暴力)

    Trung is bored with his mathematics homeworks. He takes a piece of chalk and starts writing a sequen ...

  6. gitlab-登录账户遇到ERROR: Permission to XXX.git denied to user报错怎么办

    碰到这个问题就意味着没有访问账户的权限,没有把访问电脑与访问账户用ssh_key关联起来,解决流程: 1.查看本地是否有ssh_key 笔者用的是git bash来输入命令 ls -al ~/.ssh ...

  7. Http的请求和响应

    请求有客户端发起:可分为4个部分,请求方法(Requestmethod).请求的网址(Request URL).请求头(Request Headers).请求体(Request Body) 1.请求方 ...

  8. 腾讯云ubuntu安装使用MySQL

    安装步骤 ubuntu@VM---ubuntu:~$ sudo apt-get install mysql-server (密码: root/root) ubuntu@VM---ubuntu:~$ s ...

  9. halcon基础应用和方法经验分享

    halcon基础应用和方法经验分享 一.Halcon软件 的安装 安装一直点下一步就好了,这个过程很简单,就不讲了 二.Halcon软件license安装 Halcon是商业视觉软件,是需要收费的,但 ...

  10. 3D动态人脸识别技术分析——世纪晟人脸识别实现三维人脸建模

    - 目录 - 国内3D动态人脸识别现状概况 - 新形势下人脸识别技术发展潜力 - 基于深度学习的3D动态人脸识别技术分析 1. 非线性数据建模方法 2. 基于3D变形模型的人脸建模 - 案例结合——世 ...