1、对于一棵树上的一个节点$u$,定义$f(u)$表示树上距离$u$最远的节点到$u$的距离。给出每个节点的$f$值,构造出这棵树。

思路:找到树的主干,然后不在主干上的节点一定可以连接到主干的某个节点上。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
#include <fstream>
#include <sstream>
using namespace std;const int N=1000005;
const int mod=1000000007;class TreeDistanceConstruction
{int a[111];int get(int t,vector<pair<int,int>> &p){for(int i=0;i<(int)p.size();++i){if(p[i].first==t){if(!a[p[i].second]){a[p[i].second]=1;return p[i].second;}}}return -1;}public:vector<int> construct(vector<int> d){const int n=(int)d.size();vector<pair<int,int>> p;for(int i=0;i<n;++i){p.push_back(make_pair(d[i],i));}sort(p.begin(),p.end());vector<int> ans;const int Max=p.back().first;const int Min=p[0].first;if(Min<(Max+1)/2) return ans;if(Min>(Max+1)/2) return ans;memset(a,0,sizeof(a));if(Max&1){const int K=(Max+1)>>1;vector<int> ll,rr;for(int i=K;i<=Max;++i){int t=get(i,p);if(t==-1) return ans;ll.push_back(t);t=get(i,p);if(t==-1) return ans;rr.push_back(t);}if(get(K,p)!=-1) return ans;for(int i=0;i+1<(int)ll.size();++i){ans.push_back(ll[i]);ans.push_back(ll[i+1]);}for(int i=0;i+1<(int)rr.size();++i){ans.push_back(rr[i]);ans.push_back(rr[i+1]);}ans.push_back(ll[0]);ans.push_back(rr[0]);for(int i=0;i<(int)p.size();++i){int id=p[i].second;if(!a[id]){int len=p[i].first;int nIndex=len-K-1;ans.push_back(id);ans.push_back(ll[nIndex]);}}return ans;}else{const int K=Max>>1;const int Kid=get(K,p);if(Kid==-1) return ans;if(get(K,p)!=-1) return ans;vector<int> ll,rr;for(int i=K+1;i<=Max;++i){int t=get(i,p);if(t==-1) return ans;ll.push_back(t);t=get(i,p);if(t==-1) return ans;rr.push_back(t);}for(int i=0;i+1<(int)ll.size();++i){ans.push_back(ll[i]);ans.push_back(ll[i+1]);}for(int i=0;i+1<(int)rr.size();++i){ans.push_back(rr[i]);ans.push_back(rr[i+1]);}ans.push_back(ll[0]);ans.push_back(Kid);ans.push_back(rr[0]);ans.push_back(Kid);ll.insert(ll.begin(),Kid);for(int i=0;i<(int)p.size();++i){int id=p[i].second;if(!a[id]){int len=p[i].first;int nIndex=len-K-1;ans.push_back(id);ans.push_back(ll[nIndex]);}}return ans;}}
};

 

2、给定整数$n,K,v$,确定一个长度为$n$的序列$x$,满足$0\leq x_{i}< K$且$x_{1}x_{2}...x_{n}mod K=v$。问这样的序列有多少个。现在给出很多$v$,对每一个$v$计算一个答案。

思路:(1)首先,假设$x$的前$n-1$个数已经确定,令$r=Gcd(\prod_{i=1}^{n-1}x_{i},K)$。那么由$r,v$可以确定$x_{n}$的取值。由于$\left (r\cdot x_{n}  \right )mod K=v$,那么$r\cdot x_{n}=tK+v$,所以$Gcd(r,K)$可以整除$v$。由于$r$可以整除$K$,所以$r=Gcd(r,K)$一定可以整除$v$。那么对于某个$r$,$x_{n}$有$K/r$种选择,分别是$\frac{tK+v}{r},0\leq t<r$。

(2)由于$K$的约数不会太多,所以可以进行动态规划,设$f[i][j]$表示已经确定了$i$个$x$,它们的乘积与$K$的最大公约数为$j$。那么每次可以由$f[i][j]$转移到$f[i+1][k]$,其中$j$可以整除$k$。令$p=\frac{k}{j}$,那么$q=Gcd(j\cdot tp,K)$一定是$k$的倍数。那么进行容斥原理即可确定$x_{i+1}$ 种类使得$j\cdot x_{i+1} mod K=k$。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
using namespace std;const int mod=1000000007;int f[55][111111];
int d[111111];
vector<int> q[111111];void add(int &x,int y)
{x+=y;if(x>=mod) x-=mod;
}class ModEquation
{
public:vector<int> count(int n,int K,vector<int> query){vector<int> p;for(int i=1;i*i<=K;++i) {if(K%i==0) {p.push_back(i);if(i*i!=K) p.push_back(K/i);}}sort(p.begin(),p.end());for(int i=0;i<(int)p.size();++i) {q[i].clear();for(int j=i;j<(int)p.size();++j) {if(p[j]%p[i]==0) {q[i].push_back(j);}}}f[0][0]=1;for(int i=1;i<=n-1;++i){for(int j=0;j<(int)p.size();++j){for(int k=0;k<(int)q[j].size();++k) {d[q[j][k]]=(long long)f[i-1][j]*(K/(p[q[j][k]]/p[j]))%mod;}for(int k=(int)q[j].size()-1;k>=0;--k) {const int u=q[j][k];for(int t=1;t<(int)q[u].size();++t) {const int v=q[u][t];add(d[u],mod-d[v]);}}for(int k=0;k<(int)q[j].size();++k) {const int u=q[j][k];add(f[i][u],d[u]);d[u]=0;}}}vector<int> ans;for(int i=0;i<(int)query.size();++i) {const int v=query[i];int tmp=0;for(int j=0;j<(int)p.size();++j) {if(v%p[j]==0) {add(tmp,(long long)f[n-1][j]*p[j]%mod);}}ans.push_back(tmp);}return ans;}
};

3、构造一个有$n$个顶点的有向图,使得以0号节点开始,$n-1$号节点结束的哈密顿路径恰有$k$条。$2\leq n \leq 20$。

思路:如代码所示。路径上第二个节点是$n-2$时,有1条;否则若第二个节点是$n-3-i$,则有$2^{i}$条。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
using namespace std;class HamiltonianConstruction
{
public:vector<string> construct(int k){const int n=20;vector<string> ans(n,string(n,'N'));for(int i=2;i<=n-2;++i) ans[i][i-1]='Y';for(int i=1;i<n;++i) {for(int j=i+1;j<n;++j) ans[i][j]='Y';}for(int i=n-3;i>=1;--i,k>>=1) {if(k&1) ans[0][i]='Y';}return ans;}
};

  

topcoder srm 704 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. ...

  10. topcoder srm 500 div1

    problem1 link 如果decisions的大小为0,那么每一轮都是$N$个人.答案为0. 否则,如果答案不为0,那么概率最大的一定是一开始票数最多的人.因为这个人每一轮都在可以留下来的人群中 ...

最新文章

  1. python import gc_Python 2.6 GC似乎可以清理对象,但不会释放内存
  2. Blending and Bagging
  3. java实现十进制与二进制之间的转换
  4. net use 命令集合详解
  5. CSS大会 | 打破常“规”:挖掘语法解析器规则漏洞
  6. Visual C++ 2011-07-18
  7. Procrustes Analysis(普氏分析)
  8. iOS语音识别功能实现
  9. redhat 7.2更新yum源时踩的坑
  10. python可以做exe文件吗_手动制作python的exe可执行程序
  11. JSP编程技术4-登录与注销(静态)
  12. Linux如何安装并配置libxml2库?解决“libxml2 not found“问题
  13. 利用AOP+Swagger注解实现日志记录功能
  14. python dot_graphviz,dot,及dot图可视化
  15. 日期偏移INTERVAL * DAY
  16. 【环境搭建】手把手教你安装Ubuntu16.04系统
  17. 2840页的计算机毕业论文!德州奥斯汀华人博士究竟写了啥?
  18. 基于java医院门诊管理系统设计
  19. JAVA导出excel 直接弹出下载框
  20. doraemon with latex

热门文章

  1. keras pytorch_使用PyTorch重新创建Keras功能API
  2. python强制声明变量类型_python声明变量类型吗
  3. linux终端输出图形_Linux进程关系
  4. java 编写a-z输出,有1-26个数字和a-z字母,用Java多线程实现先输出2和数字再输出2个字...
  5. gitlab mr wip 怎么弄成_Gitlab基本管理(二)
  6. 【Clojure 基本知识】 关于函数参数的各种高级用法
  7. php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义
  8. tomcat通过虚拟路径访问外部静态资源
  9. mysql客户端navicat连接数据库
  10. day19——常用正则表达式、re正则对象和正则匹配效率比较、编译正则对象