佳木斯集训Day7
毒瘤出题人!!!
T2的题面和样例不一样,所以我挂了(没错这就是我写模拟写挂了的理由)
T1 大水题,懒得解释了,五分钟AC
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll n; 5 int main() 6 { 7 cin>>n; 8 if(n<4) 9 { 10 cout<<"NO"<<endl; 11 return 0; 12 } 13 if(n%2==0) 14 { 15 cout<<"NO"<<endl; 16 return 0; 17 } 18 n--; 19 cout<<"1"<<" "<<(n-2)/2<<endl; 20 }
T2模拟
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,k,m,t,la,lb; 5 int main() 6 { 7 scanf("%d%d%d%d",&n,&k,&m,&t); 8 for(register int i=1;i<=t;i++) 9 { 10 scanf("%d%d",&la,&lb); 11 if(la==1) 12 { 13 if(n<m) 14 { 15 n++; 16 if(k>=lb) 17 { 18 k++; 19 } 20 } 21 } 22 if(la==0) 23 { 24 if(k<=lb) 25 { 26 n=lb; 27 } 28 else 29 { 30 k-=lb; 31 n-=lb; 32 } 33 } 34 printf("%d %d\n",n,k); 35 } 36 }
T3我想的是正解,不过打挂了,其实就是暴力枚举每两条平行线之间有多少条线与他们相交,记起点终点和长度判断就可以了,然后直接套一个公式,出结果
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 int n,sn,hn; 5 ll a,b,c,d,ans,num; 6 struct shu{ll x,y1,y2;}s[1050]; 7 struct heng{ll y,x1,x2;}h[1050]; 8 int xl,xr,sl,sr,yu,yd; 9 int main() 10 { 11 cin>>n; 12 for(int i=1;i<=n;i++){ 13 scanf("%lld%lld%lld%lld",&a,&b,&c,&d); 14 if(a==c){ 15 if(b>d)swap(b,d); 16 sn++; 17 s[sn].x=a; 18 s[sn].y1=b; 19 s[sn].y2=d; 20 continue; 21 } 22 if(a>c)swap(a,c); 23 hn++; 24 h[hn].y=b; 25 h[hn].x1=a; 26 h[hn].x2=c; 27 } 28 for(int i=1;i<=hn;i++){ 29 for(int j=i+1;j<=hn;j++){ 30 xl=max(h[i].x1,h[j].x1); 31 xr=min(h[i].x2,h[j].x2); 32 if(xl>=xr)continue; 33 num=0; 34 yu=min(h[i].y,h[j].y); 35 yd=max(h[i].y,h[j].y); 36 for(int k=1;k<=sn;k++){ 37 if(s[k].x>=xl&&s[k].x<=xr&&s[k].y1<=yu&&s[k].y2>=yd)num++; 38 } 39 ans+=num*(num-1)/2; 40 } 41 } 42 printf("%lld",ans); 43 44 }