ACM-ICPC 2015 ChangChun

时间:2021-02-15 16:20:20

比赛链接 :点击这里

大概会写 F G J L 吧

F

给你一个序列 最多删除一个数使他构成 最长不上升或者不下降子序列

这题不会不会on的算法只能 t*n*logn 了 还是压常过

求两次 LIS

#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define ll int
int a[maxn],b[maxn],c[maxn];
int n;
inline ll read()
{
    ll x=,f=;char ch=getchar();
    '){
        ;ch=getchar();
    }
    '){
        x=x*+ch-';ch=getchar();
    }return x*f;
}
int bin(int l,int r,int x){
   while(l<=r){
      ;
      if(b[mid]>=x){
         r=mid-;
      };
   }
   return l;
}
int work(){
   memset(b,,sizeof(b));
   ;
   ;j<n;j++){
      ]){
         b[len++]=a[j];
      }else{
        ,len,a[j]+);
        b[i]=a[j];
      }
     // for(int j=1;j<=len;j++){
     //   cout<<b[j]<<" ";
     // }
      //cout<<endl;
   }
   ;
}
int main(){
  int t;
  cin>>t;
  while(t--){
     n=read();
     ,mx=;
     ;j<n;j++){
       a[j]=read();
     }
     int len=work();
     reverse(a,a+n);
     int len1=work();
     )||len1>=n-){
        printf("YES\n");
     }else printf("NO\n");
  }
  ;
}

G 只有4个点才能组成一个正四边形

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
;
;
;
;
];
int main()
{
    int  t,i,j,n,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        ;i<n;i++)
            scanf("%d%d",&x[i],&y[i]);
        )
        {
            puts("NO");
            continue;
        }
        ;i<n;i++)
            ;j<i;j++,k++)
                L[k]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
        sort(L,L+);
        ]==L[]&&L[]==L[]&&L[]==L[]&&L[]==L[]&&L[]!=L[])
            puts("YES");
        else
            puts("NO");
    }
    ;
}

J

字典树

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000100
#define LL long long
LL a[maxn];
struct ac{
   LL x,nex[];
   void init(){
     x=;
     memset(nex,,sizeof(nex));
   }
}tre[maxn];
LL tot,n;
void init(){
   memset(tre,,sizeof(tre));
   tot=;
}
void add(LL x){
   LL k=;
   tre[k].x++;
   ;j>=;j--){
      <<j))&x);
      ){
         tre[k].nex[fa]=++tot;
         tre[tot].init();
      }
      k=tre[k].nex[fa];
      tre[k].x++;
   }
}
void del(LL x){
   LL k=;
   tre[k].x--;
   ;j>=;j--){
      <<j))&x);
      k=tre[k].nex[fa];
      tre[k].x--;
   }
}
LL query(LL x){
  LL k=,ans=;
  ;j>=;j--){
     <<j))&x);
     ]&&tre[tre[k].nex[fa^]].x>){
        ans+=1LL*(<<j);
        k=tre[k].nex[fa^];
     }else k=tre[k].nex[fa];
  }
  return ans;
}
int main(){
   LL t;
   cin>>t;
   while(t--){
      cin>>n;
      init();
      ;j<n;j++){
         scanf("%d",&a[j]);
         add(a[j]);
      }
      LL mx=;
      ;j<n;j++){
         ;k<n;k++){
            del(a[j]);
            del(a[k]);
            mx=max(mx,query(a[j]+a[k]));
            add(a[j]);
            add(a[k]);
         }
      }
      cout<<mx<<endl;
   }
}

L

Select Code
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
int a[maxn][maxn];
int main(){
   int t;
   cin>>t;
   while(t--){
      ,ans=;
      cin>>n>>m;
      ;j<=n;j++){
         ;k<=m;k++){
            cin>>a[j][k];
            mx=max(mx,a[j][k]);
            if(a[j][k]){
               ans+=a[j][k]*+;
            }
         }
      }
      ;j<=n;j++){
         ;k<=m;k++){
            ][k],a[j][k]);
            ],a[j][k]);
            ans-=z*;
            ans-=zz*;
         }
      }
      cout<<ans<<endl;
   }
   ;
}