ZROI3
题解 ZROI3
T1
与《滑动窗口》类似,用单调队列维护
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lor(a,b,c) for(register int a=b;a<=c;++a)
#define ror(a,b,c) for(register int a=c;a>=b;--a)
#define tor(a,b) for(register int a=head[b];a;a=nxt[a])
const int MAX=1e5+5;
int n,m,input,num[MAX];
struct data{
int val,pos;
};
deque <data> line;
inline int read();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
#endif
m=read();
while(input=read(),input!=-1){
num[++n]=input;
}
lor(i,1,n){
while(!line.empty()&&line.front().pos<i-m+1) line.pop_front();
while(!line.empty()&&line.back().val<=num[i]) line.pop_back();
line.push_back((data){num[i],i});
if(i>=m) printf("%d\n",line.front().val);
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<'0'||tmp>'9'){
if(tmp=='-') flag=true;
tmp=getchar();
}
while(tmp>='0'&&tmp<='9'){
sum=(sum<<1)+(sum<<3)+tmp-'0';
tmp=getchar();
}
return flag?-sum:sum;
}
T2
看起来是树链剖分..但其实用不着。由于只有”子树“相关的操作,因此把树打成DFS序后修改连续的区间即可
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define lor(a,b,c) for(register int a=b;a<=c;++a)
#define ror(a,b,c) for(register int a=c;a>=b;--a)
#define tor(a,b) for(register int a=head[b];a;a=nxt[a])
const int MAX=1e5+5;
int n,m; char input[MAX];
int root=1,ecnt,edge[MAX<<1],head[MAX],nxt[MAX<<1];
int hei[MAX],size[MAX],fa[MAX],ind[MAX],rev[MAX];
int val[MAX<<2],sum[MAX<<2],lazy_rev[MAX<<2];
inline int read();
inline void insert(int,int,int);
void dfs(int,int);
void build(int,int,int);
int print(int,int,int,int);
void change(int,int,int,bool);
void pushdown(int,int,int);
void modify_rev(int,int,int,int,int);
int query(int,int,int,int,int);
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
n=read(); m=read(); cin>>input+1;
lor(i,1,n-1){
int u=read(),v=read();
insert(u,v,++ecnt); insert(v,u,++ecnt);
}
dfs(root,root);
build(1,1,n);
lor(i,1,m){
char type; int x; cin>>type; x=read();
switch(type){
case 'S':
modify_rev(1,1,n,rev[x],rev[x]+size[x]-1);
break;
case 'Q':
printf("%d\n",query(1,1,n,rev[x],rev[x]+size[x]-1));
break;
}
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<'0'||tmp>'9'){
if(tmp=='-') flag=true;
tmp=getchar();
}
while(tmp>='0'&&tmp<='9'){
sum=(sum<<1)+(sum<<3)+tmp-'0';
tmp=getchar();
}
return flag?-sum:sum;
}
inline void insert(int from,int to,int id){
nxt[id]=head[from]; head[from]=id; edge[id]=to;
}
void dfs(int u,int f){
hei[u]=hei[f]+1;
fa[u]=f;
ind[++ind[0]]=u;
rev[u]=ind[0];
tor(i,u){
int v=edge[i]; if(v==f) continue;
dfs(v,u);
size[u]+=size[v];
}
size[u]++;
}
void build(int p,int l,int r){
if(l==r) {val[p]=input[ind[l]]-'0'; sum[p]=val[p]==1; return;}
int mid=(l+r)>>1;
build(p<<1,l,mid); build(p<<1|1,mid+1,r);
sum[p]=sum[p<<1]+sum[p<<1|1];
}
int print(int p,int l,int r,int k){
if(l==k&&k==r) return val[p];
pushdown(p,l,r);
int mid=(l+r)>>1;
if(k<=mid) return print(p<<1,l,mid,k);
if(mid+1<=k) return print(p<<1|1,mid+1,r,k);
}
void change(int p,int l,int r,bool rev){
lazy_rev[p]^=rev;
if(rev) sum[p]=(r-l+1)-sum[p];
if(l==r){
if(lazy_rev[p]) val[p]^=1;
lazy_rev[p]=false;
}
}
void pushdown(int p,int l,int r){
if(!lazy_rev[p]) return;
int mid=(l+r)>>1;
change(p<<1,l,mid,lazy_rev[p]);
change(p<<1|1,mid+1,r,lazy_rev[p]);
lazy_rev[p]=false;
}
void modify_rev(int p,int l,int r,int L,int R){
if(L<=l&&r<=R) {change(p,l,r,true); return;}
pushdown(p,l,r);
int mid=(l+r)>>1;
if(L<=mid) modify_rev(p<<1,l,mid,L,R);
if(mid+1<=R) modify_rev(p<<1|1,mid+1,r,L,R);
sum[p]=sum[p<<1]+sum[p<<1|1];
}
int query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R) return sum[p];
pushdown(p,l,r);
int mid=(l+r)>>1,ans=0;
if(L<=mid) ans+=query(p<<1,l,mid,L,R);
if(mid+1<=R) ans+=query(p<<1|1,mid+1,r,L,R);
return ans;
}
T3
在考场上就意识到了和GSS4极其相似,但败在了数学证明上..
结论:任意数字\(x\)经过一次有效的取模之后(模数小于 x),其大小必定小于\(\frac{x}{2}\)
证明:若 \(mod\geq \frac{x}{2}\),则\(x-mod\leq \frac {x}{2}\);若\(mod < \frac{x}{2}\),则\(x <mod \leq \frac{x}{2}\)
这样就可以保证任意节点的操作次数不大于\(log_2 10^9=30\),时间复杂度得到保证。其余细节与GSS4大同小异
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
#define lor(a,b,c) for(register int a=b;a<=c;++a)
const int MAX=1e5+5;
int n,m; ll init[MAX];
ll val_max[MAX<<2],val_sum[MAX<<2];
inline int read();
void build(int,int,int);
void modify_mod(int,int,int,int,int,ll);
void modify_as(int,int,int,int,ll);
ll query(int,int,int,int,int);
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
n=read(); m=read();
lor(i,1,n) scanf("%lld",&init[i]);
build(1,1,n);
lor(i,1,m){
int type,l,r; ll x; type=read();
switch(type){
case 1:
l=read(); r=read();
printf("%lld\n",query(1,1,n,l,r));
break;
case 2:
l=read(); r=read(); scanf("%lld",&x);
modify_mod(1,1,n,l,r,x);
break;
case 3:
l=read(); scanf("%lld",&x);
modify_as(1,1,n,l,x);
break;
}
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<'0'||tmp>'9'){
if(tmp=='-') flag=true;
tmp=getchar();
}
while(tmp>='0'&&tmp<='9'){
sum=(sum<<1)+(sum<<3)+tmp-'0';
tmp=getchar();
}
return flag?-sum:sum;
}
void build(int p,int l,int r){
if(l==r) {val_sum[p]=val_max[p]=init[l]; return;}
int mid=(l+r)>>1;
build(p<<1,l,mid); build(p<<1|1,mid+1,r);
val_sum[p]=val_sum[p<<1]+val_sum[p<<1|1];
val_max[p]=max(val_max[p<<1],val_max[p<<1|1]);
}
void modify_mod(int p,int l,int r,int L,int R,ll k){
if(l==r) {val_sum[p]%=k; val_max[p]=val_sum[p]; return;}
int mid=(l+r)>>1;
if(L<=mid&&val_max[p<<1]>=k) modify_mod(p<<1,l,mid,L,R,k);
if(mid+1<=R&&val_max[p<<1|1]>=k) modify_mod(p<<1|1,mid+1,r,L,R,k);
val_sum[p]=val_sum[p<<1]+val_sum[p<<1|1];
val_max[p]=max(val_max[p<<1],val_max[p<<1|1]);
}
void modify_as(int p,int l,int r,int pos,ll k){
if(l==pos&&pos==r) {val_sum[p]=k; val_max[p]=k; return;}
int mid=(l+r)>>1;
if(pos<=mid) modify_as(p<<1,l,mid,pos,k);
if(mid+1<=pos) modify_as(p<<1|1,mid+1,r,pos,k);
val_sum[p]=val_sum[p<<1]+val_sum[p<<1|1];
val_max[p]=max(val_max[p<<1],val_max[p<<1|1]);
}
ll query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R) return val_sum[p];
int mid=(l+r)>>1; ll ans=0;
if(L<=mid) ans+=query(p<<1,l,mid,L,R);
if(mid+1<=R) ans+=query(p<<1|1,mid+1,r,L,R);
return ans;
}
ZROI3的更多相关文章
随机推荐
- 14.api根路由
我们可以通过使用超链接来提高我们APi的内聚力和可发现性 一.为我们的API创建一个根路径 我们的视图有很多个url,但是没有一个入口点,可以使用@api_view创建一个根路径 #views.p ...
- 在Rocky8中安装VMware Workstation 的方法
在Rocky8中安装VMware Workstation 的方法 1.Rocky必须是图形界面 2.下载wmware workstation(下载地址:https://www.vmware.com/i ...
- OpenCV图像处理与视频分析详解
1.OpenCV4环境搭建 VS2017新建一个控制台项目 配置包含目录 配置库目录 配置链接器 配置环境变量 重新启动VS2017 2.第一个图像显示程序 main.cpp #include< ...
- 论文笔记 - An Explanation of In-context Learning as Implicit Bayesian Inference
这位更是重量级.这篇论文对于概率论学的一塌糊涂的我简直是灾难. 由于 prompt 的分布与预训练的分布不匹配(预训练的语料是自然语言,而 prompt 是由人为挑选的几个样本拼接而成,是不自然的自然 ...
- Codeforces Round #786 (Div. 3) 补题记录
小结: A,B,F 切,C 没写 1ll 对照样例才发现,E,G 对照样例过,D 对照样例+看了其他人代码(主要急于看后面的题,能调出来的但偷懒了. CF1674A Number Transforma ...
- 简单的sql注入1
首先查看源码找找思路 发现源码里什么都没有 再使用bp拦截下数据 多次拦截后发现我们在 输入框里输入的等下就是id= 意思是我们这里就可以直接使用get注入了 好像类似于sql-labs上的?id= ...
- 树莓派编译opencv4
前言 我用的是 树莓派3b 编译的 opencv4.1.0,如果不想编译可以直接下载我编译好的. 下载地址 直接 make install,或者按照我后续步骤复制动态链接库. 准备 需要调节虚拟内存大 ...
- 火山引擎 DataLeap 的 Data Catalog 系统公有云实践
Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...
- HashMap为何线程不安全?HashMap,HashTable,ConcurrentHashMap对比
这两天写爬虫帮组里收集网上数据做训练,需要进一步对收集到的json数据做数据清洗,结果就用到了多线程下的哈希表数据结构,猛地回想起自己看<Java并发编程的艺术>框架篇的时候,在Concu ...
- 【Linux】/proc/stat解析
一. 概述 1.1 CPU时间 cpu指标 含义user 用户态时间nice 用户态时间(低优先级,nice>0)system 内核态时间idle 空闲时间iowait I/O等待时间irq 硬 ...