又是一场扔分的考试,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 */