[BZOJ4810][Ynoi2017]由乃的玉米田 莫隊+bitset
阿新 • • 發佈:2018-01-29
arch lin mathjax ram abs .com n-2 ssis 技術
Submit: 815 Solved: 399
[Submit][Status][Discuss]
1 1 2 3 4
2 1 1 2
1 1 2 2
3 1 1 1
3 5 5 16
1 2 3 4
yumi
yuno
yuno
yumi
4810: [Ynoi2017]由乃的玉米田
Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 815 Solved: 399
[Submit][Status][Discuss]
Description
由乃在自己的農田邊散步,她突然發現田裏的一排玉米非常的不美。這排玉米一共有N株,它們的高度參差不齊。 由乃認為玉米田不美,所以她決定出個數據結構題 這個題是這樣的: 給你一個序列a,長度為n,有m次操作,每次詢問一個區間是否可以選出兩個數它們的差為x,或者詢問一個區間是 否可以選出兩個數它們的和為x,或者詢問一個區間是否可以選出兩個數它們的乘積為x ,這三個操作分別為操作1 ,2,3選出的這兩個數可以是同一個位置的數
Input
第一行兩個數n,m 後面一行n個數表示ai 後面m行每行四個數opt l r x opt表示這個是第幾種操作,l,r表示操作的區間,x表示這次操作的x 定義c為每次的x和ai中的最大值,ai >= 0,每次的x>=2n,m,c <= 100000
Output
對於每個詢問,如果可以,輸出yuno,否則輸出yumi
Sample Input
5 51 1 2 3 4
2 1 1 2
1 1 2 2
3 1 1 1
3 5 5 16
1 2 3 4
Sample Output
yunoyumi
yuno
yuno
yumi
HINT
Source
By 佚名提供
考慮莫隊
把a[i]和maxn-b[i]壓到bitset上
加減用bitset左移查詢
乘除直接暴力
……
1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #include<bitset> 8 #define maxn 100005 9 using namespace std; 10View Codeint read() { 11 int x=0,f=1;char ch=getchar(); 12 for(;!isdigit(ch);ch=getchar()) if(ch==‘-‘) f=-1; 13 for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘; 14 return x*f; 15 } 16 int belong[maxn],size; 17 struct data { 18 int t,x,y,ask,id,ans; 19 bool operator <(const data tmp) { 20 if(belong[x]==belong[tmp.x]) return belong[x]%2?y>tmp.y:y<tmp.y; 21 return belong[x]<belong[tmp.x]; 22 } 23 }q[maxn]; 24 bool cmp1(data t1,data t2) { 25 if(belong[t1.x]==belong[t2.x]) return belong[t1.x]%2?t1.y>t2.y:t1.y<t2.y; 26 return belong[t1.x]<belong[t2.x]; 27 } 28 bool cmp2(data t1,data t2) { 29 return t1.id<t2.id; 30 } 31 bitset<maxn> a1,b1,c; 32 int a[maxn]; 33 int n,m; 34 int cnt[maxn]; 35 void update(int x,int f) { 36 if(f) cnt[a[x]]++; 37 else cnt[a[x]]--; 38 if(cnt[a[x]]) a1[a[x]]=1,b1[maxn-5-a[x]]=1; 39 else a1[a[x]]=0,b1[maxn-5-a[x]]=0; 40 } 41 void work() { 42 int l=1,r=0; 43 for(int i=1;i<=m;i++) { 44 for(;r<q[i].y;r++) update(r+1,1); 45 for(;r>q[i].y;r--) update(r,0); 46 for(;l<q[i].x;l++) update(l,0); 47 for(;l>q[i].x;l--) update(l-1,1); 48 if(q[i].t==1) { 49 c=(a1>>q[i].ask)&a1; 50 q[i].ans=c.any(); 51 } 52 else if(q[i].t==2) { 53 c=(b1>>abs(maxn-5-q[i].ask))&a1; 54 q[i].ans=c.any(); 55 } 56 else { 57 int tmp=sqrt(q[i].ask); 58 for(int j=1;j<=tmp;j++) { 59 if(q[i].ask%j==0) { 60 if(cnt[j]&&cnt[q[i].ask/j]) {q[i].ans=1;break;} 61 } 62 } 63 } 64 } 65 } 66 67 int main() { 68 n=read(),m=read(); 69 size=sqrt(n); 70 for(int i=1;i<=n;i++) belong[i]=i/size; 71 for(int i=1;i<=n;i++) a[i]=read(); 72 for(int i=1;i<=m;i++) q[i].t=read(),q[i].x=read(),q[i].y=read(),q[i].ask=read(),q[i].id=i; 73 sort(q+1,q+m+1,cmp1); 74 work(); 75 sort(q+1,q+m+1,cmp2); 76 for(int i=1;i<=m;i++) if(q[i].ans)printf("yuno\n");else printf("yumi\n"); 77 } 78
[BZOJ4810][Ynoi2017]由乃的玉米田 莫隊+bitset