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. iOS实现渐变颜色

    下面是我的两种实现: 1.直接图片展示,注意图片的变形问题; 2.用CAGradientLayer渐变颜色实现; 代码如下: // // ViewController.m // ImageStrenc ...

  2. split 使用

    split作用:把字符串变成列表,这个字符串必须是多行文字.如果是单行文字或一个单词是不行的,实例操作如下: In [46]: output=subprocess.check_output(['df' ...

  3. 002. Add Two Numbers

    题目链接:https://leetcode.com/problems/add-two-numbers/description/ Example: Input: (2 -> 4 -> 3) ...

  4. Python浮点型数据小数点的取舍

    python默认的是17位小数的精度 1.round()内置方法 π=3.1415926535 new_num=round(π,2)     #四舍五入保留两位小数 print(new_num)    ...

  5. rpm操作

    --查找某个软件:abc rpm -qa |grep abc --删除某个软件:abc rpm -e --noscripts  abc

  6. android webkit 初始化流程

    以android 4.2为例 1, android 4.2中 WebViewClassic.java 为 WebView.java的代理类. 2,程序运行后,浏览器首先加载webkit so. Web ...

  7. 【OpenGL】初识OpenGL4.0

    目录(?)[-] 什么是GLSL GLEW 安装GLEW 使用GLEW 其他库 使用GLM库进行数学运算 安装GLM 使用GLM 使用GLM作为OpenGL的输入 使用GLFW进行窗口管理 这篇文章主 ...

  8. grep与正则表达式:

    1.grep程序 Linux下有文本处理三剑客 -- grep sed awk grep:文本 行过滤工具 sed: 文本 行编辑器(流编辑器) awk:报告生成器(做文本输出格式化)  grep   ...

  9. 第六次java实验报告

    Java实验报告 班级 计科二班 学号20188437 姓名 何磊 完成时间 2019/10/17 评分等级 实验四 类的继承 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法 ...

  10. 自己总结的keepalived的配置流程以及注意事项

    编写背景:上班时领导要求我们团队实现postgresql主备切换的高可用问题,我辅助keepalived的部分,从查资料到实施最后使用,最后编写了这个博客,水平有限,欢迎大家指正 ###postgre ...