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 ...
随机推荐
- VC 复制移动删除重命名文件文件
说明: 1.以下封装了4个函数_CopyFile,_DeleteFile,_MoveFile,_ReNameFile 2.每个函数都先拷贝了原来的路径,保证了路径是以2个\0\0结尾.(如果不以2个\ ...
- jquery学习笔记(二):DOM元素操作
内容来自[汇智网]jquery学习课程 2.1 元素属性操作 1.获取元素的属性 语法:attr(name) 参数name表示属性的名称 2.设置元素的属性 单个属性设置语法:attr(key,val ...
- Android NDK应用原理
转:http://shihongzhi.com/ndk/ 那么首先看一下Android的系统框架: 最底层是Linux Kernel,然后上面是封装的库及Android runtime.再上面是App ...
- (20)Oracle函数
substr 截取字段 substr(字符串,截取开始位置,截取长度) substr(str,n,m) 第二,三参数可以省略, 第二个参数为负数时表示从倒数第n位开始向后截取m个 round(str, ...
- JS 常用的两个客户端输出方法
document.write(str) 描述:在网页的<body>标记,输出str的内容. document意思“文档”,就是整个网页了. document是一个文档对象,代表 ...
- 16.ajax_case09
import requests import json import re from selenium import webdriver from selenium.webdriver.common. ...
- 【CF900D】Unusual Sequences
题目 智力下降严重 显然要反演了呀 首先必须满足\(x|y\),否则答案是\(0\) 我们枚举这个数列的\(gcd\)是\(d\)或者\(d\)的倍数 于是答案就是 \[\sum_{x|d}[d|y] ...
- Hamilton回路 旅行商TSP问题 /// dp oj1964
题目大意: 给出一个n个顶点的无向图,请寻找一条从顶点0出发,遍历其余顶点一次且仅一次.最后回到顶点0的回路——即Hamilton回路. Input 多测试用例.每个测试用例: 第一行,两个正整数 n ...
- SpringMVC的Hello World
本次使用Maven和Spring IO platform创建SpringMVC的Hello World. 一.Maven的Pom文件内容如下: <project xmlns="http ...
- 2 _ 基本框架 _ 检测VMX环境
VT 是先开为大,谁先开谁上层,谁上层 谁权限大. 1 判断是否支持 VMX intel 白皮书 第3卷 传入 参数eax =1, 返回值 ecx 的第5位 = 1 则 surpported VMX. ...