COJ 0967 WZJ的数据结构(负三十三)

WZJ的数据结构(负三十三)
难度级别:E; 运行时间限制:7000ms; 运行空间限制:262144KB; 代码长度限制:2000000B

试题描述

请你设计一个数据结构,完成以下功能:

给定一个大小为N的整数组A,要求你回答执行N次操作。操作分两种:

操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数。

操作2:每次操作给你l,r,v三个参数,将Al至Ar所有数的值设为v。


输入

第一行为一个正整数N。
第二行为N个整数Ai。
接下来N行每行4个正整数t,l,r,v。若t=2表示操作1,t=1表示操作2。

输出

对每个操作1输出结果。

输入示例

6
1 2 2 1 2 3
2 1 4 2
2 1 4 1
1 2 4 1
2 1 4 1
1 3 5 2
2 2 5 2

输出示例

4
2
4
4

其他说明

1<=N<=200000
1<=Ai,v<=10^9

题解:标程肯定是什么线段树分治什么的奇怪的东西,窝不会写呀,,,就写分块吧,于是就虐标程了哦,excited!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=200000+10,maxb=500,inf=-1u>>1;
11 int z[maxn],st[maxb],en[maxb],size,n,A[maxn],B[maxn],set[maxb],siz[maxb];
12 inline int read(){
13     int x=0,sig=1;char ch=getchar();
14     for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)sig=0;
15     for(;isdigit(ch);ch=getchar())x=10*x+ch-‘0‘;
16     return sig?x:-x;
17 }
18 inline void write(int x){
19     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
20     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
21     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
22 }
23 void build(int b){
24     for(int i=st[b];i<=en[b];i++)B[i]=A[i];sort(B+st[b],B+en[b]+1);return;
25 }
26 void down(int b){
27     if(set[b]!=inf){for(int i=st[b];i<=en[b];i++)A[i]=B[i]=set[b];set[b]=inf;}return;
28 }
29 void sett(int L,int R,int cv){
30     down(z[L]);for(int i=L;i<=R;i++)A[i]=cv;build(z[L]);return;
31 }
32 void setb(int L,int R,int cv){
33     for(int b=L;b<=R;b++)set[b]=cv;return;
34 }
35 void seto(int ql,int qr,int cv){
36     if(z[ql]==z[qr])sett(ql,qr,cv);
37     else sett(ql,en[z[ql]],cv),setb(z[ql]+1,z[qr]-1,cv),sett(st[z[qr]],qr,cv);return;
38 }
39 int queryb(int L,int R,int cv){
40     int ans=0;
41     for(int b=L;b<=R;b++){
42         if(set[b]!=inf){
43             if(set[b]<=cv)ans+=siz[b];
44         }else ans+=upper_bound(B+st[b],B+en[b]+1,cv)-B-st[b];
45     }return ans;
46 }
47 int queryt(int L,int R,int cv){
48     int ans=0;
49     if(set[z[L]]!=inf){
50         if(set[z[L]]<=cv)ans+=(R-L+1);
51     }else for(int i=L;i<=R;i++)if(A[i]<=cv)ans++;
52     return ans;
53 }
54 int queryo(int ql,int qr,int cv){
55     if(z[ql]==z[qr])return queryt(ql,qr,cv);
56     else return queryt(ql,en[z[ql]],cv)+queryb(z[ql]+1,z[qr]-1,cv)+queryt(st[z[qr]],qr,cv);
57 }
58 void init(){
59     n=read();size=sqrt((double)n*0.9);int tp,ql,qr,cv;
60     for(int i=1;i<=n;i++){
61         A[i]=B[i]=read();
62         z[i]=(i-1)/size+1;
63         if(!st[z[i]])st[z[i]]=i;
64         en[z[i]]=i;
65     }
66     for(int b=1;b<=z[n];b++)build(b),set[b]=inf,siz[b]=en[b]-st[b]+1;
67     for(int i=1;i<=n;i++){
68         tp=read();ql=read();qr=read();cv=read();
69         if(tp==2)write(queryo(ql,qr,cv)),ENT;
70         else seto(ql,qr,cv);
71     }
72     return;
73 }
74 void work(){
75     return;
76 }
77 void print(){
78     return;
79 }
80 int main(){init();work();print();return 0;}

总结一下这次WA的tip:queryt的时候窝萌是要暴力的呀。。。。。。。。。。。。

还有就是一开始没写B数组哦。。。。。。

时间: 2024-12-22 16:14:46

COJ 0967 WZJ的数据结构(负三十三)的相关文章

COJ WZJ的数据结构(负三十三)

WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,要求你回答执行N次操作.操作分两种: 操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数. 操作2:每次操作给你l,r,v三个参数,将Al至Ar所有数的值设为v. 输入 第一行为一个正整数N.第二行为N个整数Ai.接下来N行每行4个正整数t,l,r,v.若t=2表

COJ 0970 WZJ的数据结构(负三十)树分治

WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为d,那么将y节点的权值加上d*v. 2 x:询问节点x的权值. 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi.第N+1行为一个正整数M.最后

COJ 0979 WZJ的数据结构(负二十一)

WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个N个点的图,初始状态无边. 每次加入一条双向边(u,v,w),若加入后没有构成一棵生成树,输出“Not Yet”,否则输出当前最小生成树的权值. 输入 第一行两个正整数N,M.表示有N个点M个操作.接下来M行每行三个正整数u,v,w. 输出 每次加入一条双向边(u,v,w),若加入后没有构成一棵生成

COJ 0995 WZJ的数据结构(负五)区间操作

WZJ的数据结构(负五) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的整数组A,要求你回答执行M次操作.操作分两种: 操作1:每次操作给你l,r,v三个参数,求Al至Ar中值<=v的个数. 操作2:每次操作给你l,r,v三个参数,将Al至Ar中每个数的值+v. 输入 第一行为一个正整数N.第二行为N个整数Ai.第三行为一个正整数M.接下来M行每行4个正整数t,l,

COJ 0981 WZJ的数据结构(负十九)树综合

WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:15000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习模板的同学还要找来找去很不爽,于是WZJ跟小伙伴们一块商量如何将这些题汇拢到一块去: WZJ:为了大家简单,我规定一开始是一棵有根树. LZJ:那我一定得加上换根操作喽. XJR:链信息修改,链信息增加,链信息翻倍,维护链信息的最大,最小,总和肯定很好做. CHX:子树信息修改,子树信息增加,子树

COJ 0999 WZJ的数据结构(负一)

WZJ的数据结构(负一) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 输入N个模板串Pi和文本串T,输出每个模板串Pi在T中出现了多少次. 输入 第一行为一个正整数N.接下来N行为Pi.最后一行为T 输出 输出N行,第i行为模板串Pi在T中出现的次数. 输入示例 5aabbaabaaababababa 输出示例 54445 其他说明 1<=sigma(|Pi|)<=10000001<=|T|<=10000

COJ 1010 WZJ的数据结构(十) 线段树区间操作

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int

COJ 1010 WZJ的数据结构(十) 线段树的地狱

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,高效执行以下过程: #include<iostream>using namespace std;const int maxn=100010;int A[maxn];int tp,ql,qr,v;int

COJ 0985 WZJ的数据结构(负十五)(限定区域不同数)

传送门:http://oj.cnuschool.org.cn/oj/home/addSolution.htm?problemID=955 试题描述: CHX有一个问题想问问大家.给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L].A[L+1].…….A[R]中没有重复的数,输出R-L+1的最大值. 以上是附中联赛加试的一道题.WZJ觉得这道题太水了,改了改题目: WZJ有一个问题想问问大家.给你一个长度为N的数列A,你要回答M次问题.每次问题给你两个正整数ql,qr.请你找到两个位置