又是一场扔分的考试,T1暴力没调出来,T2没看到40分的点自己会,手扔40分。极限得分85+70+95=250然而实际25+30+95=150还是太菜了,现在才把T2改完。

  T1就是一个辣鸡。。。。额它就是个暴力,首先这道题没有思维含量。。但我还是很满意自己在考场上的挽救大脑短路的操作的,其实一开始我是没有发现矩形内部可以直接算,也就是说别人一下想到的东西我大脑间歇抽搐没想到,然鹅我通过一系列的分析从一些边缘信息得到了这个,首先坐标1e9就是刚会打for循环都知道这不能存矩阵,然后只能看输入什么存什么,那么它为什么是一个矩形一个矩形给,而且为什么这个第一个5分它只给一个矩形,然后通过想这5分怎么打的时候发现了矩形中间是可以直接算的,矩形之间$n^{2}$枚举算。然后就结束了,这是一个非常神奇的复杂度,没有啥正确证明,本人只能口胡一个:理论上来说卡它的极限数据是每个矩形周围都有n个矩形能形成氢键,然而yy一下发现这是不可能的,也就是说一个矩形只能和有限个矩形形成氢键,而这有限个又很小,就算一个矩形周围很多键,那一定是这个矩形很大旁边的很小,那些小的周围的键就会少很多,所以均摊下来很小。。。应该是这样吧

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int X=1e9;
 6 int rd()
 7 {
 8     int s=0,w=1;
 9     char cc=getchar();
10     while(cc<'0'||cc>'9') {if(cc=='-') w=-1;cc=getchar();}
11     while(cc>='0'&&cc<='9') s=(s<<3)+(s<<1)+cc-'0',cc=getchar();
12     return s*w;
13 }
14 struct mat{int xa,xb,ya,yb;}m[100020];
15 bool cmp1(mat a,mat b)
16 {
17     if(a.xa==b.xa) return a.ya<b.ya;    
18     return a.xa<b.xa;
19 }
20 signed main()
21 {
22     int n=rd();
23     if(n==1)
24     {
25         int xa=rd(),ya=rd(),xb=rd(),yb=rd();
26         printf("%lld\n",1ll*(xb-xa)*(yb-ya)*2);
27         return 0;
28     }
29     long long ans=0;
30     for(int i=1;i<=n;i++)
31     {
32         m[i].xa=rd(),m[i].ya=rd(),m[i].xb=rd(),m[i].yb=rd();
33         ans+=1ll*(m[i].xb-m[i].xa)*(m[i].yb-m[i].ya)*2;
34     }
35     sort(m+1,m+n+1,cmp1);
36     for(int i=1;i<=n;i++)
37     {
38         for(int j=i+1;j<=n;j++)
39         {
40             if(m[j].xa>m[i].xb+1)break;
41             else if(m[j].xa==m[i].xb+1)
42             {
43                 int a=m[i].ya,b=m[i].yb,c=m[j].ya,d=m[j].yb;
44                 int mu=min(a,c),mmu=max(a,c),md=max(b,d),mmd=min(b,d);
45                 if(mmu>mmd+1){continue;}
46                 else if(mmu==mmd+1){ans++;continue;}
47                 ans+=(md-mu)<<1;
48                 ans-=(mmu-mu)<<1;ans-=(md-mmd)<<1;
49                 if(mu!=mmu)ans++;
50                 if(md!=mmd)ans++;
51             }
52             else if(m[j].xa<=m[i].xb)
53             {
54                 if(m[j].ya!=m[i].yb+1&&m[i].ya!=m[j].yb+1) continue;
55                 int a=m[i].xa,b=m[i].xb,c=m[j].xa,d=m[j].xb;
56                 int mu=min(a,c),mmu=max(a,c),md=max(b,d),mmd=min(b,d);
57                 //if(mmu>mmd+1){continue;}
58                 //else if(mmu==mmd+1){ans++;continue;}
59                 ans+=(md-mu)*2;
60                 ans-=(mmu-mu)*2;ans-=(md-mmd)*2;
61                 if(mu!=mmu)ans++;
62                 if(md!=mmd)ans++;
63             }
64         }
65     }
66     printf("%lld\n",ans);
67 }
68 /*
69 g++ 1.cpp -o 1
70 ./1
71 10
72 1 8 8 9
73 0 3 10 7
74 0 0 7 0
75 0 2 9 2
76 4 10 8 10
77 10 0 10 2
78 0 10 0 10
79 8 0 9 1
80 0 8 0 9
81 9 8 10 8
82 */
View Code

相关文章: