csp-s模拟99题解
题面:https://www.cnblogs.com/Juve/articles/11791219.html
上来先看T1,发现和之前做过的treap一样,是线段树维护单调栈,然后打了一个小时,然后它挂了
于是看后面的题,然后T2:woc它说的是什么?怎么这么多变量?貌似k=2可以大力分类讨论?
写了半个小时,发现恶心至极,然后puts("-1")就跑了
T3好像有暴力?打了个搜索,一遍过样例,应该有40分了吧,在加上T1暴力就60分了
突然发现T1可以分块直接艹过,果断分块,然后过样例,对拍出锅,
对拍发现了4出错误,然后改完了发现我的分块会被卡成n方?
如果是一个单增的序列,然后他要修改一个特别靠前的位置,我就成n2了,但是这种数据倒也跑的挺快,只是对拍不过
最后半个小时,检查了一下文件名,然后T3本着骗分的原则我按a+b排序从大到小输出
然后改了改T1,发现它过拍了,然后就这样了,一直到考试结束,感觉T1可能会被卡
期望得分:80+10+30=120
实际得分:100+10+100=210!!??
T3不是正解居然A了。。。我rp估计要掉光了,然后T1没有被卡??!!
其实$nlog^2n$和$n\sqrt{n}$复杂度差不多,卡我时间还是挺难的,虽说正解只有一个log,但是常数没有分块优秀
T1:
说是分块其实就是优化的暴力
预处理原序列的前缀答案,前缀最大值,块内最值,
那么每次修改对于前面的答案没有影响,直接接过来,然后在本块中跑暴力,把修改位置所在块的贡献加上,同时记录到当前块的最大值
然后扫后面的块,如果块内最大值比当前最大值小,那么这个块没有用,反之就暴力更新块内的答案
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define re register
using namespace std;
const int MAXN=1e5+;
inline int read(){
re int x=,f=;re char ch=getchar();
while(ch<''||ch>''){
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
}
int n,m,a[MAXN],pos[MAXN],b[MAXN],d[MAXN],maxx=;
int blo,bel[MAXN],l[MAXN],r[MAXN],tot,mx[MAXN],len[MAXN],fmx[MAXN],smx[MAXN],p[MAXN];
signed main(){
freopen("TaoPApp.in","r",stdin);
freopen("TaoPApp.out","w",stdout);
n=read(),m=read();
blo=sqrt(n)+;
tot=n/blo;
if(n%blo) ++tot;
for(re int i=;i<=n;++i){
a[i]=read();
bel[i]=(i-)/blo+;
}
for(re int i=;i<=tot;++i){
l[i]=r[i-]+;
r[i]=i*blo;
}
r[tot]=min(r[tot],n);
for(re int i=;i<=tot;++i){
for(re int j=l[i];j<=r[i];++j){
if(fmx[i]<=a[j]){
fmx[i]=a[j];
p[i]=j;
}
}
for(re int j=l[i];j<=r[i];++j){
if(j!=p[i]&&smx[i]<=a[j]){
smx[i]=a[j];
}
}
}
for(re int i=;i<=n;++i){
mx[i]=max(mx[i-],a[i]);
len[i]=len[i-];
if(maxx<a[i]){
maxx=a[i];
++len[i];
}
}
for(re int i=;i<=m;++i){
pos[i]=read(),b[i]=read();
re int tmp=a[pos[i]];
a[pos[i]]=b[i];
re int c=bel[pos[i]];//当前块
re int res=len[l[c]-];//当前块前的答案
re int zd=mx[l[c]-];//上一个块前的最大值
for(re int j=l[c];j<=r[c];++j){
if(zd<a[j]){
zd=a[j];
++res;
}
}
if(pos[i]!=p[c]){
for(re int j=c+;j<=tot;++j){
if(mx[r[j]]<=zd) continue;
for(re int k=l[j];k<=r[j];++k){
//++tot;
if(zd<a[k]){
zd=a[k];
++res;
}
}
res+=len[n]-len[r[j]];
break;
}
printf("%d\n",res);
a[pos[i]]=tmp;
}else{
re int tmpp=max(zd,smx[c]);
tmpp=max(tmpp,b[i]);
for(re int j=c+;j<=tot;++j){
if(fmx[j]<=tmpp) continue;
for(re int k=l[j];k<=r[j];++k){
if(tmpp<a[k]){
tmpp=a[k];
++res;
}
}
}
printf("%d\n",res);
a[pos[i]]=tmp;
}
}
return ;
}
/*
5 3
1 2 3 4 4
1 5
5 5
2 3
*/
T2:
贪心+模拟
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define int long long
using namespace std;
const int MAXN=5e4+;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int k,c[MAXN],d[MAXN],m[MAXN],p[MAXN],e[MAXN],r[MAXN],E[MAXN],cst,tot=,ans=;
struct node{
int num,cost;
friend bool operator < (node a,node b){
return a.cost<b.cost;
}
};
multiset<node>s1,s2;
signed main(){
freopen("happy.in","r",stdin);
freopen("happy.out","w",stdout);
k=read();
for(int i=;i<=k;++i) c[i]=read(),d[i]=read(),m[i]=read(),p[i]=read();
for(int i=;i<k;++i) e[i]=read(),r[i]=read(),E[i]=read();
cst=c[];
for(int i=;i<=k;++i){
if(p[i]) s1.insert((node){p[i],m[i]+cst});
tot+=p[i];
while(d[i]){
if(s1.empty()){
puts("-1");
return ;
}
node x=*s1.begin();
int num=min(d[i],x.num);
s1.erase(s1.begin());
ans+=x.cost*num;
x.num-=num,tot-=num,d[i]-=num;
if(x.num) s1.insert(x);
}
if(i!=k){
cst=min(cst+r[i],c[i+]);
while(tot>e[i]){
node x=*--s1.end();
int num=min(tot-e[i],x.num);
s1.erase(--s1.end());
tot-=num,x.num-=num;
if(x.num) s1.insert(x);
}
for(multiset<node>::iterator it=s1.begin();it!=s1.end();++it){
s2.insert((node){(*it).num,(*it).cost+E[i]});
}
swap(s1,s2),s2.clear();
}
}
printf("%lld\n",ans);
return ;
}
T3:
按a排序,保留最大的A,然后在剩下的里面两两分组,组内取b较大的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=4e5+;
int n;
struct node{
int a,b,id;
friend bool operator < (node aa,node bb){
return aa.a==bb.a?aa.b>bb.b:aa.a>bb.a;
}
}p[MAXN];
signed main(){
freopen("grandmaster.in","r",stdin);
freopen("grandmaster.out","w",stdout);
scanf("%lld",&n);
for(int i=;i<=*n+;++i){
scanf("%lld%lld",&p[i].a,&p[i].b);
p[i].id=i;
}
sort(p+,p+*n++);
printf("%lld\n",p[].id);
for(int i=;i<=*n+;i+=){
if(p[i].b>p[i+].b){
printf("%lld\n",p[i].id);
}
else printf("%lld\n",p[i+].id);
}
return ;
}
csp-s模拟99题解的更多相关文章
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- 10.8 wtx模拟题题解
填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 【洛谷】xht模拟赛 题解
前言 大家期待已久并没有的题解终于来啦~ 这次的T1和HAOI2016撞题了...深表歉意...表示自己真的不知情... 天下的水题总是水得相似,神题各有各的神法.--<安娜·卡列妮娜> ...
- 10.9 guz模拟题题解
感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...
随机推荐
- Pytest初体验
Pytest安装,导入相关依赖哭 Pip3 install –U pytest U表示升级 Pip3 install pytestsugar pip3 install pytest-rerunfail ...
- 利用dynamic解决匿名对象不能赋值的问题
原文:利用dynamic解决匿名对象不能赋值的问题 关于匿名对象 匿名对象是.Net Framework 3.0提供的新类型,例如: }; 就是一个匿名类,搭配Linq,可以很灵活的在代码中组合数据, ...
- keepAlived主备及双主
nginx用默认配置即可 1.主备配置 1.主keepAlived配置 vrrp_instance VI_1 { state MASTER #主备区分 interface eth0 virtual_r ...
- 四.python注释说明
Python第四节 Python注释 注释说明 注释分为单行注释和多行注释 单行注释以#开头 # 注释示例 > print("上面是一个注释的示例") 多行注释 多行注释可以 ...
- Ubuntu Server 19配置静态IP
这个/etc/netplan下默认有个文件50-cloud-init.yaml,直接修改它就行了 sudo vim /etc/netplan/50-cloud-init.yaml 网口名字ens33可 ...
- leetcood学习笔记-67-二进制求和
题目描述: 第一次提交: class Solution: def addBinary(self, a: str, b: str) -> str: list_a,list_b=[],[] for ...
- Batch - FOR /F Delims 和 Tokens 用法
原文地址: for /f命令之—Delims和Tokens用法&总结 作者:别逗了好么 在For命令语踞饽参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总拮 ...
- CSS——背景及应用
CSS 可以添加背景颜色和背景图片,以及进行图片设置. none : 无背景图(默认的) url : 使用绝对或相对地址指定背景图像 background-image 属性允许指定一个图片展示在背景中 ...
- Perl 运算符
Perl 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号,如: 3+2=5. Perl 语言内置了丰富的运算符,我们来看下常用的几种: 算术运算符 比较运算符 逻辑运算符 赋值运算符 位 ...
- Unity UGUI和特效(含粒子系统和3D Object)之间层级问题
撰写本文时使用Unity的版本为2017.4.10f1(64bit) 1.描述问题 需求:通过UGUI制作一个界面之后,我需要在界面的后面跟前面各添加一个特效. 问题:同一层级UI是最后渲染的,所以U ...