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 ...
随机推荐
- JSONObject 序列化后,对象数据为引用地址
最近在json序列化的时候,遇到了个坑,记录如下: public static void main(String[] args) { JSONObject json = new JSONObject( ...
- Java 基础数据类型
Java 提供的基础数据类型(也称内置数据类型)包含:整数类型.浮点类型.字符类型.布尔类型. 整数类型 整数类型变量用来表示整数的数据类型.整数类型又分为字节型(byte).短整型(short).整 ...
- 微信sdk 隐藏右上角菜单项
wx.ready(function () { // 8.3 批量隐藏菜单项 wx.hideMenuItems({ menuList: [ 'menuItem:share:qq', //分享到QQ 'm ...
- 【题解】洛谷 P1061 Jam的计数法
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int ...
- Maven父子工程配置文件详解
项目骨架搭建成功之后. 因为父工程管理子工程.子工程相当于继承于子工程,所以子工程可以调用父工程里面的东西.那么就可以将jar包对应的配置文件书写到父工程的pom.xml文件中,注意:父工程的打包方式 ...
- 16.ajax_case06
# 抓取华尔街见闻实时快讯 # https://wallstreetcn.com/live/global?from=navbar import requests import json header ...
- 7_3.springboot2.x启动配置原理_3.事件监听机制
事件监听机制配置在META-INF/spring.factories ApplicationContextInitializer SpringApplicationRunListenerioc容器中的 ...
- 6_4.springboot2.x数据整合springData介绍
介绍 Spring Data 项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括非关系数据库.Map-Reduce 框架.云数据服务等等:另外也包含对关系数据库的访问支持. spr ...
- 4_8.springboot2.x嵌入式servlet容器启动原理解析
问题描述: 什么时候创建嵌入式的Servlet容器工厂? 什么时候获取嵌入式的Servlet容器并启动Tomcat? *获取嵌入式的Servlet容器工厂: 1).SpringBoot应用启动运行ru ...
- 【LGP5437】【XR-2】约定
题目 显然每一条边出现在生成树中的方案数是相等的 根据矩阵树定理,\(n\)个节点的完全图生成树个数是\(n^{n-2}\)种,完全图共有\(\frac{n(n-1)}{2}\)条边,一棵生成树共\( ...