A

增广

#include<bits/stdc++.h>
using namespace std;
const int MAXN = + ;
vector<int> g[MAXN];
int a[MAXN], b[MAXN], sz[MAXN], cnt[MAXN];
bool mg[MAXN], vis[MAXN];
int n, m;
bool dfs(int u, int f = -)
{
if (g[u].empty()) //如果当前数没有位置是成对的(a[i+1]=a[i]+1)当然不可能缝
{
return false;
}
//第一种情况
for (auto &p : g[u]) //枚举当前数每个成对的位置
if (p != f)
{
if (!vis[p + ] || cnt[u + ] == ) //如果当前这对后面的位置没有被缝并且后面的数数量为1
{
mg[p] = vis[p] = vis[p + ] = ; //缝起来 返回true
if (f != -)
{
mg[f] = ;
}
return true;
}
}
for (auto &p : g[u])
if (p != f)
{
if (dfs(u + , p + ))
{
mg[p] = vis[p] = vis[p + ] = ;
if (f != -)
{
mg[f] = ;
}
return true;
}
}
return false;
}
int main()
{
scanf("%d", &n);
m = ; //m是当前数组的数量
for (int i = , p(-); i < n; ++ i)
{
int x;
scanf("%d", &x);
if (x == p) //p是上一个加入的数
{
sz[m - ] ++; //如果现在加入的和上一个相同就给上一个sz++
}
else //不同的话 加入当前数更新p
{
p = x;
a[m] = x;
sz[m ++] = ;
}
}
n = m;
for (int i = ; i < n; i++)
{
b[i] = a[i];
}
sort(b, b + n);
for (int i = m = ; i < n; i++) //初始化m进行离散化操作
if (i == || b[i] > b[m - ])
{
b[m++] = b[i];
}
for (int i = ; i < n; ++ i) //离散化
{
a[i] = lower_bound(b, b + m, a[i]) - b;
cnt[a[i]] ++; //计数 计算每种数的数量
}
// for (int i = 0; i < n; i++)
// {
// cout << a[i] << " ";
// }
// cout << endl;
for (int i = ; i + < n; ++ i)
{
if (a[i] + == a[i + ]) //如果后一个是前一个+1就建一条有向边
{
g[a[i]].push_back(i); //记录每一对可以缝的位置前面的哪个
}
}
int ret = n - ; //答案(缩点之后缝之前的答案 这里claris姐姐写错了 应该是n-1)
for (int i = m - ; i >= ; -- i) //从大到小尝试是否可以缝当前的数
{
if (dfs(i)) //如果返回true即可以缝的话 答案减少一个
{
-- ret; //对于每一种数 最多只能缝一次 所以最多-1
}
}
printf("%d", ret);
}

B

签到题

D

模拟题

F

给你一个中序遍历 和每个点的权值 问你存不存在一颗树使得每个节点的祖先和它的权值是互质的

解:

质因数分解+分治模拟

因为中序遍历有个特点 如果一个点是一个子树的根的话 左儿子都在左边 右儿子都在右边

所以要求互质的是一段区间 用GCD来做的话肯定会超时 我们给每个合数一个leftprime表示该合数质因数分解后最小的质数

首先我们从左到右枚举 维护每个质数所到的最右边 更新每个合数的答案 再反过来从右到左做一次

然后模拟树分治找到根递归地看能不能构造树

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e6 + , MAXM = 1e5 + ;
const int MAXQ = ;
//int to[MAXM << 1], nxt[MAXM << 1], Head[MAXN], tot = 1;
/*inline void addedge(int u, int v, ll c)
{
to[++tot] = v;
nxt[tot] = Head[u];
cost[tot] = c;
Head[u] = tot;
}*/
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '')
{
if (c == '-')
{
p = -;
}
c = getchar();
}
while (c >= '' && c <= '')
{
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
const int N = + ;
int MAXX = -;
bool flagsum;
int ptot = ;
int num[N];
int father[N];
int prime[N];
bool check[N];
int fanwei[N];
int leftprime[N];
int lans[N], rans[N];
void Euler()
{
ll now;
for (int i = ; i <= MAXX; i ++)
{
if (!check[i])
{
prime[ptot ++] = i;
}
for (int j = ; j < ptot; j ++)
{
now = 1LL * prime[j] * i;
if (now > MAXX)
{
break;
}
check[now] = ;
leftprime[now] = prime[j];
if (i % prime[j] == )
{
break;
}
}
}
}
bool get_ans(int fa, int l, int r)
{
int flag = ;
if (l > r)
{
return true;
}
int aim;
int len = (r - l - ) / + ((r - l - ) & );
for (int i = ; i <= len; i++)
{
aim = l + i;
if (lans[aim] < l && rans[aim] > r)
{
//cout << fa << " " << l << " " << r << " " << i << endl;
//cout << lans[i] << " " << rans[i] << endl;
flag = ;
flag = flag && get_ans(aim, l, aim - ) && get_ans(aim, aim + , r);
if (flag)
{
father[aim] = fa;
return true;
}
else
{
return false;
}
}
aim = r - i;
if (lans[aim] < l && rans[aim] > r)
{
//cout << fa << " " << l << " " << r << " " << i << endl;
//cout << lans[i] << " " << rans[i] << endl;
flag = ;
flag = flag && get_ans(aim, l, aim - ) && get_ans(aim, aim + , r);
if (flag)
{
father[aim] = fa;
return true;
}
else
{
return false;
}
}
}
return false;
}
int main()
{
ios_base::sync_with_stdio();
cin.tie(); int n;
int cnt;
read(n);
for (int i = ; i <= n; i++)
{
read(num[i]);
MAXX = max(MAXX, num[i]);
}
Euler();
// for (int i = 1; i <= 20; i++)
// {
// cout << i << " " << leftprime[i] << endl;
// }
for (int i = ; i <= n; i++)
{
rans[i] = n + ;
}
for (int i = ; i <= n; i++)
{
cnt = num[i];
if (cnt == )
{
continue;
}
//cout<<i<<" ";
if (check[cnt] == )
{
//cout << "l "<<cnt << endl;
lans[i] = max(fanwei[cnt], lans[i]);
fanwei[cnt] = i;
continue;
}
while (check[cnt])
{
//cout << "l " << cnt << endl;
int primenow = leftprime[cnt];
lans[i] = max(fanwei[primenow], lans[i]);
fanwei[primenow] = i;
while (cnt % primenow == )
{
cnt /= primenow;
}
}
if (cnt == )
{
continue;
}
else
{
//cout << "l " << cnt << endl;
lans[i] = max(fanwei[cnt], lans[i]);
fanwei[cnt] = i;
}
}
for (int i = ; i <= N; i++)
{
fanwei[i] = n + ;
}
for (int i = n; i >= ; i--)
{
cnt = num[i];
if (cnt == )
{
continue;
}
//cout<<i<<" ";
if (check[cnt] == )
{
//cout << "r "<<cnt << endl;
rans[i] = min(fanwei[cnt], rans[i]);
fanwei[cnt] = i;
continue;
}
while (check[cnt])
{
//cout << "r "<<cnt << endl;
int primenow = leftprime[cnt];
rans[i] = min(fanwei[primenow], rans[i]);
fanwei[primenow] = i;
while (cnt % primenow == )
{
cnt /= primenow;
}
}
if (cnt == )
{
continue;
}
else
{
// cout << "r "<<cnt << endl;
// cout << cnt << endl;
rans[i] = min(fanwei[cnt], rans[i]);
fanwei[cnt] = i;
}
}
// for(int i=1;i<=n;i++)
// {
// cout<<i<<" "<<lans[i]<<" "<<rans[i]<<endl;
// }
flagsum = get_ans(, , n);
if (!flagsum)
{
cout << "impossible" << endl;
}
else
{
for (int i = ; i <= n; i++)
{
cout << father[i];
if (i != n)
{
cout << " ";
}
}
cout << endl;
}
return ;
}

G

几何题

H

小的直接暴力 大的加给大的

I

背包DP  记录路径还需要一个二维数组

/*Huyyt*/
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef pair<int, int> PINT;
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-;
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
const int mod = 1e9 + , gakki = + + + + 1e9;
const int MAXN = 1e6 + , MAXM = 1e5 + ;
const int MAXQ = , INF = 1e9;
//int to[MAXM << 1], nxt[MAXM << 1], Head[MAXN], tot = 1;
/*inline void addedge(int u, int v, ll c)
{
to[++tot] = v;
nxt[tot] = Head[u];
cost[tot] = c;
Head[u] = tot;
}*/
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '')
{
if (c == '-')
{
p = -;
}
c = getchar();
}
while (c >= '' && c <= '')
{
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
struct node
{
int first, second, index;
} bag[];
bool cmp(node a, node b)
{
return (a.first - a.second) > (b.first - b.second);
}
int dp[][];
int print[][];
PINT before[][];
stack<int> anser;
int main()
{
ios_base::sync_with_stdio();
cin.tie(); int n, c;
scanf("%d %d", &n, &c);
for (int i = ; i <= n; i++)
{
scanf("%d %d", &bag[i].first, &bag[i].second);
bag[i].index = i;
}
sort(bag + , bag + + n, cmp);
int ans = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= c; j++)
{
dp[i][j] = -INF;
}
dp[][] = ;
PINT ed = make_pair(, );
for (int i = ; i <= n; i++)
{
for (int j = ; j <= c; j++)
{
if (dp[i - ][j] > dp[i][j])
{
dp[i][j] = dp[i - ][j];
before[i][j] = make_pair(i - , j);
print[i][j] = print[i - ][j];
}
}
for (int j = ; j <= c; j++)
{
if (j >= bag[i].second && j + bag[i].first - bag[i].second <= c)
{
if (dp[i - ][j - bag[i].second] != -INF)
{
if (dp[i][j] < dp[i - ][j - bag[i].second] + )
{
dp[i][j] = dp[i - ][j - bag[i].second] + ;
print[i][j] = bag[i].index;
before[i][j] = make_pair(i - , j - bag[i].second);
if (dp[i][j] > ans)
{
ans = dp[i][j];
ed = make_pair(i, j);
}
}
}
}
}
}
int printnow;
cout << ans << endl;
for (; ed.first; ed = before[ed.first][ed.second])
{
if (printnow != print[ed.first][ed.second] && print[ed.first][ed.second] != )
{
anser.push(print[ed.first][ed.second]);
}
printnow = print[ed.first][ed.second];
}
while (!anser.empty())
{
cout << anser.top() << " ";
anser.pop();
}
return ;
}

J

找规律题

我们可以通过打暴力程序对比发现每个2一轮一轮地模拟和一个一个地模拟得到的结果是一样的

但是直接把一个一个滚的模拟交上去会T7 需要再简化一下

每当遇到一个二 找到它左边最近的0和右边最近的0位置分别为L与R

则这一段数列除了L+R-i这个位置变成0 其他位置都会变成1

K

概率题

uestc summer training #2的更多相关文章

  1. 2015 UESTC Winter Training #10【Northeastern Europe 2009】

    2015 UESTC Winter Training #10 Northeastern Europe 2009 最近集训都不在状态啊,嘛,上午一直在练车,比赛时也是刚吃过午饭,状态不好也难免,下次比赛 ...

  2. 2015 UESTC Winter Training #8【The 2011 Rocky Mountain Regional Contest】

    2015 UESTC Winter Training #8 The 2011 Rocky Mountain Regional Contest Regionals 2011 >> North ...

  3. 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】

    2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...

  4. 2015 UESTC Winter Training #6【Regionals 2010 >> North America - Rocky Mountain】

    2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...

  5. 2015 UESTC Winter Training #4【Regionals 2008 :: Asia - Tehran】

    2015 UESTC Winter Training #4 Regionals 2008 :: Asia - Tehran 比赛开始时电脑死活也连不上WIFI,导致花了近1个小时才解决_(:зゝ∠)_ ...

  6. uestc summer training #9 牛客第三场 BFS计数

    G.coloring tree BFS计数 题目:给你n(<=5000)个节点的一颗树 你有K(<=5000)种颜色 你可以给每一个节点染一种颜色 总共有Kn种染色方法 在一种染色方法中 ...

  7. uestc summer training #4 牛客第一场

    A dp[i][j][k]可以n3地做 但是正解是找把问题转化为一个两点不相交路径 最终答案为C(n+m, n)2-C(n+m, m-1)C(n+m,n-1) B 把题目的矩阵看成无向图的邻接矩阵 这 ...

  8. uestc summer training #1

    A 一个很好想的dp ll dp[maxn][]; int main() { scanf("%d%d",&n,&k); memset(dp,,sizeof(dp)) ...

  9. uestc summer training #3 线段树优化建边

    线段树建边 struct E { int value, modvalue; } a[MAXN << ]; pair<int, int> b[MAXN]; ], r[MAXN & ...

随机推荐

  1. C# Await

    每次提到异步我都选择绕开,感觉深不可测,最近打算看看异步,但又不愿意看书,网上找了几个视频看,发现传智播客的老师讲异步都不是很深入,关键的问题一笔带过,倒是把我弄糊涂了,印象最深刻的是那个老师说的一句 ...

  2. 网络分析:WireShark

    安装 WireShark 官网 过滤器 类别 显示过滤器模式 捕获过滤器模式 逻辑表达式 and:&& or:|| 成组:() 过滤实例 仅监听某域名 http.host == &qu ...

  3. k8s1.11.0安装、一个master、一个node、查看node名称是ip、node是扩容进来的、带cadvisor监控服务

    一个master.一个node.查看node节点是ip # 安装顺序:先在test1 上安装完必要组件后,就开始在 test2 上单独安装node组件,实现node功能,再返回来配置test1加入集群 ...

  4. cryptopp 加密库的安装

    今天 在搭建环境的过程中遇到一个问题:C++ 的加密库 crypto在新系统中没有安装,于是百度一下,顺便解决问题 1.开源包下载 下载地址:https://www.cryptopp.com/#dow ...

  5. CNN卷积汇总

    1,卷积作用:减少参数(卷积核参数共享),卷积过程中不断对上一个输出进行抽象,由局部特征归纳为全局特征(不同卷积层可视化可以观察到这点) 2,卷积核 早期卷积核由人工总结,如图像处理中有: 深度神经网 ...

  6. cisco路由器配置(三) 最终网关

    Gateway(config)#ip route 0.0.0.0 0.0.0.0 217.124.6.1  /*管理距离为1/orGateway(config)#ip route 0.0.0.0 0. ...

  7. TensorFlow实战第一课(session、Variable、Placeholder、Activation Function)

    莫烦tensorflow教学 1.session会话控制 Tensorflow 中的Session, Session是 Tensorflow 为了控制,和输出文件的执行的语句. 运行session.r ...

  8. python 实例化 类方法 静态方法 成员变量 实例方法 等调用

    1.参考代码如下 # coding:utf-8 class student: # 成员变量 ok = None like = '八戒你瘦了' # 实例方法 def __init__(self): # ...

  9. 【DSP开发】TI第二代KeyStone SoC诠释德仪的“云”态度

    11月14日,期盼已久的德州仪器基于ARM Cortex-A15的产品终于新鲜出炉.伴随着TIKeyStone II多核 SoC系列产品的发布,结合了ARM Cortex-A15 处理器.C66x D ...

  10. 大数据之Hadoop完全分布式集群搭建

    1.准备阶段 1.1.新建三台虚拟机 Hadoop完全分市式集群是典型的主从架构(master-slave),一般需要使用多台服务器来组建.我们准备3台服务器(关闭防火墙.静态IP.主机名称).如果没 ...