https://www.nowcoder.com/acm/contest/106#question

A

分类讨论

  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. #define LL long long
  4. int a[] ;
  5. int d[] ;
  6. vector< int > v[] ;
  7. void dfs( int id , int fa , int c ){
  8. d[id] = c ;
  9. for( int i = ; i < v[id].size() ; i++ ){
  10. if( v[id][i] == fa ) continue ;
  11. dfs( v[id][i] , id , - c ) ;
  12. }
  13. }
  14. int main(){
  15. int T ;
  16. cin >> T ;
  17. while( T-- ){
  18. int n ;
  19. scanf( "%d" , &n ) ;
  20. for( int i = ; i <= n ; i++ )
  21. v[i].clear() ;
  22. for( int i = ; i <= n - ; i++ ){
  23. int a , b ;
  24. scanf( "%d%d" , &a , &b ) ;
  25. v[a].push_back( b ) ;
  26. v[b].push_back( a ) ;
  27. }
  28. dfs( , , ) ;
  29. LL b , w ;
  30. b = ; w = ;
  31. for( int i = ; i <= n ; i++ )
  32. if ( d[i] == ) b++ ;
  33. else w++ ;
  34. LL ans = ;
  35. if ( n & ) { ans = * ( b * b * w + w * w * b ) ; }
  36. else{ ans = b * b * b + w * w * w + b * b * w + w * w * b ; }
  37. printf( "%lld\n" , ans ) ;
  38. }
  39. return ;
  40. }

B

等比数列

  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. #define LL long long
  4. char s[] ;
  5. const LL mod = 1e9 + ;
  6. LL two[] ;
  7. LL pow_mod( LL a , LL b ){
  8. a %= mod ;
  9. LL ans = ;
  10. while( b ){
  11. if ( b & ) { ans *= a ; ans %= mod ; }
  12. a *= a ; a %= mod ; b >>= ;
  13. }
  14. return ans ;
  15. }
  16. LL inv_mod( LL x ){
  17. return pow_mod( x , mod - ) ;
  18. }
  19. int main(){
  20. int k ;
  21. cin >> k ;
  22. scanf( "%s" , s ) ;
  23. two[] = ;
  24. for( int i = ; i <= ; i++ ){
  25. two[i] = two[i - ] * ;
  26. two[i] %= mod ;
  27. }
  28. LL ans = ;
  29. int len = strlen( s ) ;
  30. for( int i = ; i < len ; i++ ){
  31. if ( s[i] == '' || s[i] == '' ){
  32. ans += two[i] ; ans %= mod ;
  33. }
  34. }
  35. LL q = two[len] ;
  36. if ( q == ) { ans *= k ; ans %= mod ; }
  37. else{
  38. LL res = pow_mod( q , k ) ;
  39. res-- ; if ( res < ) res += mod ;
  40. ans *= res ; ans %= mod ;
  41. q-- ; if ( q < ) q += mod ;
  42. ans *= inv_mod( q ) ; ans %= mod ;
  43. }
  44. cout << ans << endl ;
  45. return ;
  46. }

C

并查集 (不带子树转移版)

有四种操作

1 u v 合并u,v所在的并查集

2 u  将u从其所在的并查集中分离出来

3 u 询问u所在并查集的大小

4 u v 询问u,v是否在一个并查集内

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define pii pair<int, int>
  6. #define pb push_back
  7. #define mk make_pair
  8. #define fi first
  9. #define se second
  10. #define ALL(A) A.begin(), A.end()
  11. #define sqr(x) ((x)*(x))
  12. #define sc(x) scanf("%d", &x)
  13. #define pr(x) printf(">>>"#x":%d\n", x)
  14. #define fastio ios::sync_with_stdio(0),cin.tie(0)
  15. #define frein freopen("in.txt", "r", stdin)
  16. #define freout freopen("out.txt", "w", stdout)
  17. #define debug cout<<">>>STOP"<<endl
  18. template<class T> T gcd(T a, T b)
  19. {
  20. if (!b)
  21. {
  22. return a;
  23. }
  24. return gcd(b, a % b);
  25. }
  26. const int maxn = 2e5 + ;
  27. int par[maxn], hs[maxn];
  28. int sz[maxn];
  29. int cnt;
  30. void init(int n)
  31. {
  32. for (int i = ; i <= n; i++)
  33. {
  34. par[i] = i, hs[i] = i, sz[i] = ;
  35. }
  36. }
  37. int find(int x)
  38. {
  39. return par[x] == x ? x : par[x] = find(par[x]);
  40. }
  41. void unite(int x, int y)
  42. {
  43. x = find(x);
  44. y = find(y);
  45. if (x != y)
  46. {
  47. par[x] = y, sz[y] += sz[x];
  48. }
  49. }
  50. void del(int x)
  51. {
  52. sz[find(hs[x])]--;
  53. hs[x] = ++cnt;
  54. }
  55. int main()
  56. {
  57. int T, kase = ;
  58. sc(T);
  59. while (T--)
  60. {
  61. printf("Case #%d:\n", kase++);
  62. int n, q;
  63. sc(n);
  64. sc(q);
  65. init(n + q);
  66. cnt = n;
  67. for (int i = ; i < q; i++)
  68. {
  69. int op;
  70. sc(op);
  71. if (op == )
  72. {
  73. int u, v;
  74. sc(u);
  75. sc(v);
  76. unite(hs[u], hs[v]);
  77. }
  78. else if (op == )
  79. {
  80. int u;
  81. sc(u);
  82. del(u);
  83. }
  84. else if (op == )
  85. {
  86. int u;
  87. sc(u);
  88. int ans = sz[find(hs[u])];
  89. printf("%d\n", ans);
  90. }
  91. else
  92. {
  93. int u, v;
  94. sc(u);
  95. sc(v);
  96. if (find(hs[u]) == find(hs[v]))
  97. {
  98. printf("YES\n");
  99. }
  100. else
  101. {
  102. printf("NO\n");
  103. }
  104. }
  105. }
  106. }
  107. return ;
  108. }

F

冒泡排序变种

  1. #include<bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4. const ll mod = 1e9 + ;
  5. int num[];
  6. int number[];
  7. int visit[];
  8. vector<int> now[];
  9. int pop = ;
  10. int ans[];
  11. int main()
  12. {
  13. int n;
  14. int k;
  15. cin >> n >> k;
  16. int cur = ;
  17. for (int i = ; i <= n; i++)
  18. {
  19. scanf("%d", &num[i]);
  20. ans[i] = num[i];
  21. }
  22. sort(ans + , ans + + n);
  23. if (k == )
  24. {
  25. for (int i = ; i <= n; i++)
  26. {
  27. if (num[i] != ans[i])
  28. {
  29. cout << i << endl;
  30. return ;
  31. }
  32. }
  33. cout << - << endl;
  34. return ;
  35. }
  36. for (int i = ; i <= n; i++)
  37. {
  38. if (visit[i])
  39. {
  40. continue;
  41. }
  42. ++pop;
  43. cur = ;
  44. for (int j = i; j <= n; j += k)
  45. {
  46. if (!visit[j])
  47. {
  48. now[pop].push_back(num[j]);
  49. //cout<<num[j]<<" "<<j<<" ";
  50. }
  51. }
  52. //cout<<endl;
  53. sort(now[pop].begin(), now[pop].end());
  54. for (int j = i; j <= n; j += k)
  55. {
  56. if (!visit[j])
  57. {
  58. number[j] = now[pop][cur++];
  59. visit[j] = ;
  60. }
  61. }
  62. }
  63. for (int i = ; i <= n; i++)
  64. {
  65. if (number[i] != ans[i])
  66. {
  67. cout << i << endl;
  68. return ;
  69. }
  70. }
  71. cout << - << endl;
  72. return ;
  73. }

G

反推是否符合垂心 重心 内心 外心

  1. x=[0,0,0,0];
  2. y=[0,0,0,0];
  3. def dOt(x0,y0,x1,y1):
  4. return x0*x1+y0*y1;
  5.  
  6. def cRoss(x0,y0,x1,y1):
  7. return x0*y1-x1*y0;
  8.  
  9. def lEnth2(x,y):
  10. return x*x+y*y;
  11.  
  12. def check0():
  13. n=[0,0,0];
  14. for i in range(3):
  15. n[i]=cRoss(x[(i+1)%3]-x[i],y[(i+1)%3]-y[i],x[3]-x[i],y[3]-y[i]);
  16. if (n[0]<0 and n[1]<0 and n[2]<0) or (0<n[0] and 0<n[1] and 0<n[2]):
  17. return 1;
  18. else:
  19. return 0;
  20.  
  21. def check1():
  22. for i in range(3):
  23. if dOt(x[i]-x[3],y[i]-y[3],x[(i+2)%3]-x[(i+1)%3],y[(i+2)%3]-y[(i+1)%3])!=0:
  24. return 0;
  25. return 1
  26.  
  27. def check2():
  28. n=[0,0];
  29. for i in range(3):
  30. n[0]=abs(cRoss(x[(i+1)%3]-x[i],y[(i+1)%3]-y[i],x[3]-x[i],y[3]-y[i]));
  31. n[1]=abs(cRoss(x[(i+2)%3]-x[i],y[(i+2)%3]-y[i],x[3]-x[i],y[3]-y[i]));
  32. if n[0]!=n[1]:
  33. return 0;
  34. if check0()==1:
  35. return 1;
  36. else:
  37. return 0;
  38.  
  39. def check3():
  40. s=[0,0,0];
  41. l=[0,0,0];
  42. for i in range(3):
  43. s[i]=abs(cRoss(x[i]-x[3],y[i]-y[3],x[(i+1)%3]-x[3],y[(i+1)%3]-y[3]));
  44. l[i]=lEnth2(x[(i+1)%3]-x[i],y[(i+1)%3]-y[i]);
  45. for i in range(3):
  46. if s[i]*s[i]*l[(i+1)%3]!=s[(i+1)%3]*s[(i+1)%3]*l[i]:
  47. return 0;
  48. if check0()==1:
  49. return 1;
  50. else:
  51. return 0;
  52.  
  53. def check4():
  54. d=[0,0,0];
  55. for i in range(3):
  56. d[i]=lEnth2(x[i]-x[3],y[i]-y[3]);
  57. if d[0]!=d[1] or d[1]!=d[2] or d[2]!=d[0]:
  58. return 0;
  59. return 1
  60.  
  61. for i in range(4):
  62. x[i],y[i]=map(int,input().split());
  63. if check1()==1 or check2()==1 or check3()==1 or check4()==1:
  64. print("Yes");
  65. else:
  66. print("No");

I

单调队列 O(n)可以处理处每个点的贡献

注意在push的时候一侧要是严格的 另一侧要是不严格的 比如先>= 后> 因为这样才是全部情况 如果全是严格则缺少情况 全是不严格则有重复情况

(即一个区间应只有一个最大值最小值有贡献 如果有多个最大值最小值也只能算一次)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. const int maxn = + ;
  5. int a[maxn], l[maxn], r[maxn];
  6. inline void scan(int &a)
  7. {
  8. a = ;
  9. char c;
  10. while (c = getchar(), !isdigit(c));
  11. a = c - '';
  12. while (c = getchar(), isdigit(c))
  13. {
  14. a = a * + c - '';
  15. }
  16. }
  17. int main()
  18. {
  19. int n;
  20. while (scanf("%d", &n) != EOF)
  21. {
  22. LL res = ;
  23. for (int i = ; i <= n; i++)
  24. {
  25. scanf("%d", &a[i]);
  26. }
  27. for (int i = ; i <= n; i++)
  28. {
  29. l[i] = r[i] = i;
  30. }
  31. for (int i = ; i <= n; i++)
  32. {
  33. int cur = i;
  34. while (cur > && a[i] >= a[cur - ])
  35. {
  36. cur = l[cur - ];
  37. }
  38. l[i] = cur;
  39. }
  40. for (int i = n - ; i >= ; i--)
  41. {
  42. int cur = i;
  43. while (cur < n && a[i] > a[cur + ])
  44. {
  45. cur = r[cur + ];
  46. }
  47. r[i] = cur;
  48. }
  49. for (int i = ; i <= n; i++)
  50. {
  51. res += (LL)a[i] * (LL)(i - l[i] + ) * (LL)(r[i] - i + );
  52. }
  53. for (int i = ; i <= n; i++)
  54. {
  55. l[i] = r[i] = i;
  56. }
  57. for (int i = ; i <= n; i++)
  58. {
  59. int cur = i;
  60. while (cur > && a[i] <= a[cur - ])
  61. {
  62. cur = l[cur - ];
  63. }
  64. l[i] = cur;
  65. }
  66. for (int i = n - ; i >= ; i--)
  67. {
  68. int cur = i;
  69. while (cur < n && a[i] < a[cur + ])
  70. {
  71. cur = r[cur + ];
  72. }
  73. r[i] = cur;
  74. }
  75. for (int i = ; i <= n; i++)
  76. {
  77. res -= (LL)a[i] * (LL)(i - l[i] + ) * (LL)(r[i] - i + );
  78. }
  79. printf("%lld\n", res);
  80. }
  81. return ;
  82. }

J

BFS

  1. #include<bits/stdc++.h>
  2. typedef long long ll;
  3. using namespace std;
  4. const ll mod = 1e9 + ;
  5. int dp[];
  6. void init()
  7. {
  8. dp[] = , dp[] = ;
  9. for (int i = ; i <= ; i++)
  10. {
  11. dp[i] = dp[i - (i & (-i))] + ;
  12. }
  13. }
  14. int visit[];
  15. queue<pair<int, int> > que;
  16. int main()
  17. {
  18. init();
  19. int a, b;
  20. cin >> a >> b;
  21. int anser = INT_MAX;
  22. que.push(make_pair(a, ));
  23. while (!que.empty())
  24. {
  25. int now = que.front().first;
  26. visit[now] = ;
  27. int cur = que.front().second;
  28. //cout<<now<<" "<<cur<<endl;
  29. que.pop();
  30. if (now == b)
  31. {
  32. cout << cur << endl;
  33. return ;
  34. }
  35. if (!visit[now - ])
  36. {
  37. que.push(make_pair(now - , cur + ));
  38. visit[now - ] = ;
  39. }
  40. if (!visit[now + ])
  41. {
  42. que.push(make_pair(now + , cur + ));
  43. visit[now + ] = ;
  44. }
  45. if (!visit[now + dp[now]])
  46. {
  47. que.push(make_pair(now + dp[now], cur + ));
  48. visit[now + dp[now]] = ;
  49. }
  50. if (!visit[now - dp[now]])
  51. {
  52. que.push(make_pair(now - dp[now], cur + ));
  53. visit[now - dp[now]] = ;
  54. }
  55. }
  56. return ;
  57. }

K

二分答案

  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3. int a[] ;
  4. #define LL long long
  5. int main(){
  6. int n , k ;
  7. cin >> n >> k ;
  8. for( int i = ; i <= n - ; i++ )
  9. scanf( "%d" , &a[i] ) ;
  10. LL l , r ;
  11. l = ; r = 1e11 ;
  12. while( l + < r ){
  13. LL mid = ( l + r ) >> ;
  14. LL sum = ;
  15. int cnt = ;
  16. for( int i = ; i <= n - ; i++ ){
  17. if ( a[i] > mid ) { cnt += 0x3f3f3f3f ; break ; }
  18. sum += a[i] ;
  19. if ( sum > mid ){
  20. cnt++ ; sum = a[i] ;
  21. }
  22. }
  23. if ( cnt > k ) l = mid ;
  24. else r = mid ;
  25. }
  26. cout << r << endl ;
  27. return ;
  28. }

L

倒着搜索

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6. const int maxn = 2e3 + ;
  7. const int maxm = 1e5 + ;
  8. struct coord
  9. {
  10. int x, y;
  11. } tmp, nxt;
  12. queue<coord>q;
  13. int T, m, res;
  14. int x[maxm], y[maxm], ans[maxn];
  15. int state[maxn][maxn];
  16. int dir[][] = {{, -}, {, }, { -, }, {, }};
  17. void bfs(int x, int y)
  18. {
  19. state[tmp.x = x][tmp.y = y] = ; //给所有大空地的地方打上标记 相当于并查集
  20. res--, q.push(tmp); //剩下的数目-1 进行BFS
  21. while (!q.empty())
  22. {
  23. tmp = q.front();
  24. q.pop();
  25. for (int i = ; i < ; i++)
  26. {
  27. nxt.x = tmp.x + dir[i][]; //目标点的横纵坐标
  28. nxt.y = tmp.y + dir[i][];
  29. if (nxt.x < || nxt.x > || nxt.y < || nxt.y > ) //如果这个点不符合条件
  30. {
  31. continue;
  32. }
  33. if (state[nxt.x][nxt.y] != ) //如果这个点是树
  34. {
  35. continue;
  36. }
  37. state[nxt.x][nxt.y] = ;
  38. res--;
  39. q.push(nxt);
  40. }
  41. }
  42. }
  43. bool check(int x, int y)
  44. {
  45. for (int i = ; i < ; i++)
  46. {
  47. int xx = x + dir[i][], yy = y + dir[i][];
  48. if (xx < || xx > || yy < || yy > )
  49. {
  50. continue;
  51. }
  52. if (state[xx][yy] == )
  53. {
  54. return ;
  55. }
  56. }
  57. return ;
  58. }
  59. int main()
  60. {
  61. scanf("%d", &m);
  62. for (int i = ; i <= m; i++)
  63. {
  64. scanf("%d%d", &x[i], &y[i]);
  65. x[i] += , y[i] += ; //避免负数 往右下移动1000
  66. state[x[i]][y[i]] = ; //表示该坐标是树
  67. }
  68. res = * - m; //减去2001*2001剩下的不是树的点
  69. bfs(, ); //减去所有没有被树包围的点
  70. for (int i = m; i; i--)
  71. {
  72. ans[i] = res++;
  73. state[x[i]][y[i]] = ;
  74. if (check(x[i], y[i])) //如果这个树的四连通块有一个属于大空地 就把这个树连通的连通块全部BFS成大空地
  75. {
  76. bfs(x[i], y[i]);
  77. }
  78. }
  79. for (int i = ; i <= m; i++)
  80. {
  81. printf("%d\n", ans[i]);
  82. }
  83. return ;
  84. }

华中校赛 14th的更多相关文章

  1. 华农校赛--G,用set比较大小,缩短时间复杂度

    Array C Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 581  Solved: 101[Submit][Status][Web Board] D ...

  2. 2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?

    题目链接:https://ac.nowcoder.com/acm/contest/625/B 解法:这题其实就是求2^18个点内最近的两个点的距离.我们可以容易想到朴素解法:把每个点作为源点跑最短路取 ...

  3. 『ACM C++』 PTA 天梯赛练习集L1 | 040-41

    近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...

  4. E比昨天更多的棒棒糖(Easy+Hrad)(华师网络赛)(DP||母函数||背包优化)

    Time limit per test: 2.0 seconds Memory limit: 512 megabytes 唐纳德先生的某女性朋友最近与唐纳德先生同居.该女性朋友携带一 baby.该 b ...

  5. A唐纳德先生和假骰子(华师网络赛)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 在进行某些桌游,例如 UNO 或者麻将的时候,常常会需要随机决定从谁开始.骰子 ...

  6. G 唐纳德与子串(easy)(华师网络赛---字符串,后缀数组)(丧心病狂的用后缀自动机A了一发Easy)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的一段字符.这里,我们使用 s[l…r] 来 ...

  7. C易位构词(华师网络赛)(错排)

    Time limit per test: 2.0 seconds Memory limit: 256 megabytes 易位构词 (anagram),指将一个单词中的字母重新排列,原单词中的每个字母 ...

  8. D唐纳德和他的数学老师(华师网络赛)(二分匹配,最大流)

    Time limit per test: 1.0 seconds Memory limit: 256 megabytes 唐纳德是一个数学天才.有一天,他的数学老师决定为难一下他.他跟唐纳德说:「现在 ...

  9. SCAU 13校赛 17115 ooxx numbers

    17115 ooxx numbers 时间限制:1000MS  内存限制:65535K 题型: 编程题   语言: 无限制 Description a number A called oo numbe ...

随机推荐

  1. JS的BOM操作语法

    整理了一下JS的BOM操作语法,这里记录一下. <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  2. @ConfigurationProperties和@Value的区别

    @ConfigurationProperties @Value 功能: 批量注入配置文件中的属性 一个个指定,多个属性多个@Value 松散绑定: 支持 不支持 SpEL: 不支持    支持 JSR ...

  3. 使用不同代理IP刷票的脚本---requests

    投票功能限制刷票是通过限制单个IP的投票次数实现的,所以写了个脚本用于测试此功能. #-*- coding=utf-8 -*- ''' 功能:此脚本用于用不同的IP刷票 作者:Elle 最后修改日期: ...

  4. python学习-23 函数

    函数 1.函数分为:数学定义的函数和编程语言中的函数 例如: - 数学定义的函数:y=2*x+1 - 编程语言的函数: def test(x): x += 1 return x def  :定义函数的 ...

  5. 15_IO流

    IO流 流 流的概念 流(stream)是指一连串流动字节/字符,按照先进先出的方式发送的信息的通道中. 数据源:流入通道中的数据的来源 目的地:流出通道的数据的目的地   输入流和输出流 数据源的数 ...

  6. mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】

    utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...

  7. (十一)springmvc和spring的整合

    1:Maven引入相关的jar包. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  8. SQL 不同服务器数据库操作

    https://www.cnblogs.com/lusunqing/p/3660190.html --创建远程链接服务器 execute sys.sp_addlinkedserver @server= ...

  9. 八、wepy代码规范

    变量与方法尽量使用驼峰式命名,并且注意避免使用$开头. 以$开头的标识符为WePY框架的内建属性和方法,可在JavaScript脚本中以this.的方式直接使用,具体请参考API文档. 小程序入口.页 ...

  10. java01_简介_开发环境

    JAVA的前世今生 美国SUN(Stanford University Network)公司,在中国大陆的正式中文名为"太阳计算机系统(中国)有限公司",在中国台湾的正式中文名为& ...