华中校赛 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 ...
随机推荐
- 移动架构-IOC架构设计
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Inject ...
- AMD, CMD, CommonJS和UMD
我的Github(https://github.com/tonyzheng1990/tonyzheng1990.github.io/issues),欢迎star 今天由于项目中引入的echarts的文 ...
- Hadoop Join
1. Reduce Join工作原理 Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录.然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输 ...
- python学习-14 基本数据类型3
1.字符串 获取字符串的字符,例如: test = 'abcd' a= test[0] # 通过索引,下标,获取字符串中的某一个字符 print(a) b = test[0:1] # 通过下标的 范围 ...
- python笔记007-函数
昨日简要: 1.文件操作: 1.1获得句柄: f = open(‘one.txt’,mode=’’,encoding=’utf-8’) f = open(‘../’) à返回上一层 f = open( ...
- WUSTOJ 1276: 峰峰不搞G(Java)
1276: 峰峰不搞G 题目 给 n 数量的油漆,写出最大的数,每个数对应有油漆的花费.更多内容点击标题. 分析 我读完题,就想到用动态规划,结果是Time Limit Exceed.然后看了 ...
- Redis主从及Cluster区别及注意事项
https://yq.aliyun.com/articles/647342 https://blog.csdn.net/biren_wang/article/details/78117392 http ...
- 【贪心】洛谷2019 OI春令营 - 普及组 作业
[P3817 小A的糖果 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. [贪 ...
- 本地Pycharm将spark程序发送到远端spark集群进行处理
前言 最近在搞hadoop+spark+python,所以就搭建了一个本地的hadoop环境,基础环境搭建地址hadoop2.7.7 分布式集群安装与配置,spark集群安装并集成到hadoop集群, ...
- 牛客 82E 无向图中的最短距离 (bitset,bfs)
有一个n个点的无向图,有m次查询,每次查询给出一些(xi,yi) 令dist(x,y)表示x和y点在图中最短距离,dist(x,x)=0,如果x,y不连通则dist(x,y) = inf 每次查询图中 ...