NOI.ac模拟赛20181021 ball sequence color
T1 ball
可以发现每次推动球时,是将每个球的位置 −1-1−1 ,然后把最左边的球放到 P−1P-1P−1 处。
记个 −1-1−1 次数,再用set维护就好了。
#include <bits/stdc++.h>
using namespace std;
int n, q, p, now;
set<int>ball;
inline void read(int &num)
{
char ch; num = 0; int flag = 1;
while((ch=getchar()) < '0' || ch > '9')if(ch == '-') flag = -flag;
while(ch >= '0' && ch <= '9') num = num*10 + ch-'0', ch = getchar();
num *= flag;
}
int main()
{
int x, y;
read(n), read(q), read(p);
for(int i = 1; i <= n; i++)
read(x), ball.insert(x);
for(int i = 1; i <= q; i++)
{
read(x);
if(x == 1)
read(y), ball.insert(y+now);
else
ball.erase(ball.begin()), ball.insert(p+(now++));
}
set<int>::iterator it;
bool flag = 0;
for(it = ball.begin(); it != ball.end(); it++)
{
if(!flag) flag = 1;
else putchar(' ');
printf("%d", (*it)-now);
}
}
T2 sequence
f(i,a,b,c)f(i, a, b, c)f(i,a,b,c) 表示考虑前 iii 个,换进了 aaa 个,换出了 bbb 个,当前的位置是 c(0/1/2)c(0/1/2)c(0/1/2) 的答案。其中 000 是在选择的区间之前, 111 是在选择的区间之中, 222 是之后。每次 O(1)O(1)O(1) 讨论一下当前位置的数的情况。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 100001;
const int MAXK = 11;
int n, k, v[MAXN];
LL f[2][MAXK][MAXK][3];
short pre[MAXN][MAXK][MAXK][3];
inline void Max(int now, int i, int a, int b, int c, int lasta, int lastb, int val, int flag)
{
for(int lastc = max(c-1, 0); lastc <= c; lastc++)
if(f[now^1][lasta][lastb][lastc] + val > f[now][a][b][c])
f[now][a][b][c] = f[now^1][lasta][lastb][lastc] + val, pre[i][a][b][c] = flag * 10 + lastc;
}
int in[MAXN], cur_in;
int out[MAXN], cur_out;
int d[2], cur_d;
inline void Getans(int i, int a, int b, int c)
{
if(!i) return;
int A = a, B = b, C = pre[i][a][b][c] % 10, flag = pre[i][a][b][c] / 10;
if(flag == 2) A--, in[++cur_in] = i;
if(flag == 3) B--, out[++cur_out] = i;
if(i == n && c == 1) d[cur_d++] = i;
if(c == 2 && C == 1) d[cur_d++] = i-1;
if(c == 1 && C == 0) d[cur_d++] = i;
Getans(i-1, A, B, C);
}
int main ()
{
memset(pre, -1, sizeof pre);
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++) scanf("%d", &v[i]);
int now = 0;
memset(f[now], -0x3f, sizeof f[now]);
f[now][0][0][0] = 0;
for(int i = 1; i <= n; i++)
{
now ^= 1;
memset(f[now], -0x3f, sizeof f[now]);
for(int a = 0; a <= k; a++)
for(int b = 0; b <= k; b++)
{
Max(now, i, a, b, 0, a, b, 0, 1); //1
if(a)Max(now, i, a, b, 0, a-1, b, v[i], 2); //2
Max(now, i, a, b, 1, a, b, v[i], 1); //1
if(b)Max(now, i, a, b, 1, a, b-1, 0, 3); //3
Max(now, i, a, b, 2, a, b, 0, 1); //1
if(a)Max(now, i, a, b, 2, a-1, b, v[i], 2); //2
}
}
int X = -1, Y;
for(int x = 0; x <= k; x++)
for(int y = 1; y < 3; y++)
if(X == -1 || f[now][X][X][Y] < f[now][x][x][y])
X = x, Y = y;
Getans(n, X, X, Y);
printf("%lld %d\n", f[now][X][X][Y], X);
for(int i = 1; i <= cur_in; i++)
printf("%d %d\n", in[i], out[i]);
printf("%d %d\n", min(d[0], d[1]), max(d[0], d[1]));
}
T3 color
方法一
考虑一个叶子节点到根的路径上的点的颜色,那么一定是前面一段的颜色与叶子节点的颜色相同,然后剩下一段的颜色均为灰色。那么每次修改就先减去原来路径上的颜色然后再加上修改后路径上的颜色,每个颜色的个数可以直接二分求出两种颜色的相交处即可。
一个节点为黑色或白色当且仅当以它为根的子树中的所有叶子节点颜色相同。那么可以求出一个DFS序,然后直接用线段树来维护,叶子节点颜色。
总复杂度:O(n∗logn2)O(n*logn^2)O(n∗logn2)。
方法二
求两种颜色的相交处,可以是求最近的一个灰色的节点,那么一定是这个叶子节点与另一种颜色节点的深度最深的LCA。这个必然是和它在DFS序最相近的两个点,可以用set维护每种颜色的叶子节点的DFS序值,直接查询然后倍增求LCA即可。
总复杂度:O(n∗logn)O(n*logn)O(n∗logn)。
方法三、四(水过)
1.缩链,把只有一个son的father缩成一个点暴力处理,水过
2.直接暴力,每次向上跑,修改颜色&答案,如果修改过后的颜色与原来颜色一样就停止
PS:很水(miao)的数据,卡大暴力去了
#include <bits/stdc++.h>
using namespace std;
#define LL long long
namespace IO
{
template<class T>inline void read(T &num)
{
char ch; int flag = 1;
while(!isdigit(ch=getchar()))if(ch=='-')flag=-flag;
for(num=ch-'0';isdigit(ch=getchar());num=num*10+ch-'0');
num *= flag;
}
}
using namespace IO;
const int MAXN = 100005;
struct node
{
int u, v, wt;
friend bool operator <(node x, node y)
{ return x.wt < y.wt; }
}e[MAXN];
int n, c[MAXN], sz[MAXN], fa[MAXN];
LL total, sum[MAXN];
inline int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
bool check(int mid)
{
for(int i = 1; i <= n; i++) fa[i] = i, sum[i] = sz[i] = 0;
for(int i = 1; i < mid; i++) fa[find(e[i].v)] = find(e[i].u);
for(int i = 1; i <= n; i++) sum[find(i)] += c[i], sz[find(i)]++;
for(int i = 1; i <= n; i++) if(fa[i] == i && total-sum[i] < sz[i]) return 0;
return 1;
}
int main ()
{
//freopen("shuju.in", "r", stdin);
read(n);
for(int i = 1; i < n; i++)
read(e[i].u), read(e[i].v), read(e[i].wt);
sort(e + 1, e + n);
for(int i = 1; i <= n; i++)
read(c[i]), total += c[i];
int l = 1, r = n-1, mid;
while(l < r)
{
mid = (l + r + 1) >> 1;
if(check(mid)) l = mid;
else r = mid-1;
}
printf("%d\n", e[l].wt);
}
NOI.ac模拟赛20181021 ball sequence color的更多相关文章
- NOI.ac 模拟赛20181103 排队 翘课 运气大战
题解 排队 20% 1≤n≤20,1≤x,hi≤201\le n\le 20, 1\le x,h_i\le 201≤n≤20,1≤x,hi≤20 随便暴力 50% 1≤n≤2000,1≤x,hi≤1 ...
- [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)
(2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...
- NOI模拟赛(3.15) sequence(序列)
Description 小A有N个正整数,紧接着,他打算依次在黑板上写下这N个数.对于每一个数,他可以决定将这个数写在当前数列的最左边或最右边.现在他想知道,他写下的数列的可能的最长严格上升子序列(可 ...
- [NOIP2019模拟赛]序列(Sequence)
题目大意 有一个序列$A_i$ • 对于 i ≥ 1,如果有$ A_i > 0.A_{i+1}> 0$ 且存在 $A_{i+2}$,那么法老可以令$ Ai$ 和 $A_{i+1}$ 减一, ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- noi.acNOIP模拟赛5-count
题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...
- 【XJOI】【NOI考前模拟赛7】
DP+卡常数+高精度/ 计算几何+二分+判区间交/ 凸包 首先感谢徐老师的慷慨,让蒟蒻有幸膜拜了学军的神题.祝NOI2015圆满成功 同时膜拜碾压了蒟蒻的众神QAQ 填填填 我的DP比较逗比……( ...
- 2018/3/13 noiρ[rəʊ]模拟赛 125分
T1 60分暴力,水分也不会水,打表也不会打,正解是不可能写正解的,这辈子都写不出来正解的,虽然是zz题但是也拿不到分这样子. 正解:(啥?正解是sb组合数?这都他娘的想不到,真鸡儿丢人我自杀吧.) ...
- Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化
其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2优化能过- CODE O(n3)O(n^3)O(n3) 先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2 ...
随机推荐
- Django REST Framework批量更新rest_framework_extensions
Django REST framework 是一套基于Django框架编写RESTful风格API的组件. 其中mixins配合viewsets能极其方便简化对数据的增删改查, 但本身并没有对数据的批 ...
- day42——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)
day42 外键的限制和解决方法 可以添加外键关联的那个字段可以是 被唯一(unique)约束的字段 或者 主键 限制:+ 由于外键的使用,致使多个表之间产生了联系,当我们对这些表进行更新或删除操作的 ...
- quartz2.3.0(五)制定错过执行任务的misfire策略,用pause,resume模拟job暂停执行和继续执行
感谢兄台: <quartz-misfire 错失.补偿执行> misfire定义 misfire:被错过的执行任务策略 misfire重现——CronTrigger job任务类: pac ...
- STL之 stack的基础应用
头文件 #include<stack> stack<int> s; stack<char> s;//定义一个名字为s 的存int char的stack 基本指令 ...
- c#Queue队列的使用
消息队列 队列(System.Collections.Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时, ...
- IdentityServer4实现OAuth2.0四种模式之授权码模式
接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ...
- spring boot打包,依赖、配置文件分离,拷贝启动脚本
一.最终打包的目录结构 二.项目结构 三.开始 1.最终打包的目录,可根据自己需要修改. <properties> <mzservice.path>${project.buil ...
- Web应用和Web框架
一.Web应用 二.Web框架 三.wsgiref模块 一.Web应用 1.什么是Web应用? Web应用程序是一种可以通过Web访问的应用程序,特点是用户很容易访问,只需要有浏览器即可,不需要安装其 ...
- iOS加密之AES
心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...
- 如何在backoffice里创建Hybris image container以及分配给product
登录backoffice,在media container视图点击新建按钮: Catalog选择Product Catalog: 在Properties界面,可以选择media实例放入该contain ...