[loj3220]Terytoria
显然两维是独立的,不妨考虑其中一维的答案
将其离散,枚举交包含的某一段(若不存在即交为空),进而即可确定所有段的方向,用线段树维护取到最大值的位置数即可
时间复杂度为$o(n\log n)$,可以通过
1 #包括息税前利润/标准利润.h
2使用命名空间标准;
3 #定义N 500005
4 #定义陆线(landlines的缩写)长
5 #定义pii pairint,int
6 #首先定义船方不负担装货费用
7 #定义硒秒
8 #定义L (k1)
9 #定义R (L 1)
10 #定义mid (l r1)
11 int n,X,Y,M,vis[N],tag[N3],mx[N3],f[N3],DTA[N1];
12个ll ans
13矢量v 0;
14 vectorpairint,int v;
15结构数据{
16国际,r;
17 }x[N],y[N],a[N];
18 void build(int k,int l,int r){ 0
19 if(l==r){ 0
20 mx[k]=n-dta[l],f[k]=v 0[l 1]-v 0[l];
21返回;
22 }
23建(左,左,中),建(R,中间1,R);
24 mx[k]=max(mx[L],mx[R]),f[k]=0;
25 if(MX[k]==MX[L])f[k]=f[L];
26 if(MX[k]==MX[R])f[k]=f[R];
27 MX[k]=标记[k];
28 }
29 void update(int k,int l,int r,int x,int y,int z){ 0
30 if ((ly)||(xr))返回;
31 if((x=l)(r=y)){ 0
32标签[k]=z,MX[k]=z;
33返回;
34 }
35更新(L,L,mid,x,y,z);
36更新(R,mid 1,R,x,y,z);
37 mx[k]=max(mx[L],mx[R]),f[k]=0;
38 if(MX[k]==MX[L])f[k]=f[L];
39 if(MX[k]==MX[R])f[k]=f[R];
40 MX[k]=标签[k];
41 }
42 void add(int id){ 0
43如果(!vis[id])(
44标记[1] -,MX[1]-;
45更新(1,0,M,a[id].l,a[id].r-1,2);
46 vis[id]=1;
47 }
48 else{
49标记[1],MX[1];
50更新(1,0,M,a[id].l,a[id].r-1,-2);
51 vis[id]=0;
52 }
53 }
54 int calc(int m){ 0
55 v.clear(),0v。clear();
56 memset(vis,0,sizeof(vis));
57记忆集(标记,0,sizeof(标记));
58 memset(dta,0,sizeof(DTA));
59表示(int I=1;I=n;I){ 0
60 v.push_back(make_pair(a[i]).l,I));
61 v.push_back(make_pair(a[i]).r,I));
62 }
排序(v.begin()、v . end());
64v 0。push _ back(0);
65表示(int I=0;I(n1);(一)
66 if((!i)||(v[i].菲v[i-1].fi))v0.push_back(v[i]).fi);
67 M=v0.size()-1,v0。push _ back(M);
68表示(int I=1;I=n;I){ 0
69 a[i].l=下界(v0.begin(),v0.end(),a[i].l)-v 0。begin();
70 a[i].r=下界(v0.begin(),v0.end(),a[i].r)-v 0。begin();
71避免双重征税协定.l],dta[a[i].r]-;
72 }
73表示(int I=1;I=M;I)DTA[I]=DTA[I-1];
74建(1,0,M);
75 int ans=0;
76表示(int I=0;I(n1);I){ 0
77 add(v[i]).se);
78 if (mx[1]==n)ans=max(ans,f[1]);
79 }
80个返回美国国家标准(American National Standards的缩写)
81 }
82 int main(){ 0
83 scanf('%d%d%d ',n,X,Y);
84表示(int I=1;I=n;I){ 0
85 scanf('%d%d%d%d ',x[i].我,你.l,x[i].r,y[i].r);
86 if (x[i]).lx[i].r)交换(x[i].l,x[i].r);
87 if (y[i]).撒谎r)交换(y[i].我,你.r);
88 }
89 memcpy(a,x,sizeof(a));
90 ans=calc(X);
91 memcpy(a,y,sizeof(a));
92 ans *=calc(Y);
93 printf('%lld\n ',ans);
94返回0;
95 }
查看代码
另外,还有一个更加巧妙的做法:注意到每一个区间的两种选择是互补的,对每一段区间异或一个随机值,那么可以认为众数的出现次数即为答案,这直接排序即可得到
关于错误的概率,并不太会分析,反正大概就对了QAQ
时间复杂度为$o(n\log n)$,也可以通过(比第一种算法常数更小)
1 #包括息税前利润/标准利润.h
2使用命名空间标准;
3 #定义N 500005
4 #定义陆线(landlines的缩写)长
5 #定义llu无符号陆线(landlines的缩写)
6矢量电视;
七整数n,X,Y;
8个ll ans
9 N1;
10 pairllu,IntP[N];
11结构数据{
12国际,r;
13 }x[N],y[N],a[N];
14 llu rnd(){ 0
15 llu x=0;
16表示(int I=0;i4;I)x=((x16)| rand()%(116));
17返回x;
18 }
19 int calc(int m){ 0
20v。clear();
21 memset(dta,0,sizeof(DTA));
22表示(int I=1;I=n;I){ 0
23 v.push_back(a[i]).l);
24 v.push_back(a[i]).r);
25 }
26 v.push_back(0),v . push _ back(m);
排序(v.begin()、v . end());
28表示(int I=1;I=n;I){ 0
29 a[i].l=下界开始,结束,结束.l)-v . begin();
页:1。r=下界(v.begin()、v.end()、a[i]).r)-v . begin();
31 llu p=rnd();
32 DTA[a[I]].l]^=p,dta[a[i]。r]^=p;
33 }
34为(int I=1);I=(n1);(i)dta[i]^=DTA[I-1];
35表示(int I=0);I=(n1);P[I]=make _ pair(DTA[I],v[I 1]-v[I]);
36个产出(p,p(n1)1);
37 int cnt=0,ans=0
38为(int I=0);I=(n1);>年;
39碳纳米管=磷[碘]。第二:
40 if ((i==(n1))||(P[i 1]).第一!=P[i].第一个)
41岁=最大(年,CNT);
42 cnt=0
43 }
44 }
45岁返回;
46 }
47 int main()
48 srand(时间(0));
49个扫描文件(“%d%d%d”、“n”、“x”、“y”);
50为(int I=1);i=n(I)>;
51个扫描文件(%d%d%d%d ",x[i]).我,你.页:1。r,y[i].(r)执行下列操作:
52 if (x[i]).lx[i].r)交换(x[i]).页:1。(r)执行下列操作:
53 if (y[i]).ly[我]。r)交换(和[i].我,你.(r)执行下列操作:
54 }
55 memcpy(a、x、sizeof(a));
56岁=计算;
57 memcpy(a,y,sizeof(a));
58岁*=计算(y);
59 printf("% lld \ n ",年);
60返回0;
61 }
视图代码
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/151784.html