uestc summer training #2
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的更多相关文章
- 2015 UESTC Winter Training #10【Northeastern Europe 2009】
2015 UESTC Winter Training #10 Northeastern Europe 2009 最近集训都不在状态啊,嘛,上午一直在练车,比赛时也是刚吃过午饭,状态不好也难免,下次比赛 ...
- 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 ...
- 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 据 ...
- 2015 UESTC Winter Training #6【Regionals 2010 >> North America - Rocky Mountain】
2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...
- 2015 UESTC Winter Training #4【Regionals 2008 :: Asia - Tehran】
2015 UESTC Winter Training #4 Regionals 2008 :: Asia - Tehran 比赛开始时电脑死活也连不上WIFI,导致花了近1个小时才解决_(:зゝ∠)_ ...
- uestc summer training #9 牛客第三场 BFS计数
G.coloring tree BFS计数 题目:给你n(<=5000)个节点的一颗树 你有K(<=5000)种颜色 你可以给每一个节点染一种颜色 总共有Kn种染色方法 在一种染色方法中 ...
- 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 把题目的矩阵看成无向图的邻接矩阵 这 ...
- uestc summer training #1
A 一个很好想的dp ll dp[maxn][]; int main() { scanf("%d%d",&n,&k); memset(dp,,sizeof(dp)) ...
- uestc summer training #3 线段树优化建边
线段树建边 struct E { int value, modvalue; } a[MAXN << ]; pair<int, int> b[MAXN]; ], r[MAXN & ...
随机推荐
- Spring MVC整合fastjson、EasyUI乱码问题
一.框架版本 Spring MVC:spring-webmvc-4.0.0.RELEASE fastjson:fastjson-1.2.45 EasyUI:1.5 二.乱码现象 Controller调 ...
- python中接受上一条命令执行的结果----subprocess.check_output()
subprocess.call 是不能作为赋值的,需要用到 subprocess.check_output 函数,而且如果要引用赋值就必须使用subprocess.call(['echo',line] ...
- jdk1.8-ArrayList源码分析
一:idea可以自动生成UML类图,ctrl+alt+u ArrayList类图 我没们看下类的继承关系 ) { ) { ) { )) )) newCapacity = minCapacity) ne ...
- golang可见性规则(公有与私有,访问权限)
Go语言没有像其它语言一样有public.protected.private等访问控制修饰符,它是通过字母大小写来控制可见性的,如果定义的常量.变量.类型.接口.结构.函数等的名称是大写字母开头 ...
- 刷新页面后,让控制台的js代码继续执行
在各种限时,秒杀活动中,有个自动循环的点击的工具是很重要的. 为了方便起见,我们把Js代码放在浏览器的控制台执行,但是刷新页面后,js代码就清空了,也就无法执行. 可以用js代码实现一个不受页面刷新影 ...
- 【AMAD】django-model-utils -- Django model使用的mixin和utils
动机 简介 个人评分 动机 为django model系统提供一些可重用的mixin和utils. 简介 django-model-utils1为Django Model提供了下嘛几种分类的utils ...
- 防火墙之iptables
Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务 ...
- 如何使用JavaScript实现前端导入和导出excel文件
一.SpreadJS 简介 SpreadJS 是一款基于 HTML5 的纯 JavaScript 电子表格和网格功能控件,以“高速低耗.纯前端.零依赖”为产品特色,可嵌入任何操作系统,同时满足 .NE ...
- SSM框架中表单提交出现400错误
在jsp页面中: 在controller里传递参数: 由于参数sonTime时String类型,要把String类型的时间转换成Date类型的时间,在过程无法自动完成转换故出现400错误,可以使用@D ...
- 基于 Vue.js 2.0 酷炫自适应背景视频登录页面的设计『转』
本文讲述如何实现拥有酷炫背景视频的登录页面,浏览器窗口随意拉伸,背景视频及前景登录组件均能完美适配,背景视频可始终铺满窗口,前景组件始终居中,视频的内容始终得到最大限度的保留,可以得到最好的视觉效果. ...