题目链接:http://codeforces.com/problemset/status

题目大意为有n个市民,每个市民有ai点数财富,以下有q次操作,操作类型为两类,1类:把第p个市民的财富改为x,2类:把所有财富小于x的市民的财富变为x。

题目数据量较大,强行n^2暴力模拟会超时,分析题意尝试缩小时间复杂度。观察到在对第i个市民进行最后一次1类操作之后,将不会影响此后的所有第2类操作,也就是说如果此后的第2类操作的x > ai的财富,将可以修改第i个市民的财富,因此每个市民的最终财富 = 对该市民的最后一次第1类操作和此后的第2类操作 两者之间的最大值即可。用ops[]数组记录第1类操作的顺序,opsmoney记录第2类操作的财富,q次操作从后往前遍历,做opsmoney[ i ] = max (opsmoney[ i ] ,opsmoney[ i +1 ])的更新,记录第i次操作之后 x 的最大值,方便后续比较,具体看代码。

AC代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
long long int ops[200005];
long long int opsmoney[200005];
long long int money[200005];
int main()
{
int n;
cin>>n;
for(int i = 0;i<n;i++){
cin>>money[i];
}
long long int q;
cin>>q;
memset(opsmoney,0,sizeof(opsmoney));
memset(ops,0,sizeof(ops));
for(int i = 0;i<q;i++){
int flag;
cin>>flag;
if(flag == 1){
long long int p;
long long int x;
cin>>p;
cin>>x;
ops[p-1] = i;
money[p-1] = x;
}
if(flag == 2){
long long int x;
cin>>x;
opsmoney[i] = x;
}
}
for(int i = q-1;i>=0;i--){
opsmoney[i] = max(opsmoney[i],opsmoney[i+1]);
}
for(int i = 0;i<n;i++){
money[i] = max(money[i],opsmoney[ops[i]]);
}
for(int i = 0;i<n;i++){
if(!i){
cout<<money[i];
}
else{
cout<<" "<<money[i];
}
}
return 0;
}

codeforces 1198B - Welfare State的更多相关文章

  1. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  2. Codeforces - 1199D - Welfare State - 单调栈 / 线段树

    https://codeforc.es/contest/1199/problem/D 其实后来想了一下貌似是个线段树的傻逼题. 单调栈是这样思考的,每次单点修改打上一个最终修改的时间戳.每次全体修改就 ...

  3. Codeforces Round #576 (Div. 2) D. Welfare State

    http://codeforces.com/contest/1199/problem/D Examples input1 output1 input2 output2 Note In the firs ...

  4. D. Welfare State

    There is a country with 

  5. B. Welfare State(RMQ问题的逆向考虑)

    \(对于操作1,我们只关心最后一次操作.\) \(对于操作2,我们只关心值最大的一次操作.\) \(也就是说,我们记录每个居民最后一次被修改的位置\) \(然后它的最终答案就是从这个位置起,max(操 ...

  6. 【CodeForces】CodeForcesRound576 Div1 解题报告

    点此进入比赛 \(A\):MP3(点此看题面) 大致题意: 让你选择一个值域区间\([L,R]\),使得序列中满足\(L\le a_i\le R\)的数的种类数不超过\(2^{\lfloor\frac ...

  7. Codeforces Round #576 (Div. 1)

    Preface 闲来无事打打CF,就近找了场Div1打打 这场感觉偏简单,比赛时艹穿的人都不少,也没有3000+的题 两三个小时就搞完了吧(F用随机水过去了) A. MP3 题意不好理解,没用翻译看了 ...

  8. Codeforces Round #576 (Div. 2) 题解

    比赛链接:https://codeforc.es/contest/1199 A. City Day 题意:给出一个数列,和俩个整数\(x,y\),要求找到序号最靠前的数字\(d\),使得\(d\)满足 ...

  9. CSU-ACM2020寒假集训比赛2

    A - Messenger Simulator CodeForces - 1288E 两种解法,我选择了第二种 mn很好求,联系过就是1,没联系过就是初始位置 第一种:统计同一个人两次联系之间的出现的 ...

随机推荐

  1. Tomcat中相关配置详解

    tomcat的相关配置 server.xml <Server port="8005" shutdown="SHUTDOWN"> <!-- 属性 ...

  2. Ubuntu 16 服务器配置PHP+MySQL+Apache环境

    一.获取软件包资源并进行资源更新 apt是Ubuntu上默认的软件包管理器,使用它可以很容易进行各种软件安装,而且会自动帮你安装可能需要的依赖关系. 另一个强大的软件管理工具是 dpkg,可以用于安装 ...

  3. 885-螺旋矩阵 - III

    885-螺旋矩阵 - III 在 R 行 C 列的矩阵上,我们从 (r0, c0) 面朝东面开始 这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列. 现在,我们以顺时针按螺旋状行走 ...

  4. AcWing 1052. 设计密码

    //f[i][j]表示前 i 个字符与字符串匹配长度为 j 时的方案数 #include <cstring> #include <iostream> #include < ...

  5. 一个简单的java web项目 仅实现添加

    连接数据库已经进行判断 要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分 ...

  6. 关于 RMAN 控制文件自动备份路径中指定的 %F 说明

    默认情况下,RMAN备份的属性配置一共 14 行( show all; )来自博客园AskScuti CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVIC ...

  7. Docker最全教程——从理论到实战(十)

    终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...

  8. vue自定义日期选择,类似美团日期选择,日历控件,vue日历区间选择

    一个日历的控件,基于vue的,可以日历区间选择,可用于酒店日历区间筛选,动手能力强,可以修改成小程序版本的,先上效果图 里面的颜色样式都是可以修改的 选择范围效果 话不多说,直接上干货,代码可以直接复 ...

  9. spring security和java web token整合

    思路: spring security 1.用户输入用户名密码. 2.验证:从库中(可以是内存.数据库等)查询该用户的密码.角色,验证用户名和密码是否正确.如果正确,则将填充Authenticatio ...

  10. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) B Box

    #include<bits/stdc++.h> using namespace std; ]; ]; int main() { int total; cin>>total; w ...