1. 程式人生 > >睡覺困難綜合征

睡覺困難綜合征

unsigned lse long func typedef 結構 主程序 main div

為什麽每次數據結構題主程序都寫掛

#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
typedef unsigned long long u64;
struct func{
    u64 a,b;
    inline func(u64 x=-1ull,u64 y=0){a=x,b=y;}
    inline u64 operator()(u64 x)const{return(x&a)|(~x&b);}
    inline func 
operator()(func x)const{return func(x(a),x(b));} }; int n,m,k; const auto getxor = [](u64 x){return func(~x,x);}; const auto getand = [](u64 x){return func(x,0);}; const auto getor = [](u64 x){return func(-1ull,x);}; const int maxn = 100100; func v[maxn],sum1[maxn],sum2[maxn]; int son[maxn][2],fa[maxn],tag[maxn],st[maxn],top; inline
int get(int x,int p=1){return son[fa[x]][p]==x;} inline int is_root(int x){return!(get(x)||get(x,0));} inline void up(int x){ sum1[x]=sum1[son[x][0]](v[x])(sum1[son[x][1]]); sum2[x]=sum2[son[x][1]](v[x])(sum2[son[x][0]]); } inline void puttag(int x){if(x)std::swap(sum1[x],sum2[x]),tag[x]^=1;} inline
void down(int x){ if(tag[x]){ std::swap(son[x][1],son[x][0]); puttag(son[x][1]),puttag(son[x][0]); tag[x]=0; } } inline void rotate(int x){ int y=fa[x],z=fa[y],b=get(x); if(!is_root(y))son[z][get(y)]=x; son[y][b]=son[x][!b],son[x][!b]=y; fa[son[y][b]]=y,fa[y]=x,fa[x]=z; up(y),up(x); } inline void splay(int x){ st[top=1]=x; for(int y=x;!is_root(y);st[++top]=y=fa[y]); for(;top;--top)down(st[top]); for(;!is_root(x);rotate(x)) if(!is_root(fa[x]))rotate(get(x)^get(fa[x])?x:fa[x]); up(x); } inline void access(int x){for(int t=0;x;son[x][1]=t,t=x,x=fa[x])splay(x);} inline void make_root(int x){access(x),splay(x),puttag(x);} inline void split(int x,int y){make_root(x),access(y),splay(y);} std::vector<int>e[maxn]; int vis[maxn]; inline void dfs(int x){vis[x]=1;for(int i:e[x])if(!vis[i])fa[i]=x,dfs(i);} int main(){ std::ios::sync_with_stdio(false),std::cin.tie(0); std::cin >> n >> m >> k; for(int i=1;i<=n;++i){ int a;u64 b; std::cin >> a >> b; if(a==1)v[i]=getand(b); if(a==2)v[i]=getor(b); if(a==3)v[i]=getxor(b); up(i); } for(int i=1,x,y;i<n;++i) std::cin>>x>>y,e[x].push_back(y),e[y].push_back(x); dfs(1); for(int i=1;i<=m;++i){ int q,x,y;u64 z; std::cin >> q >> x >> y >> z; if(q==1){ split(x,y); func o = sum1[y]; u64 res=0; for(int i=63;~i;--i) if(o(res|1ull<<i)>o(res)&&(res|1ull<<i)<=z)res|=1ull<<i; std::cout << o(res) << \n; }else{ make_root(x); if(y==1)v[x]=getand(z); if(y==2)v[x]=getor(z); if(y==3)v[x]=getxor(z); up(x); } } }

睡覺困難綜合征