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);
} }

  

topcoder srm 410 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  4. topcoder srm 714 div1

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

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. 一群猴子排成一圈,按1,2,...,n依次编号

    朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑,下面这个方法看起来很简单,但是我理解不了,有大牛懂得给解释一下 朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑, ...

  2. Hadoop.之.入门部署

    一.课程目标 ->大数据是什么?大数据能做什么? ->什么是Hadoop?Hadoop的设计思想? ->Hadoop如何解决大数据的问题?(什么是hdfs与yarn.MapReduc ...

  3. jQuery-手风琴效果-2

    动画 高级函数:基于底层函数又进行了封装 两大块:简化版的动画函数和万能动画函数 简化版动画函数 显示/隐藏$().show; $(...).hide(); 强调:无参数的show()/hide()使 ...

  4. C#中换行的代码

    1.Windows 中的换行符"\r\n"2.Unix/Linux 平台换行符是 "\n".3.MessageBox.Show() 的换行符为 "\n ...

  5. 学习笔记<1>技术体系结构

    Android的系统架构采用了分层架构的思想,如上图所示.从上层到底层共包括四层,分别是   1.应用程序程序层   2.应用框架层   3.系统库和Android运行时 4.Linux内核.   每 ...

  6. 更换tomcat运行日志目录

    1.在tomcat安装文件夹的bin目录下,修改catalina.sh,改变catalina.out的输出目录 CATALINA_OUT="$CATALINA_BASE"/logs ...

  7. [openjudge-搜索]广度优先搜索之鸣人和佐助

    题目描述 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸 ...

  8. 算法提高 P0101

    一个水分子的质量是3.0*10-23克,一夸脱水的质量是950克.写一个程序输入水的夸脱数n(0 <= n <= 1e10),然后输出水分子的总数.输入 109.43输出 3.465283 ...

  9. 阿里云部署Java web项目

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...

  10. 4-20mA电流环路发送器入门(转)

    4-20mA电流环路发送器入门 作者:Collin Wells, 德州仪器精密模拟应用工程师 在现代工业控制系统中,4-20 mA电流环路发送器一直是在控制中心和现场传感器/执行器之间进行数据传输最为 ...