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. 网站集成Paypal

    国际化Paypal是一个不错的选择,现在很多的app都是H5,所以网站集成即可操作了. 最方便快捷的集成方式,目前Paypal的网站收款需要企业账号,不过它最开始的老版本是可以个人账号收款的.如下是个 ...

  2. web端测试之封装公共部分

    from time import * from selenium import webdriver def login(self,username,passwd): self.dr=webdriver ...

  3. python3速查参考- python基础 1 -> python版本选择+第一个小程序

    题外话: Python版本:最新的3.6 安装注意点:勾选添加路径后自定义安装到硬盘的一级目录,例如本人的安装路径: F:\Python 原因:可以自动添加python环境变量,自动关联.py文件,其 ...

  4. windows使用放大镜快速放大屏幕局部

    Win10系统自带放大镜有时真的是比较难使用的,但是如果你对他的快捷键有所了解之后就会感觉它其实也没有那么难,用户可以在使用完之后直接按快捷键将其关闭,一起看看吧. Win10系统放大镜快速关闭快捷键 ...

  5. Push failed: Failed with error: Could not read from remote repository. IDEA 解决方法

  6. AKKA文档2.3(java版)—什么是角色

    原文:http://doc.akka.io/docs/akka/2.3.5/general/actors.html译者:Vitas 什么是角色? 前面角色系统一节介绍了一群角色如何形成一个层次结构,并 ...

  7. linux批量删除

    find . -name "*.bcp" | xargs rm -rf "*.bcp"

  8. 上课笔记:awk

    awk [单独的编程语言解释器]1.awk介绍 全称:Aho Weinberger Kernaighan 三个人的首字母缩写:  1970年第一次出现在Unix机器上,后来在开源领域使用它: 所以,我 ...

  9. hdfs基本文件操作

    编程实现下列要求: 1.创建一个自己姓名首字母的文件夹 2.在文件夹下创建一个hdfstext1.txt文件,项文件内输入“班级学号姓名HDFS课堂测试”的文字内容: 3.在文件夹下在创建一个好的fs ...

  10. 多模块环境下修改包名Rename directory与Rename package

    选中包名->右键Refactor->Rename,如果会弹出的警告框让选择Rename directory和Rename package时,若选择Rename directory,则是只修 ...