AIM Tech Round 5 (codeforces上题目编号是1028)(A-E)
---完全被这次比赛打击,自己真的很渣---
战况
- 依旧3题选手
- 被构造题坑得好惨
- 稍稍涨了rating,希望下次比赛好好准备进入蓝名,就可以被div1虐了
题目看题解也很难懂呀
A. Find Square
水题,找出矩形得中心,可以略过
B. Unnatural Conditions
题意:
- s(A)代表数字A各个数位之和即s(1234)=1+2+3+4=10
- 给出 m,n,需要求出满足条件A,B;s(A)>=m,s(B)>=m,s(A+B)<=n
- 自己也是想了一会才知道是构造题目(毕竟没经验),但我一直蜜汁自信构造这s(A)=m,s(B)=m但min(s(A+B))的情况
- 实际上s(A),s(B)的大小和s(A+B)完全没有相关性,s(A),s(B)都可以无限大,s(A+B)最小可以是1
- so 就是这样呀:
- A=55555555555555555555555555555555555
- B=44444444444444444444444444444444445
这样一想已变成水题(连读入都不需要读了),代码略
C. Rectangles
题意
- 给k个矩形,找出任意(k-1)个矩形相交区域的点(即相交区域任一点即可)
- 程序的判定大概是这样应该是算出所有(k-1)个相较矩形的并,然后判定我们输出的点是否在这些区域内
- 我的做法不同于标程,我是按照之前比赛的求线段(k-1)交的题目方法做的
- 将其看作两维情况,同时抽掉一个矩形,观察影响x轴线段并和y轴线段并,如果还有区间,输出即可
- 我的程序时间复杂度是O(nlogn)(需要排序),但其实可以优化因为只需有的最小值,次小值,最大值和次大值,这样就是O(n)
- 标答的做法是采用前缀最大预处理前缀最大并区域和后缀最大并区域(真的是很聪明的方法)
这里只给出我的做法
代码
#include
using namespace std;
const int maxn=140000;
int xl[maxn];
int xr[maxn],yd[maxn],yu[maxn];
int tmpx1[maxn],tmpx2[maxn],tmpy1[maxn],tmpy2[maxn];
bool help(int x,int y,int x1,int x2,int y1,int y2){
return (x>=x1&&x<=x2)&&(y>=y1&&y<=y2);
}
int main(){
int x1,y1,x2,y3;
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d %d %d %d",&xl[i],&yd[i],&xr[i],&yu[i]);
tmpx1[i]=xl[i];tmpx2[i]=xr[i];tmpy1[i]=yd[i];tmpy2[i]=yu[i];
}
//printf("db raed over\n");
sort(xl+1,xl+1+n);
sort(xr+1,xr+1+n);
int tl=xl[n],tr=xr[1];
sort(yd+1,yd+1+n);
sort(yu+1,yu+1+n);
int td=yd[n],tu=yu[1];
for(int i=1;i<=n;i++){
int tl=xl[n],tr=xr[1];
int td=yd[n],tu=yu[1];
//printf("db1:%d %d %d %d %d\n",i,tl,tr,td,tu);
if(tmpx1[i]==xl[n]) tl=xl[n-1];
if(tmpx2[i]==xr[1]) tr=xr[2];
if(tmpy1[i]==yd[n]) td=yd[n-1];
if(tmpy2[i]==yu[1]) tu=yu[2];
//printf("db2:%d %d %d %d %d\n",i,tl,tr,td,tu);
if(tr>=tl&&tu>=td){
//printf("db:%d %d %d %d %d\n",i,tl,tr,td,tu);
printf("%d %d\n",tl,td);
return 0;
}
}
return 0;
}
D. Order book
题意
#include
using namespace std;
#define ll long long
int n;
ll modv=1e9+7;
ll p;
char str[10];
set s;
ll lo=-1e9,hi=1e9;
ll ans=1;
int main(){
scanf("%lld",&n);
s.insert(lo);s.insert(hi);
for(ll i=1;i<=n;i++){
scanf("%s %lld",str,&p);
if(str[1]=='D'){
s.insert(p);
}
else{
if(phi){printf("0\n");return 0;}
if(p>lo&&p
E. Restore Array(毒瘤构造题,不过很多人都构造出来了,是我太渣,还是自己见识太少)
题意
#include
using namespace std;
#define ll long long
const ll N=200005;
ll a[N];
ll b[N];
int mod(int a,int p){
if(a%p==0) return p;
else return a%p;
}
int main(){
ll n;
cin>>n;
ll minv=INT_MAX,maxv=INT_MIN;
for(ll i=1;i<=n;i++){
scanf("%d",a+i);
minv=min(a[i],minv);
maxv=max(a[i],maxv);
}
if(minv==maxv){
//maybe No
if(minv==0){
//construct same
printf("Yes\n");
for(int i=1;i<=n;i++){
printf("%lld ",(ll)1);
}
}
else{
printf("No\n");
}
}
else{
int maxindex=-1;
a[0]=a[n];
for(ll i=1;i<=n;i++){
if(a[i]==maxv&&a[i-1]=1;i--){
//b[(i+maxindex)%n]=b[(i+1+maxindex)%n]+a[(i+maxindex)%n];
b[mod(i+maxindex,n)]=b[mod(i+1+maxindex,n)]+a[mod(i+maxindex,n)];
}
printf("Yes\n");
for(int i=1;i<=n;i++){
printf("%lld ",b[i]);
}
}
return 0;
}
求下一次蓝名啊,我要打div1!!!!