Codeforces Round #210 (Div. 1) A. Levko and Array Recovery

2023-12-28 01:09

本文主要是介绍Codeforces Round #210 (Div. 1) A. Levko and Array Recovery,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A. Levko and Array Recovery

Levko loves array a1, a2, ... , an, consisting of integers, very much. That is why Levko is playing with array a, performing all sorts of operations with it. Each operation Levko performs is of one of two types:

  1. Increase all elements from li to ri by di. In other words, perform assignments aj = aj + di for all j that meet the inequation li ≤ j ≤ ri.
  2. Find the maximum of elements from li to ri. That is, calculate the value .

Sadly, Levko has recently lost his array. Fortunately, Levko has records of all operations he has performed on array a. Help Levko, given the operation records, find at least one suitable array. The results of all operations for the given array must coincide with the record results. Levko clearly remembers that all numbers in his array didn't exceed 109 in their absolute value, so he asks you to find such an array.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 5000) — the size of the array and the number of operations in Levko's records, correspondingly.

Next m lines describe the operations, the i-th line describes the i-th operation. The first integer in the i-th line is integer ti (1 ≤ ti ≤ 2) that describes the operation type. If ti = 1, then it is followed by three integers liri and di (1 ≤ li ≤ ri ≤ n,  - 104 ≤ di ≤ 104) — the description of the operation of the first type. If ti = 2, then it is followed by three integers liri and mi (1 ≤ li ≤ ri ≤ n,  - 5·107 ≤ mi ≤ 5·107) — the description of the operation of the second type.

The operations are given in the order Levko performed them on his array.

Output

In the first line print "YES" (without the quotes), if the solution exists and "NO" (without the quotes) otherwise.

If the solution exists, then on the second line print n integers a1, a2, ... , an (|ai| ≤ 109) — the recovered array.

Examples

input
4 5
1 2 3 1
2 1 2 8
2 3 4 7
1 1 3 3
2 3 4 8
output
YES
4 7 4 7
input
4 5
1 2 3 1
2 1 2 8
2 3 4 7
1 1 3 3
2 3 4 13
NO

题意:有两种操作,第一种操作是将l到r之间的数加d;第二种操作是求l到r间的最大值

现在已知操作的情况,问你原始的序列是怎么样的。是否存在。存在输出YES并输出序列,否则输出NO。

解法:构造。

这类题目可以被归在思维、或者说是构造的题目里。

第一次见到确实无从下手,不知道是什么做法。

那么思路是我们要想办法去满足这个序列的操作2也就是最大值的限制。

因此我们可以先构造一个每个数都是inf(1e9)的序列,然后反向操作。

遇到操作2的则把对应区间里超过d的数改为d

遇到操作1就相应减就可以了。

然后再正向操作一遍看是否正确。

这样看似没有问题了,但还是wa了两次。

是因为题目要求ai绝对值小于1e9,但是存在在加的过程中数字超过1e9的情况。

只需要把大于1e9的改成1e9即可。

#include<bits/stdc++.h>using namespace std;
typedef long long int ll;
const int maxn = 2e4 + 10;
const int oo = 1e9;
int a[maxn], b[maxn];
struct node
{int t, l, r, d;
};
node q[maxn];
int main()
{ios::sync_with_stdio(false);cin.tie(0);int m, n;cin >> n >> m;for(int i = 1; i <= n; i++)a[i] = oo;for(int i = 0; i < m; i++)cin >> q[i].t >> q[i].l >> q[i].r >> q[i].d;for(int i = m - 1; i >= 0; i--){if(q[i].t == 1){for(int j = q[i].l; j <= q[i].r; j++)a[j] -= q[i].d;}else{for(int j = q[i].l; j <= q[i].r; j++)if(a[j] > q[i].d)a[j] = q[i].d;}}int flag = 1;for(int i = 1; i <= n; i++){b[i] = a[i];b[i] = b[i] > oo ? oo : b[i];a[i] = b[i];}for(int i = 0; i < m; i++){if(q[i].t == 1){for(int j = q[i].l; j <= q[i].r; j++)a[j] += q[i].d;}else{int mmax= -oo - 1;for(int j = q[i].l; j <= q[i].r; j++)if(a[j] > mmax)mmax = a[j];if(mmax != q[i].d){flag = 0;break;}}}if(flag){cout << "YES" << endl;for(int i = 1; i <= n; i++)cout << b[i] << ' ';cout << endl;}else cout << "NO" << endl;return 0;
}

 

这篇关于Codeforces Round #210 (Div. 1) A. Levko and Array Recovery的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544746

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>

【uva】11536-Smallest Sub-Array(区间移动问题)

一个区间移动的问题,1A了,感觉没什么好说的。。 13975926 11536 Smallest Sub-Array Accepted C++ 0.809 2014-08-01 11:00:20 #include<cstdio>#include<cstring>#include<iostream>using namespace std;#define INF 1 << 30

leetCode#448. Find All Numbers Disappeared in an Array

Description Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements of [1, n] inclusive that do not appear in this