1001题意:n个人,给m对敌对关系,X个好人,Y个坏人。现在问你是否每个人都是要么是好人,要么是坏人。

先看看与X,Y个人有联通的人是否有矛盾,没有矛盾的话咋就继续遍历那些不确定的人关系,随便取一个数3,与其相连的就是4,间隔就要相同,dfs搜过去就可以判断了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long LL;
  10. const long long INF = 1e18+1LL;
  11. const double Pi = acos(-1.0);
  12. const int N = 5e5+, maxn = 1e3+, mod = 1e9+, inf = 2e9;
  13.  
  14. int vis[N],t,head[N],n,m,x,y,z,cal[N],xx[N],yy[N];
  15. int flag;
  16. struct ss{
  17. int to,next;}e[N * ];
  18. void add(int u,int v) {e[t].next = head[u]; e[t].to = v; head[u] = t++;}
  19.  
  20. void dfs(int u,int fa) {
  21. cal[u] = ;
  22. for(int i = head[u]; i!=-; i = e[i].next) {
  23. int to = e[i].to;
  24. if(to == fa) continue;
  25. if(vis[u] == ) vis[u] = ;
  26. if(vis[to] == vis[u]) {
  27. flag = ;
  28. return ;
  29. }
  30. if(cal[to]) continue;
  31. if(vis[u] == ) vis[to] = ;
  32. else if(vis[u] == ) vis[to] = ;
  33. else if(vis[u] == ) vis[to] = ;
  34. else if(vis[u] == ) vis[to] = ;
  35. dfs(to,u);
  36. }
  37. }
  38.  
  39. int main() {
  40. while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF) {
  41. t = ;
  42. memset(head,-,sizeof(head));
  43. for(int i = ; i <= m; ++i) {
  44. int a,b;
  45. scanf("%d%d",&a,&b);
  46. add(a,b);
  47. add(b,a);
  48. }
  49. memset(cal,,sizeof(cal));
  50. memset(vis,,sizeof(vis));
  51. for(int i = ; i <= x; ++i) scanf("%d",&xx[i]),vis[xx[i]] = ;
  52. for(int i = ; i <= y; ++i) scanf("%d",&yy[i]),vis[yy[i]] = ;
  53. flag = ;
  54. for(int i = ; i <= x; ++i) {
  55. if(!cal[i]) dfs(xx[i],-);
  56. }
  57. for(int i = ; i <= y; ++i) {
  58. if(!cal[i]) dfs(yy[i],-);
  59. }
  60. if(flag) {
  61. puts("NO");
  62. continue;
  63. }
  64. for(int i = ; i<= n; ++i) {
  65. if(!cal[i]) {
  66. dfs(i,-);
  67. }
  68. }
  69. for(int i = ; i <= n; ++i) {
  70. if(!vis[i]) flag = ;
  71. }
  72. if(flag) puts("NO");
  73. else puts("YES");
  74. }
  75. return ;
  76. }

1001

1003题意:两堆石子,你可以任选一堆去掉任意个数,你也可从两堆中同时去掉任意个数,最后全部取完的人胜

石子的数量是10^100.高精度的威佐夫博弈,需要黄金比例精确到100位,队友javaA。

  1. import java.util.*;
  2. import java.math.*;
  3.  
  4. public class Main {
  5. public static void main(String[] args) {
  6. Scanner cin = new Scanner(System.in);
  7. BigInteger k=new BigInteger("6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374");
  8. BigInteger p=new BigInteger("10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
  9. while(cin.hasNext())
  10. {
  11. BigInteger nn=cin.nextBigInteger();
  12. BigInteger mm=cin.nextBigInteger();
  13. BigInteger n=nn.min(mm);
  14. BigInteger m=nn.max(mm);
  15. BigInteger j=n.multiply(k);
  16. j=j.divide(p);
  17. BigInteger l=j.multiply(k.add(new BigInteger("1")));
  18. l=l.divide(p);
  19. if(n.equals(l)==false)
  20. j=j.add(new BigInteger("1"));
  21. n=n.add(j);
  22. if(n.equals(m))
  23. System.out.println("0");
  24. else
  25. System.out.println("1");
  26. }
  27. }
  28. }

1003

1004题意:给定a,b; 求出满足 LCM(X,Y) = b && X+Y = a的一组解,或者是无解

公式转化:b*gcd(X,Y) = X*Y,X+Y=a;

我们可以知道gcd(X,Y) 必然是a的因子!,那么我们为了枚举gcd(X,Y)就直接去枚举a的因子就是了

枚举以后就相当于求解一个二元一次方程的整数解了;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long LL;
  10. const long long INF = 1e18+1LL;
  11. const double Pi = acos(-1.0);
  12. const int N = 5e5+, maxn = 1e3+, mod = 1e9+, inf = 2e9;
  13.  
  14. LL a,b,p[N],ans1,ans2;
  15. int ok;
  16.  
  17. int check(LL a,LL B,LL gc) {
  18. if(a*a - *B < ) return ;
  19. LL tmp = (int)(sqrt(a*a - *B)+0.00001);
  20. if(tmp*tmp != a*a - *B) return ;
  21.  
  22. LL fi = a+tmp;
  23. if(fi>=&&fi%==) fi/=;
  24. else fi = -;
  25.  
  26. LL se = a-tmp;
  27. if(se>=&&se%==) se/=;
  28. else se = -;
  29. if(fi <= && se <= ) return ;
  30. if(fi > ) {
  31. LL x = a - fi;
  32. if((__gcd(fi,x)==gc)&&x * fi == B) {
  33. ans1 = fi,ans2 = x;
  34. if(ans1>ans2)
  35. swap(ans1,ans2);
  36. ok = ;
  37. return ;
  38. }
  39. }
  40. if(se > ) {
  41. LL x = a - se;
  42. if((__gcd(x,se)==gc)&&x * se == B) {
  43. ans1 = se,ans2 = x;
  44. if(ans1>ans2)
  45. swap(ans1,ans2);
  46. ok = ;
  47. return ;
  48. }
  49. }
  50. return ;
  51. }
  52. int main() {
  53. while(scanf("%I64d%I64d",&a,&b)!=EOF) {
  54. ok = ;
  55. for(int i = ; i * i <= a; ++i) {
  56. if(a % i == ) {
  57. if(check(a,b*i,i)) break;
  58. if(check(a,b*(a/i),a/i)) break;
  59. }
  60. }
  61. if(ok) printf("%I64d %I64d\n",ans1,ans2);
  62. else puts("No Solution");
  63. }
  64. }

1004

1006题意:给你一个x,然后你要构造一个数组a,满足∑a = x, 任意的i,j( i != j) a[i] != a[j];问你 最大的 s = a1*a2*a3*......*an是多少;

要使得乘积最大,那么相乘的数越多显然S是越大的。。。。

假设x = 7, 那么我们构造出一个数组   2 3 2,到这里有重复的数了,我们就把最后面的2平分到前面  2,3 -> 3,4

假设x = 8,那么我们构造出一个数组   2 3 3,到这里有重复的数了,我们就把最后面的3平分到前面  2,3 -> 3,4 到这里,还有一个1,我们就分到最后一个数上去 -> 3 5

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long ll;
  10. const long long INF = 1e18+1LL;
  11. const double Pi = acos(-1.0);
  12. const int N = 5e5+, maxn = 1e3+, mod = 1e9+, inf = 2e9;
  13. ll sum[N];
  14. ll pre[N];
  15. ll quick_pow(ll x,ll y)
  16. {
  17. ll ans=;
  18. while(y)
  19. {
  20. if(y&)ans*=x,ans%=mod;
  21. y>>=;
  22. x*=x;
  23. x%=mod;
  24. }
  25. return ans;
  26. }
  27. int main() {
  28. sum[]=;
  29. for(int i = ;i< ; ++i) {
  30. sum[i]=sum[i-]+i+;
  31. }
  32.  
  33. int cnt=,T;
  34. pre[]=;
  35. for(int i=;i<;i++)
  36. {
  37. pre[i]=(pre[i-]*(i+))%mod;
  38. }
  39. scanf("%d",&T);
  40. while(T--)
  41. {
  42. ll x;
  43. scanf("%lld",&x);
  44. if(x == 1LL) {
  45. puts("");
  46. continue;
  47. }
  48. int pos=upper_bound(sum+,sum+cnt+,x)-sum-;
  49. ll m=x-sum[pos];
  50. if(m == pos+) {
  51. ll ans=pre[pos];
  52. ans=(ans*(pos+))%mod;
  53. ans=(ans*quick_pow(,mod-))%mod;
  54. printf("%lld\n",ans);
  55. continue;
  56. }
  57. ll ans = pre[pos - m];
  58. if(m!=) ans = ans * ((pre[pos+]*quick_pow((pre[pos-m+]),mod-))% mod )% mod;
  59. if(x==)
  60. printf("1\n");
  61. else
  62. printf("%lld\n",ans);
  63. }
  64. return ;
  65. }

1006

1007题意:一个n点n边的树,每个树节点上有一种颜色苹果最多有k个不同的颜色,问你有多少条路径至少包含了所有颜色的苹果

树分治,这里要用到状态压缩的一点技巧

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long LL;
  10. const long long INF = 1e18+1LL;
  11. const double Pi = acos(-1.0);
  12. const int N = +, maxn = 1e3+, mod = 1e9+, inf = 2e9;
  13.  
  14. LL ans = ;
  15. int n,k,t,head[N],root,a[N],f[N],vis[N],siz[N],allnode;
  16. LL cnt[N],num[N];
  17. struct edge{
  18. int to,next;
  19. }e[N * ];
  20. void add(int u,int v) {e[t].next = head[u]; e[t].to = v;head[u] = t++;}
  21. void getroot(int u,int fa) {
  22. f[u] = ;
  23. siz[u] = ;
  24. for(int i = head[u]; i != -; i = e[i].next) {
  25. int to = e[i].to;
  26. if(vis[to] || to == fa) continue;
  27. getroot(to,u);
  28. siz[u] += siz[to];
  29. f[u] = max(f[u],siz[to]);
  30. }
  31. f[u] = max(f[u],allnode - siz[u]);
  32. if(f[u] < f[root]) root = u;
  33. }
  34. void getdeep(int u,int fa,int now) {
  35. for(int i = head[u]; i != -; i = e[i].next) {
  36. int to = e[i].to;
  37. if(to == fa || vis[to]) continue;
  38. cnt[now|(<<a[to])]++;
  39. num[now|(<<a[to])]++;
  40. getdeep(to,u,now|(<<a[to]));
  41. }
  42. }
  43. LL cal(int u,int now) {
  44. for(int i = ; i < (<<k); ++i) cnt[i] = ,num[i] = ;
  45. num[now]++;
  46. cnt[now]++;
  47. getdeep(u,,now);
  48. for(int i = ; i < k; ++i) {
  49. for(int j = (<<k)-; j >= ; --j) {
  50. if(!((<<i)&j)) cnt[j] += cnt[j|(<<i)];
  51. }
  52. }
  53. LL ans1 = ;
  54. for(int i = ; i < (<<k); ++i) {
  55. ans1 += 1LL*num[i]*cnt[i^((<<k)-)];
  56. }
  57. return ans1;
  58. }
  59. void work(int u) {
  60. vis[u] = ;
  61. ans += cal(u,<<a[u]);
  62. for(int i = head[u]; i != -; i = e[i].next) {
  63. int to = e[i].to;
  64. if(vis[to]) continue;
  65. ans -= cal(to,(<<a[u])|(<<a[to]));
  66. allnode = siz[to];
  67. root = ;
  68. getroot(to,-);
  69. work(root);
  70. }
  71. }
  72. void init() {
  73. memset(head,-,sizeof(head));
  74. memset(vis,,sizeof(vis));
  75. t = ;
  76. ans = ;
  77. }
  78. int main() {
  79. while(scanf("%d%d",&n,&k)!=EOF) {
  80. for(int i = ; i <= n; ++i) scanf("%d",&a[i]),a[i]--;
  81. init();
  82. for(int i = ; i < n; ++i) {
  83. int u,v;
  84. scanf("%d%d",&u,&v);
  85. add(u,v);add(v,u);
  86. }
  87. f[] = inf;
  88. allnode = n;
  89. root = ;
  90. getroot(,-);
  91. work(root);
  92. printf("%I64d\n",ans);
  93. }
  94. return ;
  95. }

1007

1008题意:k个黑球,1个白球,每次每人只能取一球,先取到红球的人胜利,问先取的人是否为有利,或者是平等

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define pi (4*atan(1.0))
  5. #define eps 1e-14
  6. const int N=2e5+,M=4e6+,inf=1e9+,mod=1e9+;
  7. const ll INF=1e18+,MOD=1e9+;
  8. int main()
  9. {
  10. int x;
  11. while(~scanf("%d",&x))
  12. {
  13. if(x&)
  14. printf("0\n");
  15. else
  16. printf("1\n");
  17. }
  18. return ;
  19. }

1008

1009题意:N个角度,长度为D,求出这n个线段围成的面积

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #pragma comment(linker, "/STACK:102400000,102400000")
  4. #define ls i<<1
  5. #define rs ls | 1
  6. #define mid ((ll+rr)>>1)
  7. #define pii pair<int,int>
  8. #define MP make_pair
  9. typedef long long LL;
  10. const long long INF = 1e18+1LL;
  11. const double Pi = acos(-1.0);
  12. const int N = 4e5+, maxn = 1e3+, mod = 1e9+, inf = 2e9;
  13.  
  14. double d;
  15. int n;
  16. int main() {
  17. while(scanf("%d%lf",&n,&d)!=EOF) {
  18. double ans = 0.0;
  19. double x;
  20. for(int i = ; i <= n; ++i) {
  21. scanf("%lf",&x);
  22. ans += d*d*sin(x/ * Pi)/;
  23. }
  24. printf("%.3f\n",ans);
  25. }
  26. return ;
  27. }

1009

  

2016ACM/ICPC亚洲区大连站-重现赛(感谢大连海事大学)(7/10)的更多相关文章

  1. 2016ACM/ICPC亚洲区大连站-重现赛

    题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=2016ACM%2FICPC%D1%C7%D6%DE%C7%F8%B4%F3%C ...

  2. 2016ACM/ICPC亚洲区大连站现场赛题解报告(转)

    http://blog.csdn.net/queuelovestack/article/details/53055418 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原 ...

  3. 2016ACM/ICPC亚洲区沈阳站-重现赛赛题

    今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...

  4. 2016ACM/ICPC亚洲区沈阳站-重现赛

    C.Recursive sequence 求ans(x),ans(1)=a,ans(2)=b,ans(n)=ans(n-2)*2+ans(n-1)+n^4 如果直接就去解...很难,毕竟不是那种可以直 ...

  5. 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory li ...

  6. HDU 5976 Detachment 【贪心】 (2016ACM/ICPC亚洲区大连站)

    Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)

    Convex Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  8. HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    Rabbits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  9. HDU 6225.Little Boxes-大数加法 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

随机推荐

  1. Django基础,Day5 - form表单投票详解

    投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...

  2. ASP.MVC 基于AuthorizeAttribute权限设计案例

    ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public class AuthorizeDiy : Authorize ...

  3. jaee开发起步:tomcat服务器的配置

    1.将下载下来的apache-tomcat-6.0.13.zip解压到任意文件夹. (打开tomcat官网,选择下载tomcat6.x.zip版本的tomcat不需要安装,直接解压并配置一下环境变量就 ...

  4. Android Studio导入第三方类库的方法

    Android Studio导入第三方类库的方法 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比E ...

  5. mac gem install nokogiri error

    Gem::Ext::BuildError: ERROR: Failed to build gem native extension. /Users/angela/.rbenv/versions/1.9 ...

  6. AJAX获取数据成功后的返回数据如何声明成全局变量

    var result=""; $.ajax({ type: "post", url: "../reportRule/main.do?method=se ...

  7. oracle学习笔记(二)

    1. Oracle字符串操作 1.1. 字符串类型 1.1.1. CHAR和VARCHAR2类型 CHAR和VARCHAR2类型都是用来表示字符串数据类型,用来在表中存放字符串信息, 比如姓名.职业. ...

  8. powershell例子

    例子如下: $ErrorActionPreference="Stop" function getlist{ ls D:\tmp2|select name,extension,ful ...

  9. java问题排查总结

    前些天发现:http://hellojava.info/这个站点,关于java问题排查分析总结线上故障总结其实是最有价值的,好的总结就是一个系统演进历史,是团队难得的积累沉淀. 花了不少时间看了下,顺 ...

  10. Redis持久化

    Redis持久化 快照(默认) 将内存中的数据以快照的方式写入到二进制文件中,默认文件名是dump.rdb. 配置自动化做快照持久化(如redis在n秒内如果超过m个key被修改就自动做快照) sav ...