码迷,mamicode.com
首页 > 其他好文 > 详细

【UOJ Round #8】

时间:2015-06-10 23:55:30      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

A

  一道不错的题,虽然大家都觉得是水题,然而蒟蒻我想出来的好慢……Orz alpq

  发现其实就是一个网格图,每一个大块都是同一颜色……横纵坐标互不干扰……

技术分享
 1 //UOJ Round #8 A
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 using namespace std;
12 typedef long long LL;
13 inline int getint(){
14     int r=1,v=0; char ch=getchar();
15     for(;!isdigit(ch);ch=getchar()) if (ch==-) r=-1;
16     for(; isdigit(ch);ch=getchar()) v=v*10-0+ch;
17     return r*v;
18 }
19 const int N=1e5+10;
20 /*******************template********************/
21 
22 int n,m,x[N],y[N];
23 int bel1[N],bel2[N],cnt1,cnt2;
24 int main(){
25 #ifndef ONLINE_JUDGE
26     freopen("A.in","r",stdin);
27     freopen("A.out","w",stdout);
28 #endif 
29     n=getint(); m=getint();
30     F(i,1,n) x[i]=getint();
31     F(i,1,m) y[i]=getint();
32     int now=x[1];
33     bel1[1]=1; cnt1=1;
34     F(i,2,n){
35         if (x[i]!=now){
36             cnt1++;
37             now=x[i];
38         }
39         bel1[i]=cnt1;
40     }
41     now=y[1]; bel2[1]=1; cnt2=1;
42     F(i,2,m){
43         if (y[i]!=now){
44             cnt2++;
45             now=y[i];
46         }
47         bel2[i]=cnt2;
48     }
49 
50     int Q=getint();
51     F(i,1,Q){
52         int x1=getint(),y1=getint(),x2=getint(),y2=getint();
53         if (x2<x1) swap(x1,x2); if (y2<y1) swap(y1,y2);
54         int t1=min(bel1[x2]-bel1[x1],cnt1-bel1[x2]+bel1[x1]-(x[1]==x[n]));
55         int t2=min(bel2[y2]-bel2[y1],cnt2-bel2[y2]+bel2[y1]-(y[1]==y[m]));
56         printf("%d\n",t1+t2);
57     }
58     return 0;
59 }
View Code

B

  线段树的好题!(话说为什么我感觉那么像KD-Tree……

  前两个操作就是普通线段树维护就可以……

  查询的时候,感觉就是将n个点的横坐标固定成1~n了……然后用KD-Tree的估价函数来判断是否进入子树查询……

  我一开始query写的逗比了,膜了一下vfk的姿势……

  然后这题我TLE了好久……

  重点是题解里说的:先判断右子树,再判断左子树!!!(就像KD-Tree的时候,要先像估价值较大的那一侧走啊!我怎么给忘了……sad

技术分享
  1 //UOJ Round #8 B
  2 #include<vector>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<cstdlib>
  6 #include<iostream>
  7 #include<algorithm>
  8 #define rep(i,n) for(int i=0;i<n;++i)
  9 #define F(i,j,n) for(int i=j;i<=n;++i)
 10 #define D(i,j,n) for(int i=j;i>=n;--i)
 11 using namespace std;
 12 typedef long long LL;
 13 inline int getint(){
 14     int r=1,v=0; char ch=getchar();
 15     for(;!isdigit(ch);ch=getchar()) if (ch==-) r=-1;
 16     for(; isdigit(ch);ch=getchar()) v=v*10-0+ch;
 17     return r*v;
 18 }
 19 const int N=1e5+10;
 20 /*******************template********************/
 21 
 22 int n,m,x0,v[N],mn[N<<2],mx[N<<2];
 23 bool rev[N<<2];
 24 inline int ran(){
 25     x0=((LL)x0*100000005+20150609)%998244353;
 26     return x0/100;
 27 }
 28 #define mid (l+r>>1)
 29 #define L (o<<1)
 30 #define R (o<<1|1)
 31 void maintain(int o,int l,int r){
 32     mn[o]=min(mn[L],mn[R]);
 33     mx[o]=max(mx[L],mx[R]);
 34 }
 35 void change(int o){
 36     rev[o]^=1;
 37     mn[o]=100000-mn[o]; mx[o]=100000-mx[o];
 38     swap(mn[o],mx[o]);
 39 }
 40 void Push_down(int o,int l,int r){
 41     if (rev[o]){
 42         change(L); change(R);
 43         rev[o]=0;
 44     }
 45 }
 46 void build(int o,int l,int r){
 47     if (l==r){
 48         mn[o]=mx[o]=ran()%100001;
 49     }else{
 50         build(L,l,mid);
 51         build(R,mid+1,r);
 52         maintain(o,l,r);
 53     }
 54 }
 55 void update(int o,int l,int r,int p,int val){
 56     if (l==r){
 57         mn[o]=mx[o]=val;
 58     }else{
 59         Push_down(o,l,r);
 60         if (p<=mid) update(L,l,mid,p,val);
 61         else update(R,mid+1,r,p,val);
 62         maintain(o,l,r);
 63     }
 64 }
 65 void modify(int o,int l,int r,int ql,int qr){
 66     if (ql<=l && qr>=r){
 67         change(o);
 68     }else{
 69         Push_down(o,l,r);
 70         if (ql<=mid) modify(L,l,mid,ql,qr);
 71         if (qr>mid) modify(R,mid+1,r,ql,qr);
 72         maintain(o,l,r);
 73     }
 74 }
 75 
 76 LL ans=0;
 77 int a,b,c;
 78 inline LL calc(int x,int y){return (LL)a*x+(LL)b*y+(LL)c*x*y;}
 79 void query(int o,int l,int r,int ql,int qr){
 80     if (calc(min(r,qr),mx[o])<=ans) return;
 81     if (l==r){
 82         ans=calc(l,mx[o]);
 83         return;
 84     }
 85     Push_down(o,l,r);
 86     if (qr>mid) query(R,mid+1,r,ql,qr);
 87     if (ql<=mid) query(L,l,mid,ql,qr);
 88 }
 89 
 90 int main(){
 91 #ifndef ONLINE_JUDGE
 92     freopen("B.in","r",stdin);
 93     freopen("B.out","w",stdout);
 94 #endif 
 95     n=getint(); m=getint(); x0=getint();
 96 //    F(i,1,n) v[i]=ran()%100001;
 97     build(1,1,n);
 98     char cmd;
 99     F(i,1,m){
100         while(cmd=getchar(),cmd!=C && cmd!=R && cmd!=Q);
101         if (cmd==C){
102             int p=ran()%n+1,y=ran()%100001;
103             update(1,1,n,p,y);
104         }else if (cmd==R){
105             int ql=ran()%n+1,qr=ran()%n+1;
106             if (qr<ql) swap(ql,qr);
107             modify(1,1,n,ql,qr);
108         }else if (cmd==Q){
109             a=getint(),b=getint(),c=getint();
110             int ql=ran()%n+1,qr=ran()%n+1;
111             if (qr<ql) swap(ql,qr);
112             ans=0;
113             query(1,1,n,ql,qr);
114             printf("%lld\n",ans);
115         }
116     }
117     return 0;
118 }
View Code

 

【UOJ Round #8】

标签:

原文地址:http://www.cnblogs.com/Tunix/p/4567728.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!