zoukankan      html  css  js  c++  java
  • UOJ #119. 【UR #8】决战圆锥曲线

    Description

    Solution

    此题解题关键在于数据随机,根据这个进行复杂度分析
    不想写题解了

    #include<bits/stdc++.h>
    #define ls (o<<1)
    #define rs (o<<1|1)
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    int n,m,x0,mx[N*4],mn[N*4];bool rev[N*4];
    int seed(){x0=(1ll*100000005*x0+20150609)%998244353;return x0/100;}
    void R(int &x){x=100000-x;}
    void mark(int o){rev[o]^=1;swap(mx[o],mn[o]);R(mx[o]);R(mn[o]);}
    void pushdown(int o){if(!rev[o])return ;rev[o]=0;mark(ls);mark(rs);}
    void upd(int o){mx[o]=max(mx[ls],mx[rs]);mn[o]=min(mn[ls],mn[rs]);}
    void ins(int l,int r,int o,int sa,int t){
    	if(l==r){mx[o]=mn[o]=t;return ;}
    	int mid=(l+r)>>1;pushdown(o);
    	if(sa<=mid)ins(l,mid,ls,sa,t);
    	else ins(mid+1,r,rs,sa,t);upd(o);
    }
    void Rev(int l,int r,int o,int sa,int se){
    	if(sa<=l && r<=se){mark(o);return ;}
    	int mid=(l+r)>>1;pushdown(o);
    	if(se<=mid)Rev(l,mid,ls,sa,se);
    	else if(sa>mid)Rev(mid+1,r,rs,sa,se);
    	else Rev(l,mid,ls,sa,mid),Rev(mid+1,r,rs,mid+1,se);upd(o);
    }
    ll ans=0,a,b,c;
    ll calc(int x,int y){return a*x+b*y+c*x*y;}
    void qry(int l,int r,int o,int sa,int se){
    	int mid=(l+r)>>1;pushdown(o);
    	if(sa<=l && r<=se){
    		if(l==r){ans=max(ans,calc(l,mx[o]));return ;}
    		if(calc(r,mx[rs])>ans)qry(mid+1,r,rs,mid+1,se);
    		if(calc(mid,mx[ls])>ans)qry(l,mid,ls,sa,mid);
    	}
    	else if(se<=mid)qry(l,mid,ls,sa,se);
    	else if(sa>mid)qry(mid+1,r,rs,sa,se);
    	else qry(l,mid,ls,sa,mid),qry(mid+1,r,rs,mid+1,se);upd(o);
    }
    int main(){
      freopen("pp.in","r",stdin);
      freopen("pp.out","w",stdout);
      char op[2];int x,y;
      cin>>n>>m>>x0;
      for(int i=1;i<=n;i++)ins(1,n,1,i,seed()%100001);
      while(m--){
    	  scanf("%s",op);
    	  x=seed();y=seed();
    	  if(op[0]=='C')x=x%n+1,y%=100001,ins(1,n,1,x,y);
    	  else{
    		  x=x%n+1,y=y%n+1;if(x>y)swap(x,y);
    		  if(op[0]=='R')Rev(1,n,1,x,y);
    		  else {
    			  scanf("%lld%lld%lld",&a,&b,&c);ans=0;
    			  qry(1,n,1,x,y);printf("%lld
    ",ans);
    		  }
    	  }
      }
      return 0;
    }
    
    
  • 相关阅读:
    ? ?? 类?
    类 建索引
    访问局域网计算机文件
    JS 在元素后面添加新的元素
    js 网页加载完毕,执行js函数
    设置快捷键(3种方式)
    winform设置textbox设置水印
    ADO.NET 学生管理
    C#整理 条件语句
    ADO.NET 数据访问类查询、属性扩展
  • 原文地址:https://www.cnblogs.com/Yuzao/p/8718989.html
Copyright © 2011-2022 走看看