HZOI20190803 B题
题目:https://www.cnblogs.com/Juve/articles/11295333.html
话说这题方法挺多
40分:暴力
65:莫队,你会T得飞起
我考场上没打出带修莫队,没有修改的·跑普通莫队,有修改的,跑暴力(反正都是离线)
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define MAXN 300005
- //#define int long long
- #define re register
- using namespace std;
- int n,m,a[MAXN],rk[MAXN];
- bool appear[MAXN],flag=0;
- int num=0,sum=0,blo,block[MAXN],l=1,r=0;
- struct node{
- int l,r,id,t,val,opt;
- friend bool operator < (node a,node b){
- return block[a.l]==block[b.l]?a.r<b.r:a.l<b.l;
- }
- }ask[MAXN];
- struct node1{
- int pos,val,t,opt;
- }change[MAXN];
- struct node2{
- int l,r,val,opt,pos;
- }vio[MAXN];
- int cnt[MAXN],ans[MAXN];
- void add(int x){
- cnt[x]++;
- }
- void del(int x){
- cnt[x]--;
- }
- signed main(){
- scanf("%d%d",&n,&m);
- blo=sqrt(n);
- for(re int i=1;i<=n;i++){
- scanf("%d",&a[i]);
- block[i]=i/blo+1;
- if(appear[a[i]]){
- flag=1;
- }
- appear[a[i]]=1;
- }
- if(!flag){
- for(re int i=1;i<=n;i++)
- rk[a[i]]=i;
- for(re int i=1,opt;i<=m;i++){
- scanf("%d",&opt);
- if(opt==1){
- re int l,r,col;
- scanf("%d%d%d",&l,&r,&col);
- if(l<=rk[col]&&rk[col]<=r)
- puts("1");
- else puts("0");
- }else{
- re int x;
- scanf("%d",&x);
- rk[a[x]]=x+1;
- rk[a[x+1]]=x;
- swap(a[x],a[x+1]);
- }
- }
- return 0;
- }
- for(re int i=1,opt;i<=m;i++){
- scanf("%d",&opt);
- if(opt==1){
- ask[++num].opt=opt;
- scanf("%d%d%d",&ask[num].l,&ask[num].r,&ask[num].val);
- ask[num].t=sum;
- ask[num].id=num;
- vio[i].opt=opt;
- vio[i].l=ask[num].l,vio[i].r=ask[num].r,vio[i].val=ask[num].val;
- }else{
- change[++sum].opt=opt;
- re int x;
- scanf("%d",&x);
- change[sum].pos=x,change[sum].val=a[x+1];
- change[++sum].opt=opt;
- change[sum].pos=x+1,change[sum].val=a[x];
- vio[i].opt=opt,vio[i].pos=x;
- }
- }
- if(sum==0){
- sort(ask+1,ask+num+1);
- for(re int i=1;i<=num;i++){
- while(l<ask[i].l){
- cnt[a[l++]]--;
- //del(a[l++]);
- }
- while(l>ask[i].l){
- cnt[a[--l]]++;
- //add(a[--l]);
- }
- while(r<ask[i].r){
- cnt[a[++r]]++;
- //add(a[++r]);
- }
- while(r>ask[i].r){
- cnt[a[r--]]--;
- //del(a[r--]);
- }
- ans[ask[i].id]=cnt[ask[i].val];
- }
- for(re int i=1;i<=num;i++){
- printf("%d\n",ans[i]);
- }
- return 0;
- }
- else{
- for(re int i=1;i<=m;i++){
- if(vio[i].opt==1){
- re int col=vio[i].val,ans=0;
- for(re int j=vio[i].l;j<=vio[i].r;j++){
- if(a[j]==col) ans++;
- }
- printf("%d\n",ans);
- }else{
- swap(a[vio[i].pos],a[vio[i].pos+1]);
- }
- }
- }
- return 0;
- }
100:
vector排序+二分查找
- #include<cstdio>
- #include<vector>
- #include<algorithm>
- #define N 300050
- using namespace std;
- int n,m;
- int a[N];
- vector<int>v[N];
- int main()
- {
- scanf("%d%d",&n,&m);
- int ok1=1,ok2=1;
- for(int i=1;i<=n;++i)
- {
- scanf("%d",&a[i]);
- v[a[i]].push_back(i);
- }
- int opt,l,r,c,x;
- while(m--)
- {
- scanf("%d",&opt);
- if(opt==1)
- {
- scanf("%d%d%d",&l,&r,&c);
- l=lower_bound(v[c].begin(),v[c].end(),l)-v[c].begin();
- r=upper_bound(v[c].begin(),v[c].end(),r)-v[c].begin();
- printf("%d\n",r-l);
- continue;
- }
- scanf("%d",&x);
- l=a[x],r=a[x+1];
- v[l][lower_bound(v[l].begin(),v[l].end(),x)-v[l].begin()]=x+1;
- v[r][lower_bound(v[r].begin(),v[r].end(),x+1)-v[r].begin()]=x;
- swap(a[x],a[x+1]);
- }
- return 0;
- }
或者。。。主席树?
就是查找排名
- #include<bits/stdc++.h>
- using namespace std;
- #define cri const register int
- const int L=1<<20|1;
- char buffer[L],*S,*T;
- #define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
- inline int read(){
- int a=0;char ch=getchar();
- while(ch<'0'||ch>'9') ch=getchar();
- while(ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+ch-'0',ch=getchar();
- return a;
- }
- int a[3000010],rt[3000010],t,now;
- int ls[20000010],rs[20000010],da[20000010],cnt;
- void insert(int &k,cri l,cri r,cri x,cri y){
- if(!k) k=++cnt;
- if(l==r){
- da[k]+=y;
- return;
- }
- int mid=l+r>>1;
- if(x<=mid) insert(ls[k],l,mid,x,y);
- else insert(rs[k],mid+1,r,x,y);
- da[k]=da[ls[k]]+da[rs[k]];
- }
- void query(cri k,cri l,cri r,cri L,cri R){
- if(!k||da[k]<=0) return;
- if(l>=L&&r<=R){
- if(da[k]>0) now+=da[k];
- return;
- }
- int mid=l+r>>1;
- if(L<=mid) query(ls[k],l,mid,L,R);
- if(R>mid) query(rs[k],mid+1,r,L,R);
- }
- int main(){
- // freopen("t.in","r",stdin);
- // freopen("w.out","w",stdout);
- int n,m,x,y,z,k,ans,ma=0;
- scanf("%d%d",&n,&m);t=sqrt(n);
- for(int i=1;i<=n;i++) a[i]=read(),insert(rt[a[i]],1,n,i,1);
- while(m--){
- x=read();ans=0;
- if(x==1){
- y=read(),z=read(),k=read();
- if(y>z) swap(y,z);
- now=0;
- query(rt[k],1,n,y,z);
- printf("%d\n",now);
- }
- else{
- y=read();
- insert(rt[a[y]],1,n,y,-1);
- insert(rt[a[y+1]],1,n,y+1,-1);
- insert(rt[a[y]],1,n,y+1,1);
- insert(rt[a[y+1]],1,n,y,1);
- swap(a[y],a[y+1]);
- }
- }
- return 0;
- }
也可以像我一样,来个平衡树
这里用我的平衡树思路将一下
我们给每个颜色建一个平衡树,将该颜色所在的位置插入平衡树,
修改就暴力del和ins,
查询就是找区间端点的排名,
若我们要询问[L,R]中col的出现次数,那么我们在col的平衡树中查询R+1和L的排名,相减就是答案
好像还要卡常。。。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #define MAXN 1000005
- #define re register
- using namespace std;
- int n,m,a[MAXN],root[MAXN];
- inline int read(){
- int x=0;char ch=getchar();
- while(ch<'0'||ch>'9'){ch=getchar();}
- while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
- return x;
- }
- struct Treap{
- int tot;
- struct node{
- int l,r,data,val,size;
- }tr[MAXN];
- Treap(){tot=1;}
- inline void update(re int p){
- tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
- }
- inline int New(re int val){
- re int x=++tot;
- tr[x].val=val;
- tr[x].data=rand();
- tr[x].size=1;
- return x;
- }
- inline void merge(re int &root,re int a,re int b){
- if(!a||!b){
- root=a+b;
- return ;
- }
- if(tr[a].data<tr[b].data){
- root=a;
- merge(tr[root].r,tr[a].r,b);
- }
- else{
- root=b;
- merge(tr[root].l,a,tr[b].l);
- }
- update(root);
- }
- inline void split(re int x,re int &a,re int &b,re int val){
- if(!x){
- a=b=0;
- return ;
- }
- if(tr[x].val<=val){
- a=x;
- split(tr[x].r,tr[a].r,b,val);
- }
- else{
- b=x;
- split(tr[x].l,a,tr[b].l,val);
- }
- update(x);
- }
- inline int get_rank(re int &root,re int val){
- int x=0,y=0;
- split(root,x,y,val-1);
- int ans=tr[x].size+1;
- merge(root,x,y);
- return ans;
- }
- inline void ins(re int &root,re int val){
- int x=0,y=0;
- split(root,x,y,val);
- merge(x,x,New(val));
- merge(root,x,y);
- }
- inline void del(re int &root,re int val){
- int x=0,y=0,z=0;
- split(root,x,y,val);
- split(x,x,z,val-1);
- merge(z,tr[z].l,tr[z].r);
- merge(x,x,z);
- merge(root,x,y);
- }
- }treap;
- signed main(){
- n=read(),m=read();
- for(re int i=1;i<=n;i++){
- a[i]=read();
- treap.ins(root[a[i]],i);
- }
- for(re int i=1,opt;i<=m;i++){
- opt=read();
- if(opt==1){
- re int l,r,col;
- l=read(),r=read(),col=read();
- printf("%d\n",treap.get_rank(root[col],r+1)-treap.get_rank(root[col],l));
- }else{
- re int pos;
- pos=read();
- if(a[pos]==a[pos+1]) continue;
- treap.del(root[a[pos]],pos);
- treap.del(root[a[pos+1]],pos+1);
- swap(a[pos],a[pos+1]);
- treap.ins(root[a[pos]],pos);
- treap.ins(root[a[pos+1]],pos+1);
- }
- }
- return 0;
- }
HZOI20190803 B题的更多相关文章
- HZOI20190803 A,C题
题目链接:https://www.cnblogs.com/Juve/articles/11295333.html A: 考场上只有70分... 发现几个性质:特殊性质1:在两条链上,看它是fib第几项 ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170105
20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【Java每日一题】20170103
20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- SQL面试笔试经典题(Part 1)
本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...
- 刷LeetCode的正确姿势——第1、125题
最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...
- AWS的SysOps认证考试样题解析
刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...
随机推荐
- 校园商铺-4店铺注册功能模块-6店铺注册之Controller层的实现
1. 从request请求获取获取相关的值 HttpservletRequest request代表的是客户端的请求.当客户端通过http协议访问服务器的时候,http请求头中的所有信息,都封装在这个 ...
- C++访问sqlite3的初体验
Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用.不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqli ...
- 运用shtml类型文件,实现项目页面的分割。
学过动态网页,如asp.php的人知道如何去引用网站头部.底部文件包含.例如在php中有一个方法:include();这个方法能在当前文档中引入外部文件,从而方便网站的开发和维护,然而html静态文件 ...
- FastJson使用方法
FastJson是阿里的一款开源框架,用来快速实现Java的序列化和反序列化. 官方地址:https://github.com/alibaba/fastjson 使用方法演示: 下载jar包,使用ID ...
- <爬虫>黑板爬虫闯关01
import requests from lxml import etree import time ''' 黑板爬虫闯关 网址:http://www.heibanke.com/lesson/craw ...
- 炮兵阵地 /// 状压DP oj26314
题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...
- 使用Flume+Kafka+SparkStreaming进行实时日志分析
每个公司想要进行数据分析或数据挖掘,收集日志.ETL都是第一步的,今天就讲一下如何实时地(准实时,每分钟分析一次)收集日志,处理日志,把处理后的记录存入Hive中,并附上完整实战代码 1. 整体架构 ...
- 2019-8-30-PowerShell-通过-WMI-获取系统安装的驱动
title author date CreateTime categories PowerShell 通过 WMI 获取系统安装的驱动 lindexi 2019-08-30 08:58:39 +080 ...
- mysql出现ERROR 1366 (HY000):的解决办法
今天向新建的表中添加内容,出现以下错误: mysql> INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_sho ...
- F. Cowmpany Cowmpensation dp+拉格朗日插值
题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...