problem1 link

不包含$gridConnections$ 的联通块一定是连在所有包含$gridConnections$的联通块中最大的那一块上。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class AddElectricalWires {static class UnionSet {public int[] father=null;public int[] size=null;public int[] edges=null;public UnionSet(int n) {father=new int[n];size=new int[n];edges=new int[n];for(int i=0;i<n;++i) {father[i]=i;size[i]=1;}}public int getFather(int x) {if(father[x]==x) {return x;}return father[x]=getFather(father[x]);}public UnionSet merge(int x,int y) {int fx=getFather(x);int fy=getFather(y);if(fx!=fy) {father[fx]=fy;size[fy]+=size[fx];edges[fy]+=edges[fx]+1;}else {edges[fy]+=1;}return this;}}public int maxNewWires(String[] wires,int[] gridConnections) {final int n=wires.length;UnionSet unionSet=new UnionSet(n);for(int i=0;i<n;++i) {for(int j=i+1;j<n;++j) {if(wires[i].charAt(j)=='1') {unionSet.merge(i,j);}}}int result=0;long visited=0;int maxSize=0;for(int i=0;i<gridConnections.length;++i) {int t=gridConnections[i];int ft=unionSet.getFather(t);int sz=unionSet.size[ft];result+=sz*(sz-1)/2-unionSet.edges[ft];visited|=1l<<ft;if(sz>maxSize) {maxSize=sz;}}for(int i=0;i<n;++i) {if(i==unionSet.getFather(i)&&(0==(visited&(1l<<i)))) {int sz=unionSet.size[i];result+=sz*(sz-1)/2-unionSet.edges[i];result+=sz*maxSize;maxSize+=sz;}}return result;}
}

  

problem2 link

每个$base$的选择一定是$addresses[i]$或者$addresses[i]-k+1$。这样进行动态规划即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class ContiguousCache {public long minimumReads(int n, int k, int[] addresses) {List<Integer> list=new ArrayList<>();final int m=addresses.length;for(int i=0;i<m;++i) {final int t=addresses[i];if(t-k+1>=0) {list.add(t-k+1);}if(t<=n-k) {list.add(t);}else {list.add(n-k);}}int[] a=unique(list);final int p=a.length;long[][] f=new long[m][p];for(int i=0;i<m;++i) {for(int j=0;j<p;++j) {f[i][j]=-1;}}for(int i=0;i<p;++i){if(a[i]<=addresses[0]&&addresses[0]<a[i]+k) {f[0][i]=Math.min(n,a[i]+k-1)-a[i]+1;}}for(int i=1;i<m;++i) {final int r=addresses[i];for(int j=0;j<p;++j) {if(f[i-1][j]==-1) {continue;}for(int t=0;t<p;++t) {if(a[t]<=r&&r<a[t]+k) {long cost=f[i-1][j]+calCost(a[j],a[t],k);if(f[i][t]==-1||f[i][t]>cost) {f[i][t]=cost;}}}}}long result=-1;for(int i=0;i<p;++i) {if(f[m-1][i]==-1) {continue;}if(result==-1||result>f[m-1][i]) {result=f[m-1][i];}}return result;}int calCost(int p1,int p2,int k) {if(p1<p2) {if(p1+k<=p2) {return k;}return p2-p1;}else if(p1==p2) {return 0;}else {if(p2+k<=p1) {return k;}return p1-p2;}}int[] unique(List<Integer> list) {Collections.sort(list);int c=1;int pre=0;for(int i=1;i<list.size();++i) {if(list.get(i)==list.get(pre)) {continue;}++c;pre=i;}int[] a=new int[c];a[0]=list.get(0);c=1;for(int i=1;i<list.size();++i) {if(a[c-1]!=list.get(i)) {a[c++]=list.get(i);}}return a;}
}

  

problem3 link

首先进行梯形剖分。对于变形每条边$p,q$,分别向$x$轴做垂线,该边与垂线以及$x$轴可以组成一个梯形。对于$n$条边$n$个梯形来说,注意有的取正值有的取负值加起来就能得到整个内部的点个数。

对于一个梯形来说,内部点可以用公式$\sum_{i=0}^{n-1}\left \lfloor \frac{a+di}{m} \right \rfloor$来进行计算。

这里可以认为$0\leq a < m,0<b<m$,否则可以直接提出到外面进行计算。

对于某个$i$,$\left \lfloor \frac{a+di}{m} \right \rfloor$的值可以看作垂线$(i,0),(i,a+di)$与水平线$y=km$的交点个数,$1\leq k \leq \left \lfloor \frac{a+di}{m} \right \rfloor$

到这里可以换个角度计算。对于每条水平线有多少垂线与其有交点。按照这个思路,可转化计算的公式:

$\sum_{i=0}^{n-1}\left \lfloor \frac{a+di}{m} \right \rfloor$=$\sum_{k=0}^{L-1}\left \lfloor \frac{(a+dn)mod(m)+mk}{d} \right \rfloor$,其中$L=\left \lfloor \frac{a+dn}{m} \right \rfloor$

中间的推导就不写了。

等号后面的式子跟前面形式类似,所以可以继续转化,每次求和项都在减少。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class WifiPlanet {public long routersNeeded(int[] x, int[] y, int denom) {final int n=x.length;long result=0;for(int i=0;i<n;++i) {result+=cal(x[i],y[i],x[(i+1)%n],y[(i+1)%n],denom);}if(result<0) {result=-result;}return result;}long cal(long x1,long y1,long x2,long y2,long m) {if(x1==x2) {return 0;}if(x1>x2) {return -cal(x2,y2,x1,y1,m);}long L=(x1+m-1)/m*m;long R=(x2-1)/m*m;long n=(R-L)/m+1;return dfs((y1*(x2-x1)+(y2-y1)*(L-x1))/m,y2-y1,n,x2-x1);}long dfs(long a,long d,long n,long m) {if(n==0) {return 0;}if(d==0) {return a/m*n;}if(d<0) {return dfs(a+d*(n-1),-d,n,m);}if(a>=m) {return dfs(a%m,d,n,m)+a/m*n;}if(d>=m) {return dfs(a,d%m,n,m)+(d/m)*n*(n-1)/2;}return dfs((a+n*d)%m,m,(a+n*d)/m,d);}}

  

转载于:https://www.cnblogs.com/jianglangcaijin/p/7538124.html

topcoder srm 410 div1相关推荐

  1. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  2. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  3. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  4. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  5. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  6. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

  7. topcoder srm 635 div1

    problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...

  8. topcoder srm 495 div1

    problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...

  9. topcoder srm 325 div1

    problem1 link $g[i]$表示解决前$i$个的代价,那么$g[i]$是所有$g[j]+cost(j+1,i)$的最小值. import java.util.*; import java. ...

最新文章

  1. css兼容ie9 ie11,用webpack打包的css在ie9些有些css文件没有引进去是为什么 ie11可以...
  2. linux 进程防火墙连接管理,Linux系统管理初步(五)系统防火墙控制程序firewalld...
  3. 先进制造技术论文_干货分享:新能源汽车先进制造技术
  4. 学习STM32很简单?
  5. 自己动手构造编译系统:编译、汇编与链接2.1.3 符号表管理
  6. iNeuOS工业互联网操作系统,智慧用电测控应用案例
  7. 拿来就能用的前端酷炫登录注册模板
  8. 各代iphone尺寸_iPhone12与历代iPhone尺寸对比曝光:比iPhone8还小?
  9. hp 服务器可以安装win7系统安装,惠普HP预装Win10改Win7系统BIOS设置及安装教程
  10. nero如何刻录光盘
  11. 2021保研夏令营—中科院计算所,自动化所,上海交大计算机
  12. html闪屏代码,JS闪屏代码,闪瞎你的眼睛
  13. scala的linearization
  14. uboot dnw 源码分析
  15. mmclassification使用步骤与心得/ACCV实验记录
  16. win10管理员已阻止你运行此应用解决方法
  17. 怎么给当前计算机添加一个用户,电脑如何设置新用户 电脑创建新用户的方法...
  18. a-tabs defaultActiveKey默认值无效
  19. 异常 | ARM _data_abort 异常处理流程
  20. 【OpenJudge】反反复复

热门文章

  1. RocketMQ源码解析-PushConsumer(2)
  2. RabbbitMq 消费端自定义监听
  3. Go工程化 - 手摸手带你理解依赖注入
  4. 如何保证elasticsearch和mysql数据库的数据同步?
  5. RocketMQ核心架构设计思想
  6. 最全面的MySQL面试题大全-二
  7. ssm框架搭建+easyui增删改查实现
  8. 给,你要的Go学习路线图来啦
  9. Laravel源码解析之事件系统
  10. Zookeeper可视化工具PrettyZoo