noip模拟78
考试过程:先读题,然后觉得开题顺序1 4 2 3。
首先是T1,要是不考虑重复这题很简单,但是考虑重复就比较复杂了,我打完,对拍完差不多用了两个小时,然后就是忘了算内存,结果内存爆了,\(100pts ->30pts\),气炸我了。
然后是T4,我将题意化简为一个式子,\(\sum_{i=l}^{r}max(a_{i-k} -> a_i)\),但是我想了半天不会化简。
然后是T2,T3,我没什么思路,就打了个暴力。
期望得分:\(100+30+30+30=190\)
实际得分:\(30+0+30+30=90\)
考试总结:1.打完题后一定要算内存!!!尤其是花了一些时间想出的正解,不然时间就白费了。
2.打完题后可以想一些时间和空间的优化。
T1 F
思路:因为要让所有数异或出来的值相等,很容易想到求出交集,那么这道题的解题步骤分为两步:
1.求出所有数异或的交集
2.判断里面的数字是否合法
我们先从简单的问题入手,假设里面不存在相同的数字,那么只需要\(n^2\)扫一遍统计答案即可。
现在考虑如果有重复出现的数字,造成的影响。主要有三个方面:
1.类似于 \(A: 1,1,3\),\(B: 6,4,7\),那么\(1 xor 4=5,3xor7=5\),但是只有一个\(4\),也就是出现了一对多的情况
2.类似于\(A:1,2\),\(B: 2,2\) ,其中\(1xor2\)和\(2xor2\)都出现了两遍,但是却不是交集。
3..类似于\(A:1,1\),\(B: 2,2\),A数列和B数列出现了相同的数字,且可能合法的情况
首先解决问题1:我们对于一个\(i\),利用一个\(set\)记录用当前\(A_i\)可以组成的值,如果出现过了就直接\(continue\)
那么其实解决了问题1,剩下两个问题就都解决了,证明是显然的。
最后注意,一定要算好内存!!!!
代码如下:
AC_code
#include<bits/stdc++.h>
#define re register int
#define ii inline int
#define iv inline void
using namespace std;
const int N=2010;
struct node
{
int val,sum;
}cun[N*N];
unordered_map<int,int> mp;
priority_queue<int,vector<int>,greater<int> > Q;
int n,cnt,ans,timi;
int a[N],b[N],hs[N*N];
unordered_set<int> S;
ii read()
{
int x=0;char ch=getchar();bool f=1;
while(ch<'0' or ch>'9')
{
if(ch=='-') f=0;
ch=getchar();
}
while(ch>='0' and ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f?x:(-x);
}
int main()
{
freopen("f.in","r",stdin),freopen("f.out","w",stdout);
n=read();
for(re i=1;i<=n;i++) a[i]=read();
for(re i=1;i<=n;i++) b[i]=read();
int tmp,p;
for(re i=1;i<=n;i++)
{
S.clear();
for(re j=1;j<=n;j++)
{
tmp=a[i]^b[j];
if(S.find(tmp)==S.end())
{
S.insert(tmp);
if(mp.find(tmp)==mp.end())
{
mp[tmp]=++timi;
cun[timi].val=tmp;
cun[timi].sum++;
hs[timi]=i;
}
else
{
int p=mp[tmp];
if(hs[p]!=i)
{
hs[p]=i;
cun[p].sum++;
}
}
}
else continue;
}
}
for(re i=1;i<=timi;i++) if(cun[i].sum>=n) Q.push(cun[i].val);
if(!Q.size()) printf("0\n");
else
{
printf("%d\n",(int)Q.size());
while(!Q.empty())
{
printf("%d\n",Q.top());
Q.pop();
}
}
return 0;
}
T2 S
思路:看到数据范围,猜测应该是\(n^3\)的DP
我们设\(f_{i,j,k,0/1/2}\),表示当前选了\(i\)个\(R\),\(j\)个\(G\),\(k\)个\(Y\),结尾为\(R/G/Y\)的最小步数。
\(g_{0/1/2,k}\)表示原序列第\(k\)个\(R/G/Y\)的位置
那么转移就是\(f_{i+1,j,k,0}=min(f_{i+1,j,k,0,min(f_{i,j,k,1},f_{i,j,k,2})+abs(g_{0,i+1}-(i+j+k+1)})\)
最后记得将\(ans/2\)
代码如下:
AC_code
#include<bits/stdc++.h>
#define re register int
#define ii inline int
#define iv inline void
using namespace std;
const int N=210;
int n,ans;
char s[N*2];
int f[N][N][N][3],g[3][N*2];
ii read()
{
int x=0;char ch=getchar();bool f=1;
while(ch<'0' or ch>'9')
{
if(ch=='-') f=0;
ch=getchar();
}
while(ch>='0' and ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f?x:(-x);
}
int main()
{
freopen("s.in","r",stdin),freopen("s.out","w",stdout);
n=read();
scanf("%s",s+1);
for(re i=1;i<=n;i++)
{
if(s[i]=='R') g[0][++g[0][0]]=i;
else if(s[i]=='G') g[1][++g[1][0]]=i;
else if(s[i]=='Y') g[2][++g[2][0]]=i;
}
if(g[0][0]>n/2 or g[1][0]>n/2 or g[2][0]>n/2) {printf("-1\n");return 0;}
memset(f,0x3f,sizeof(f));
for(re i=0;i<3;i++) f[0][0][0][i]=0;
for(re len=0;len<=n;len++)
{
for(re i=0;i<=min(len,g[0][0]);i++)
{
for(re j=0;j<=g[1][0] and i+j<=len;j++)
{
if(len-i-j>g[2][0] ) continue;
if(i+1<=g[0][0]) f[i+1][j][len-i-j][0]=min(f[i+1][j][len-i-j][0],min(f[i][j][len-i-j][1],f[i][j][len-i-j][2])+abs(len+1-g[0][i+1]));
if(j+1<=g[1][0]) f[i][j+1][len-i-j][1]=min(f[i][j+1][len-i-j][1],min(f[i][j][len-i-j][0],f[i][j][len-i-j][2])+abs(len+1-g[1][j+1]));
if(len-i-j+1<=g[2][0]) f[i][j][len-i-j+1][2]=min(f[i][j][len-i-j+1][2],min(f[i][j][len-i-j][0],f[i][j][len-i-j][1])+abs(len+1-g[2][len-i-j+1]));
}
}
}
for(re i=0;i<3;i++) ans=min(f[g[0][0]][g[1][0]][g[2][0]][0],min(f[g[0][0]][g[1][0]][g[2][0]][1],f[g[0][0]][g[1][0]][g[2][0]][2]))>>1;
printf("%d\n",ans);
return 0;
}
T3 Y
咕咕咕
T4 O
思路:这里有一个结论,对于随机数据,一个单调栈里的元素个数为\(log2(n)\)个。
那么对于这道题,我们对于每个点维护一个单调递减的单调栈,栈里维护两个信息,一个是权值,另一个是时间。
这样我们在开一个\(vector\)数组记录每个时刻要在线段树更新的值,然后计算答案即可。
代码如下:
AC_code
#include<bits/stdc++.h>
#define ll long long
#define re register int
#define ii inline int
#define iv inline void
#define f() cout<<"fuck"<<endl
#define head heeead
#define next neet
using namespace std;
const int N=2e5+10;
struct CUN
{
int id,t,l,r;
}cun[N];
struct node
{
int val,timi;
friend bool operator < (node x,node y){return x.timi<y.timi;}
};
int cnt,sta[N];
vector<pair<int,int> >v[N];
int n,q;
int a[N];
long long ans[N];
ii read()
{
int x=0;char ch=getchar();bool f=1;
while(ch<'0' or ch>'9')
{
if(ch=='-') f=0;
ch=getchar();
}
while(ch>='0' and ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f?x:(-x);
}
inline bool com(CUN x,CUN y) {return x.t<y.t;}
struct Segment_Tree
{
#define lc (rt<<1)
#define rc (rt<<1|1)
#define mid ((l+r)>>1)
ll sum[N<<2];
//iv pp(int rt) {sum[rt]=sum[lc]+sum[rc];}
iv build(int rt,int l,int r)
{
if(l==r)
{
sum[rt]=a[l];
return;
}
build(lc,l,mid),build(rc,mid+1,r);
sum[rt]=sum[lc]+sum[rc];
}
iv change(int rt,int l,int r,int p,int z)
{
if(l==r)
{
sum[rt]=z;
return;
}
if(mid>=p) change(lc,l,mid,p,z);
else change(rc,mid+1,r,p,z);
sum[rt]=sum[lc]+sum[rc];
}
ll query(int rt,int l,int r,int L,int R)
{
if(L<=l and r<=R) return sum[rt];
if(mid>=R) return query(lc,l,mid,L,R);
if(mid<L) return query(rc,mid+1,r,L,R);
return query(lc,l,mid,L,R)+query(rc,mid+1,r,L,R);
}
#undef lc
#undef rc
#undef mid
}T;
signed main()
{
freopen("o.in","r",stdin),freopen("o.out","w",stdout);
n=read(),q=read();
for (re i=1;i<=n;++i)
{
a[i] = read ();
while (cnt && a[i] >= a[sta[cnt]]) cnt -- ;
for (re j=1;j <= cnt; ++ j) v[i - sta[j]].push_back (make_pair(i,a[sta[j]]));
sta[++cnt] = i;
}
T.build (1,1,n);
for(re i=1;i<=q;i++) cun[i]=(CUN){i,read(),read(),read()};
sort(cun+1,cun+q+1,com);
int now=1;
for(re i=0;i<=n;i++)
{
for(re j=0;j<v[i].size();j++) T.change(1,1,n,v[i][j].first,v[i][j].second);
while(cun[now].t==i) {ans[cun[now].id]=T.query(1,1,n,cun[now].l,cun[now].r);++now;}
}
for(re i=1;i<=q;i++) printf("%lld\n",ans[i]);
return 0;
}
noip模拟78的更多相关文章
- Noip模拟78 2021.10.16
这次时间分配还是非常合理的,但可惜的是$T4$没开$\textit{long long}$挂了$20$ 但是$Arbiter$上赏了蒟蒻$20$分,就非常不错~~~ T1 F 直接拿暴力水就可以过,数 ...
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
- NOIP 模拟4 T2
本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- nginx 开启,关闭,重启
2021-08-191. 启动 # 判断配置文件是否正确 cd /usr/local/nginx/sbin ./nginx -t # 启动 cd usr/local/nginx/sbin ./ngin ...
- Java并发知识总结,超详细!
首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...
- python获取邮件信息
在项目的Terminal中注册模块pypiwin32 python -m pip install pypiwin32 import win32com.client outlook = win32com ...
- JDBC基础和使用
内存泄漏意思就是内存越来越少了,因为垃圾太多: 线程泄露就是线程池中线程越来越少,执行过程中异常,没有返回给线程池,线程池中线程越来越少: 一.概念 二.快速入门 三.JDBC各个类详解 1.driv ...
- 硕盟USB3.0 转RJ45千兆网卡 TYPE A USB3.0 TO RJ45
硕盟SM-A44是一款USB3.0转RJ45千兆网口转换器.这是一种高性能和低开销的解决方案.转换USB端口到10 / 100/ 1000M以太网端口可以让您的笔记本,台式机电脑能够通过USB接口连接 ...
- SQLSERVER存储过程基础
SQLSERVER存储过程基础 1.声明变量 DECLARE @F001 SMALLINT, (三元素,声明declare+变量名+类型) @F002 INTEGER, @F003 V ...
- Stage 1 项目需求分析报告
迷你商城后台管理系统-- 需求分析 1. 引言 作为互联网热潮的崛起,消费者们的普遍差异化,实体商城要想在互联网的浪潮中继续发展,就需要制定出针对用户以及消费者的消费习惯以及喜爱品种的消费方案.从而企 ...
- 基于React和GraphQL的黛梦设计与实现
写在前面 这是笔者在中秋无聊写着玩的,假期闲暇之余憋出来的帖子.麻雀虽小,但五脏俱全,涉及到的方方面面还是蛮全的.所以就设计了一个黛梦(demo)------ 打通了GraphQL的接口与前端交互的流 ...
- PHP中操作任意精度大小的GMP扩展学习
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了.其实,这也是一种精度越界之后产生的精度丢失问题.在我们的 PHP 代码中,最大的整数非常大,我们可以通过 PHP_INT ...
- PHP中的IMAP扩展简单入门
对于邮件处理来说,大家比较熟悉的应该是 POP3 . SMTP 这类的协议,而今天我们介绍的 IMAP 其实也是非常常用的一种邮件处理协议.它和 POP3 比较类似,都是以接收处理邮件为主.不过相对于 ...