华中校赛 14th
https://www.nowcoder.com/acm/contest/106#question
A
分类讨论
- #include<bits/stdc++.h>
- using namespace std ;
- #define LL long long
- int a[] ;
- int d[] ;
- vector< int > v[] ;
- void dfs( int id , int fa , int c ){
- d[id] = c ;
- for( int i = ; i < v[id].size() ; i++ ){
- if( v[id][i] == fa ) continue ;
- dfs( v[id][i] , id , - c ) ;
- }
- }
- int main(){
- int T ;
- cin >> T ;
- while( T-- ){
- int n ;
- scanf( "%d" , &n ) ;
- for( int i = ; i <= n ; i++ )
- v[i].clear() ;
- for( int i = ; i <= n - ; i++ ){
- int a , b ;
- scanf( "%d%d" , &a , &b ) ;
- v[a].push_back( b ) ;
- v[b].push_back( a ) ;
- }
- dfs( , , ) ;
- LL b , w ;
- b = ; w = ;
- for( int i = ; i <= n ; i++ )
- if ( d[i] == ) b++ ;
- else w++ ;
- LL ans = ;
- if ( n & ) { ans = * ( b * b * w + w * w * b ) ; }
- else{ ans = b * b * b + w * w * w + b * b * w + w * w * b ; }
- printf( "%lld\n" , ans ) ;
- }
- return ;
- }
B
等比数列
- #include<bits/stdc++.h>
- using namespace std ;
- #define LL long long
- char s[] ;
- const LL mod = 1e9 + ;
- LL two[] ;
- LL pow_mod( LL a , LL b ){
- a %= mod ;
- LL ans = ;
- while( b ){
- if ( b & ) { ans *= a ; ans %= mod ; }
- a *= a ; a %= mod ; b >>= ;
- }
- return ans ;
- }
- LL inv_mod( LL x ){
- return pow_mod( x , mod - ) ;
- }
- int main(){
- int k ;
- cin >> k ;
- scanf( "%s" , s ) ;
- two[] = ;
- for( int i = ; i <= ; i++ ){
- two[i] = two[i - ] * ;
- two[i] %= mod ;
- }
- LL ans = ;
- int len = strlen( s ) ;
- for( int i = ; i < len ; i++ ){
- if ( s[i] == '' || s[i] == '' ){
- ans += two[i] ; ans %= mod ;
- }
- }
- LL q = two[len] ;
- if ( q == ) { ans *= k ; ans %= mod ; }
- else{
- LL res = pow_mod( q , k ) ;
- res-- ; if ( res < ) res += mod ;
- ans *= res ; ans %= mod ;
- q-- ; if ( q < ) q += mod ;
- ans *= inv_mod( q ) ; ans %= mod ;
- }
- cout << ans << endl ;
- return ;
- }
C
并查集 (不带子树转移版)
有四种操作
1 u v 合并u,v所在的并查集
2 u 将u从其所在的并查集中分离出来
3 u 询问u所在并查集的大小
4 u v 询问u,v是否在一个并查集内
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define ull unsigned long long
- #define pii pair<int, int>
- #define pb push_back
- #define mk make_pair
- #define fi first
- #define se second
- #define ALL(A) A.begin(), A.end()
- #define sqr(x) ((x)*(x))
- #define sc(x) scanf("%d", &x)
- #define pr(x) printf(">>>"#x":%d\n", x)
- #define fastio ios::sync_with_stdio(0),cin.tie(0)
- #define frein freopen("in.txt", "r", stdin)
- #define freout freopen("out.txt", "w", stdout)
- #define debug cout<<">>>STOP"<<endl
- template<class T> T gcd(T a, T b)
- {
- if (!b)
- {
- return a;
- }
- return gcd(b, a % b);
- }
- const int maxn = 2e5 + ;
- int par[maxn], hs[maxn];
- int sz[maxn];
- int cnt;
- void init(int n)
- {
- for (int i = ; i <= n; i++)
- {
- par[i] = i, hs[i] = i, sz[i] = ;
- }
- }
- int find(int x)
- {
- return par[x] == x ? x : par[x] = find(par[x]);
- }
- void unite(int x, int y)
- {
- x = find(x);
- y = find(y);
- if (x != y)
- {
- par[x] = y, sz[y] += sz[x];
- }
- }
- void del(int x)
- {
- sz[find(hs[x])]--;
- hs[x] = ++cnt;
- }
- int main()
- {
- int T, kase = ;
- sc(T);
- while (T--)
- {
- printf("Case #%d:\n", kase++);
- int n, q;
- sc(n);
- sc(q);
- init(n + q);
- cnt = n;
- for (int i = ; i < q; i++)
- {
- int op;
- sc(op);
- if (op == )
- {
- int u, v;
- sc(u);
- sc(v);
- unite(hs[u], hs[v]);
- }
- else if (op == )
- {
- int u;
- sc(u);
- del(u);
- }
- else if (op == )
- {
- int u;
- sc(u);
- int ans = sz[find(hs[u])];
- printf("%d\n", ans);
- }
- else
- {
- int u, v;
- sc(u);
- sc(v);
- if (find(hs[u]) == find(hs[v]))
- {
- printf("YES\n");
- }
- else
- {
- printf("NO\n");
- }
- }
- }
- }
- return ;
- }
F
冒泡排序变种
- #include<bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- const ll mod = 1e9 + ;
- int num[];
- int number[];
- int visit[];
- vector<int> now[];
- int pop = ;
- int ans[];
- int main()
- {
- int n;
- int k;
- cin >> n >> k;
- int cur = ;
- for (int i = ; i <= n; i++)
- {
- scanf("%d", &num[i]);
- ans[i] = num[i];
- }
- sort(ans + , ans + + n);
- if (k == )
- {
- for (int i = ; i <= n; i++)
- {
- if (num[i] != ans[i])
- {
- cout << i << endl;
- return ;
- }
- }
- cout << - << endl;
- return ;
- }
- for (int i = ; i <= n; i++)
- {
- if (visit[i])
- {
- continue;
- }
- ++pop;
- cur = ;
- for (int j = i; j <= n; j += k)
- {
- if (!visit[j])
- {
- now[pop].push_back(num[j]);
- //cout<<num[j]<<" "<<j<<" ";
- }
- }
- //cout<<endl;
- sort(now[pop].begin(), now[pop].end());
- for (int j = i; j <= n; j += k)
- {
- if (!visit[j])
- {
- number[j] = now[pop][cur++];
- visit[j] = ;
- }
- }
- }
- for (int i = ; i <= n; i++)
- {
- if (number[i] != ans[i])
- {
- cout << i << endl;
- return ;
- }
- }
- cout << - << endl;
- return ;
- }
G
反推是否符合垂心 重心 内心 外心
- x=[0,0,0,0];
- y=[0,0,0,0];
- def dOt(x0,y0,x1,y1):
- return x0*x1+y0*y1;
- def cRoss(x0,y0,x1,y1):
- return x0*y1-x1*y0;
- def lEnth2(x,y):
- return x*x+y*y;
- def check0():
- n=[0,0,0];
- for i in range(3):
- n[i]=cRoss(x[(i+1)%3]-x[i],y[(i+1)%3]-y[i],x[3]-x[i],y[3]-y[i]);
- if (n[0]<0 and n[1]<0 and n[2]<0) or (0<n[0] and 0<n[1] and 0<n[2]):
- return 1;
- else:
- return 0;
- def check1():
- for i in range(3):
- 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:
- return 0;
- return 1
- def check2():
- n=[0,0];
- for i in range(3):
- n[0]=abs(cRoss(x[(i+1)%3]-x[i],y[(i+1)%3]-y[i],x[3]-x[i],y[3]-y[i]));
- n[1]=abs(cRoss(x[(i+2)%3]-x[i],y[(i+2)%3]-y[i],x[3]-x[i],y[3]-y[i]));
- if n[0]!=n[1]:
- return 0;
- if check0()==1:
- return 1;
- else:
- return 0;
- def check3():
- s=[0,0,0];
- l=[0,0,0];
- for i in range(3):
- s[i]=abs(cRoss(x[i]-x[3],y[i]-y[3],x[(i+1)%3]-x[3],y[(i+1)%3]-y[3]));
- l[i]=lEnth2(x[(i+1)%3]-x[i],y[(i+1)%3]-y[i]);
- for i in range(3):
- if s[i]*s[i]*l[(i+1)%3]!=s[(i+1)%3]*s[(i+1)%3]*l[i]:
- return 0;
- if check0()==1:
- return 1;
- else:
- return 0;
- def check4():
- d=[0,0,0];
- for i in range(3):
- d[i]=lEnth2(x[i]-x[3],y[i]-y[3]);
- if d[0]!=d[1] or d[1]!=d[2] or d[2]!=d[0]:
- return 0;
- return 1
- for i in range(4):
- x[i],y[i]=map(int,input().split());
- if check1()==1 or check2()==1 or check3()==1 or check4()==1:
- print("Yes");
- else:
- print("No");
I
单调队列 O(n)可以处理处每个点的贡献
注意在push的时候一侧要是严格的 另一侧要是不严格的 比如先>= 后> 因为这样才是全部情况 如果全是严格则缺少情况 全是不严格则有重复情况
(即一个区间应只有一个最大值最小值有贡献 如果有多个最大值最小值也只能算一次)
- #include<bits/stdc++.h>
- using namespace std;
- #define LL long long
- const int maxn = + ;
- int a[maxn], l[maxn], r[maxn];
- inline void scan(int &a)
- {
- a = ;
- char c;
- while (c = getchar(), !isdigit(c));
- a = c - '';
- while (c = getchar(), isdigit(c))
- {
- a = a * + c - '';
- }
- }
- int main()
- {
- int n;
- while (scanf("%d", &n) != EOF)
- {
- LL res = ;
- for (int i = ; i <= n; i++)
- {
- scanf("%d", &a[i]);
- }
- for (int i = ; i <= n; i++)
- {
- l[i] = r[i] = i;
- }
- for (int i = ; i <= n; i++)
- {
- int cur = i;
- while (cur > && a[i] >= a[cur - ])
- {
- cur = l[cur - ];
- }
- l[i] = cur;
- }
- for (int i = n - ; i >= ; i--)
- {
- int cur = i;
- while (cur < n && a[i] > a[cur + ])
- {
- cur = r[cur + ];
- }
- r[i] = cur;
- }
- for (int i = ; i <= n; i++)
- {
- res += (LL)a[i] * (LL)(i - l[i] + ) * (LL)(r[i] - i + );
- }
- for (int i = ; i <= n; i++)
- {
- l[i] = r[i] = i;
- }
- for (int i = ; i <= n; i++)
- {
- int cur = i;
- while (cur > && a[i] <= a[cur - ])
- {
- cur = l[cur - ];
- }
- l[i] = cur;
- }
- for (int i = n - ; i >= ; i--)
- {
- int cur = i;
- while (cur < n && a[i] < a[cur + ])
- {
- cur = r[cur + ];
- }
- r[i] = cur;
- }
- for (int i = ; i <= n; i++)
- {
- res -= (LL)a[i] * (LL)(i - l[i] + ) * (LL)(r[i] - i + );
- }
- printf("%lld\n", res);
- }
- return ;
- }
J
BFS
- #include<bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- const ll mod = 1e9 + ;
- int dp[];
- void init()
- {
- dp[] = , dp[] = ;
- for (int i = ; i <= ; i++)
- {
- dp[i] = dp[i - (i & (-i))] + ;
- }
- }
- int visit[];
- queue<pair<int, int> > que;
- int main()
- {
- init();
- int a, b;
- cin >> a >> b;
- int anser = INT_MAX;
- que.push(make_pair(a, ));
- while (!que.empty())
- {
- int now = que.front().first;
- visit[now] = ;
- int cur = que.front().second;
- //cout<<now<<" "<<cur<<endl;
- que.pop();
- if (now == b)
- {
- cout << cur << endl;
- return ;
- }
- if (!visit[now - ])
- {
- que.push(make_pair(now - , cur + ));
- visit[now - ] = ;
- }
- if (!visit[now + ])
- {
- que.push(make_pair(now + , cur + ));
- visit[now + ] = ;
- }
- if (!visit[now + dp[now]])
- {
- que.push(make_pair(now + dp[now], cur + ));
- visit[now + dp[now]] = ;
- }
- if (!visit[now - dp[now]])
- {
- que.push(make_pair(now - dp[now], cur + ));
- visit[now - dp[now]] = ;
- }
- }
- return ;
- }
K
二分答案
- #include<bits/stdc++.h>
- using namespace std ;
- int a[] ;
- #define LL long long
- int main(){
- int n , k ;
- cin >> n >> k ;
- for( int i = ; i <= n - ; i++ )
- scanf( "%d" , &a[i] ) ;
- LL l , r ;
- l = ; r = 1e11 ;
- while( l + < r ){
- LL mid = ( l + r ) >> ;
- LL sum = ;
- int cnt = ;
- for( int i = ; i <= n - ; i++ ){
- if ( a[i] > mid ) { cnt += 0x3f3f3f3f ; break ; }
- sum += a[i] ;
- if ( sum > mid ){
- cnt++ ; sum = a[i] ;
- }
- }
- if ( cnt > k ) l = mid ;
- else r = mid ;
- }
- cout << r << endl ;
- return ;
- }
L
倒着搜索
- #include<queue>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int maxn = 2e3 + ;
- const int maxm = 1e5 + ;
- struct coord
- {
- int x, y;
- } tmp, nxt;
- queue<coord>q;
- int T, m, res;
- int x[maxm], y[maxm], ans[maxn];
- int state[maxn][maxn];
- int dir[][] = {{, -}, {, }, { -, }, {, }};
- void bfs(int x, int y)
- {
- state[tmp.x = x][tmp.y = y] = ; //给所有大空地的地方打上标记 相当于并查集
- res--, q.push(tmp); //剩下的数目-1 进行BFS
- while (!q.empty())
- {
- tmp = q.front();
- q.pop();
- for (int i = ; i < ; i++)
- {
- nxt.x = tmp.x + dir[i][]; //目标点的横纵坐标
- nxt.y = tmp.y + dir[i][];
- if (nxt.x < || nxt.x > || nxt.y < || nxt.y > ) //如果这个点不符合条件
- {
- continue;
- }
- if (state[nxt.x][nxt.y] != ) //如果这个点是树
- {
- continue;
- }
- state[nxt.x][nxt.y] = ;
- res--;
- q.push(nxt);
- }
- }
- }
- bool check(int x, int y)
- {
- for (int i = ; i < ; i++)
- {
- int xx = x + dir[i][], yy = y + dir[i][];
- if (xx < || xx > || yy < || yy > )
- {
- continue;
- }
- if (state[xx][yy] == )
- {
- return ;
- }
- }
- return ;
- }
- int main()
- {
- scanf("%d", &m);
- for (int i = ; i <= m; i++)
- {
- scanf("%d%d", &x[i], &y[i]);
- x[i] += , y[i] += ; //避免负数 往右下移动1000
- state[x[i]][y[i]] = ; //表示该坐标是树
- }
- res = * - m; //减去2001*2001剩下的不是树的点
- bfs(, ); //减去所有没有被树包围的点
- for (int i = m; i; i--)
- {
- ans[i] = res++;
- state[x[i]][y[i]] = ;
- if (check(x[i], y[i])) //如果这个树的四连通块有一个属于大空地 就把这个树连通的连通块全部BFS成大空地
- {
- bfs(x[i], y[i]);
- }
- }
- for (int i = ; i <= m; i++)
- {
- printf("%d\n", ans[i]);
- }
- return ;
- }
华中校赛 14th的更多相关文章
- 华农校赛--G,用set比较大小,缩短时间复杂度
Array C Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 581 Solved: 101[Submit][Status][Web Board] D ...
- 2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?
题目链接:https://ac.nowcoder.com/acm/contest/625/B 解法:这题其实就是求2^18个点内最近的两个点的距离.我们可以容易想到朴素解法:把每个点作为源点跑最短路取 ...
- 『ACM C++』 PTA 天梯赛练习集L1 | 040-41
近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...
- E比昨天更多的棒棒糖(Easy+Hrad)(华师网络赛)(DP||母函数||背包优化)
Time limit per test: 2.0 seconds Memory limit: 512 megabytes 唐纳德先生的某女性朋友最近与唐纳德先生同居.该女性朋友携带一 baby.该 b ...
- A唐纳德先生和假骰子(华师网络赛)
Time limit per test: 1.0 seconds Memory limit: 256 megabytes 在进行某些桌游,例如 UNO 或者麻将的时候,常常会需要随机决定从谁开始.骰子 ...
- G 唐纳德与子串(easy)(华师网络赛---字符串,后缀数组)(丧心病狂的用后缀自动机A了一发Easy)
Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的一段字符.这里,我们使用 s[l…r] 来 ...
- C易位构词(华师网络赛)(错排)
Time limit per test: 2.0 seconds Memory limit: 256 megabytes 易位构词 (anagram),指将一个单词中的字母重新排列,原单词中的每个字母 ...
- D唐纳德和他的数学老师(华师网络赛)(二分匹配,最大流)
Time limit per test: 1.0 seconds Memory limit: 256 megabytes 唐纳德是一个数学天才.有一天,他的数学老师决定为难一下他.他跟唐纳德说:「现在 ...
- SCAU 13校赛 17115 ooxx numbers
17115 ooxx numbers 时间限制:1000MS 内存限制:65535K 题型: 编程题 语言: 无限制 Description a number A called oo numbe ...
随机推荐
- JS的BOM操作语法
整理了一下JS的BOM操作语法,这里记录一下. <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...
- @ConfigurationProperties和@Value的区别
@ConfigurationProperties @Value 功能: 批量注入配置文件中的属性 一个个指定,多个属性多个@Value 松散绑定: 支持 不支持 SpEL: 不支持 支持 JSR ...
- 使用不同代理IP刷票的脚本---requests
投票功能限制刷票是通过限制单个IP的投票次数实现的,所以写了个脚本用于测试此功能. #-*- coding=utf-8 -*- ''' 功能:此脚本用于用不同的IP刷票 作者:Elle 最后修改日期: ...
- python学习-23 函数
函数 1.函数分为:数学定义的函数和编程语言中的函数 例如: - 数学定义的函数:y=2*x+1 - 编程语言的函数: def test(x): x += 1 return x def :定义函数的 ...
- 15_IO流
IO流 流 流的概念 流(stream)是指一连串流动字节/字符,按照先进先出的方式发送的信息的通道中. 数据源:流入通道中的数据的来源 目的地:流出通道的数据的目的地 输入流和输出流 数据源的数 ...
- mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】
utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...
- (十一)springmvc和spring的整合
1:Maven引入相关的jar包. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- SQL 不同服务器数据库操作
https://www.cnblogs.com/lusunqing/p/3660190.html --创建远程链接服务器 execute sys.sp_addlinkedserver @server= ...
- 八、wepy代码规范
变量与方法尽量使用驼峰式命名,并且注意避免使用$开头. 以$开头的标识符为WePY框架的内建属性和方法,可在JavaScript脚本中以this.的方式直接使用,具体请参考API文档. 小程序入口.页 ...
- java01_简介_开发环境
JAVA的前世今生 美国SUN(Stanford University Network)公司,在中国大陆的正式中文名为"太阳计算机系统(中国)有限公司",在中国台湾的正式中文名为& ...