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. gcc posix sjij for MSYS 9.2.1+

    mingw gcc 32位 版本 9.2.1 以上的 以后都在 github 上发布 https://github.com/qq2225936589/gcc-i686-posix-sjlj-for-M ...

  2. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  3. TensorFlow 用神经网络解决非线性问题

    本节涉及点: 激活函数 sigmoid 产生随机训练数据 使用随机训练数据训练 加入偏移量b加快训练过程 进阶:批量生产随机训练数据 在前面的三好学生问题中,学校改变了评三好的标准 —— 总分> ...

  4. PHP常用的 五种设计模式及应用场景

    设计模式六大原则 开放封闭原则:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象. 依赖倒置原则:高层模块不应该依赖低层模块,二者 ...

  5. Linux进程信号

    信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能终止 17 STOP 无条件停止运行,但不终止 1 ...

  6. 【Linux开发】linux设备驱动归纳总结(三):2.字符型设备的操作open、close、read、write

    linux设备驱动归纳总结(三):2.字符型设备的操作open.close.read.write 一.文件操作结构体file_operations 继续上次没讲完的问题,文件操作结构体到底是什么东西, ...

  7. python 爬虫 requests模块 目录

    requests模块(response常用属性) 基于requests模块的get请求 基于requests模块发起ajax的get请求 基于requests模块发起ajax的post请求

  8. 常用的 Git 命令,给你准备好了!

    分支操作: git branch 创建分支 git branch -b 创建并切换到新建的分支上 git checkout 切换分支 git branch 查看分支列表 git branch -v 查 ...

  9. Ubuntu19.04系统SSH连接CentOS7虚拟机

    一.为CentOS7配置静态IP 注意查看宿主机(Ubuntu19.04)所在局域网段,当前为172.18.25.108 修改当前系统下virtual box的网络设置 [控制]-->[设置]- ...

  10. IOS订阅优惠-PHP生成ECDSA算法签名

    <?php use Ramsey\Uuid\Uuid; class ItunesSignatureGenerator { private $appBundleID = 'www.u17.com' ...