杭电2018多校第五场(2018 Multi-University Training Contest 5) 1007.Glad You Came (HDU6356)-区间更新-线段树+剪枝

Posted zero-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杭电2018多校第五场(2018 Multi-University Training Contest 5) 1007.Glad You Came (HDU6356)-区间更新-线段树+剪枝相关的知识,希望对你有一定的参考价值。

 

6356.Glad You Came

 

题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值。然后最后求一下异或和就可以了。

线段树,区间最大值和最小值维护一下,因为数据有点大,不剪枝就会超时。(默默吐槽,剪了枝照样超时)

 

因为太菜,交了24遍也是没过,TLE,WA,RE轮流来,而且感觉这题有毒,删一个没用的变量就会WA。。。

技术分享图片

百度了一下题解,发现有人和我写的几乎一模一样,但是人家的就可以过,我的死也过不去。

人家的博客:HDU6356 Glad You Came(线段树区间更新+剪枝)

贴一下人家的代码:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef unsigned int ui;
  4 typedef long long ll;
  5 const int maxn = 1e5 + 5;
  6 const int maxm = 5e6 + 5;
  7 const ui mod = 1 << 30;
  8 ui x, y, z, w, f[3*maxm], Left[maxm], Right[maxm], v[maxm];
  9 ui fun()
 10 {
 11     x ^= (x << 11);
 12     x ^= (x >> 4);
 13     x ^= (x << 5);
 14     x ^= (x >> 14);
 15     w = x ^ (y ^ z);
 16     x = y;
 17     y = z;
 18     z = w;
 19     return z;
 20 }
 21 
 22 ll ans, a[maxn], maxa[maxn<<2], mina[maxn<<2], lazy[maxn<<2];
 23 #define lson l,m,rt<<1
 24 #define rson m+1,r,rt<<1|1
 25 #define getm int m = l + r >> 1
 26 void pushup(int rt)
 27 {
 28     mina[rt] = min(mina[rt<<1],mina[rt<<1|1]);
 29     maxa[rt] = max(maxa[rt<<1],maxa[rt<<1|1]);
 30 }
 31 
 32 void pushdown(int rt)
 33 {
 34     if(lazy[rt])
 35     {
 36         lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];
 37         maxa[rt<<1] = maxa[rt<<1|1] = lazy[rt];
 38         mina[rt<<1] = mina[rt<<1|1] = lazy[rt];
 39         lazy[rt] = 0;
 40     }
 41 }
 42 
 43 void update(ui L,ui R,ui val,int l,int r,int rt)
 44 {
 45     if(mina[rt] >= val) return ;//最小值都比v大,不用更新
 46     if(L <= l && r <= R)
 47     {
 48         if(maxa[rt] <= val)//最大值比v小,全部更新,打标记
 49         {
 50             maxa[rt] = val;
 51             lazy[rt] = val;
 52             return ;
 53         }
 54         //否则继续切分区间,向下更新
 55     }
 56 
 57     getm;
 58     pushdown(rt);
 59     if(L<=m)
 60         update(L,R,val,lson);
 61     if(R>m)
 62         update(L,R,val,rson);
 63     pushup(rt);
 64 }
 65 
 66 ll query(int pos,int l,int r,int rt)
 67 {
 68     if(l==r)
 69         return maxa[rt];
 70     getm;
 71     pushdown(rt);
 72     if(pos<=m)
 73         return query(pos,lson);
 74     else
 75         return query(pos,rson);
 76 }
 77 
 78 int T, N, M;
 79 int main()
 80 {
 81     scanf("%d",&T);
 82     while(T--)
 83     {
 84         memset(a,0,8*(N+1));
 85         memset(lazy,0,32*(N+1));
 86         memset(mina,0,32*(N+1));
 87         memset(maxa,0,32*(N+1));
 88         scanf("%d%d%u%u%u",&N,&M,&x,&y,&z);
 89         for(int i=1;i<=3*M;++i)
 90             f[i] = fun();
 91         for(int i=1;i<=M;++i)
 92         {
 93             Left[i] = min(f[3*i-2] % N, f[3*i-1] % N) + 1;
 94             Right[i] = max(f[3*i-2] % N, f[3*i-1] % N) + 1;
 95             v[i] = f[3*i] % mod;
 96             update(Left[i],Right[i],v[i],1,N,1);
 97         }
 98         ans = 0;
 99         for(int i=1;i<=N;++i)
100             ans ^= ((ll)i * query(i,1,N,1));
101         printf("%lld
",ans);
102     }
103     return 0;
104 }

 

 

最后贴一下我的死也没过去的代码,哪个大佬好心看一下,然后拯救一下我。。。

我队友帮我调了也快20发了,依旧没过,哭死???????

技术分享图片
  1 //1007-6356-线段树
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<bitset>
  7 #include<cassert>
  8 #include<cctype>
  9 #include<cmath>
 10 #include<cstdlib>
 11 #include<ctime>
 12 #include<deque>
 13 #include<iomanip>
 14 #include<list>
 15 #include<map>
 16 #include<queue>
 17 #include<set>
 18 #include<stack>
 19 #include<vector>
 20 using namespace std;
 21 typedef unsigned int ui;
 22 typedef long long ll;
 23 const double PI=acos(-1.0);
 24 const double eps=1e-6;
 25 const int inf=0x3f3f3f3f;
 26 const int maxn=1e5+5;
 27 const int maxm=5e6+5;
 28 const ui mod=1<<30;
 29 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
 30 
 31 #define lson l,m,rt<<1
 32 #define rson m+1,r,rt<<1|1
 33 
 34 ll lazy[maxn<<2],MAX[maxn<<2],MIN[maxn<<2];
 35 ui x,y,z,w,f[maxm];
 36 
 37 void pushup(int rt)
 38 {
 39     MIN[rt]=min(MIN[rt<<1],MIN[rt<<1|1]);
 40     MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
 41 }
 42 
 43 void pushdown(int rt)
 44 {
 45     if(lazy[rt]){
 46         lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
 47         MAX[rt<<1]=MAX[rt<<1|1]=lazy[rt];
 48         MIN[rt<<1]=MIN[rt<<1|1]=lazy[rt];
 49         lazy[rt]=0;
 50     }
 51 }
 52 
 53 void build(int l,int r,int rt)
 54 {
 55     lazy[rt]=0;MAX[rt]=MIN[rt]=0;
 56     if(l==r){
 57         return ;
 58     }
 59 
 60     int m=(l+r)>>1;
 61     build(lson);
 62     build(rson);
 63 }
 64 
 65 void update(ui L,ui R,ui val,int l,int r,int rt)
 66 {
 67     if(MIN[rt]>=val) return ;
 68     if(L<=l&&r<=R){
 69         if(MAX[rt]<=val){
 70             MAX[rt]=val;
 71             lazy[rt]=val;
 72             return ;
 73         }
 74     }
 75 
 76     pushdown(rt);
 77     int m=(l+r)>>1;
 78     if(L<=m) update(L,R,val,lson);
 79     if(R> m) update(L,R,val,rson);
 80     pushup(rt);
 81 }
 82 
 83 ll query(int pos,int l,int r,int rt)
 84 {
 85     if(l==r){
 86         return MAX[rt];
 87     }
 88 
 89     pushdown(rt);
 90     int m=(l+r)>>1;
 91     if(pos<=m) return query(pos,lson);
 92     if(pos> m) return query(pos,rson);
 93 }
 94 
 95 ui RNG61()
 96 {
 97     x ^= (x << 11);
 98     x ^= (x >> 4);
 99     x ^= (x << 5);
100     x ^= (x >> 14);
101     w = x ^ (y^z);
102     x = y;
103     y = z;
104     z = w;
105     return z;
106 }
107 
108 int t,n,m;
109 
110 int main()
111 {
112     scanf("%d",&t);
113     while(t--){
114         scanf("%d%d%u%u%u",&n,&m,&x,&y,&z);
115         build(1,n,1);
116         for(int i=1;i<=3*m;i++)
117             f[i]=RNG61();
118         for(int i=1;i<=m;i++){
119             ui l=min(f[3*i-2]%n,f[3*i-1]%n)+1;
120             ui r=max(f[3*i-2]%n,f[3*i-1]%n)+1;
121             ui v=f[3*i]%mod;
122             update(l,r,v,1,n,1);
123         }
124         ll ans=0;
125         for(int i=1;i<=n;i++)
126             ans^=(ll)i*query(i,1,n,1);
127         printf("%lld
",ans);
128     }
129 }
View Code

 

 

 

滚了滚了,滚回垃圾桶了。

 

以上是关于杭电2018多校第五场(2018 Multi-University Training Contest 5) 1007.Glad You Came (HDU6356)-区间更新-线段树+剪枝的主要内容,如果未能解决你的问题,请参考以下文章

[2019杭电多校第五场][hdu6624]fraction

[2019杭电多校第五场][hdu6628]permutation 1

[2019杭电多校第五场][hdu6629]string matching

2020杭电多校第五场1012-Set1

2020杭电多校第五场1012-Set1

[2019杭电多校第五场][hdu6630]permutation 2