您的位置:首页 > 其它

Codeforces1198B 思维+离线

2019-08-18 15:30 65 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40534166/article/details/99705047

Codeforces1198B 思维+离线

题目链接:https://codeforces.com/problemset/problem/1198/B

题意:题意:给定n个数字,q次操作,操作分为两种(且称之为1类操作和2类操作),1 p x为把a[p]改为x, 2 x为把数组中所有小于x的数字全部改为x.

方法:对询问进行离线操作,即将询问数组先存起来,再从后向前依次处理每次询问,如果是1类询问且为第一次遇到的点则将其更新为max(此次的x值,之后的2类操作的x的最大值),并对其进行标记,之后不再访问,如果是2类询问,则将maxnum(最大的2类x值)进行更新maxnum=max(maxnum,x[i])(小的对大的无影响)。最后对原数据数组a[]进行遍历,对未访问的点进行更新,将其赋值为max(maxnum,a[i])。

AC代码:

#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<map>
#include <fstream>
using namespace std;
#define scan(n) scanf("%d",&n)
#define ll long long

int v[200005];
int a[200005];
int b[200005];
int p[200005];
int x[200005];

int main()
{
int n,i,q;
scan(n);
for(i=1;i<=n;i++)
scan(a[i]);
scan(q);
for(i=1;i<=q;i++)
{
scan(b[i]);
if(b[i]==1)
scanf("%d %d",&p[i],&x[i]);
else
scan(x[i]);
}
int maxnum=-1;
memset(v,0,sizeof(v));
for(i=q;i>0;i--)
{
if(b[i]==1&&v[p[i]]==0)
{
v[p[i]]=1;
a[p[i]]=max(x[i],maxnum);
}
else if(b[i]==2)
{
maxnum=max(maxnum,x[i]);
}
}
for(i=1;i<=n;i++)
if(v[i]==0)
a[i]=max(maxnum,a[i]);
printf("%d",a[1]);
for(i=2;i<=n;i++)
printf(" %d",a[i]);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: