contest 1.13

A.发财兔1A

O(nlogn)

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
typedef long long ll;
using namespace std;
 
ll n,num;
ll a[1000005];
ll b[1000005];
ll cnt[1000005];
 
ll getid(ll x){
  return lower_bound(b+1,b+1+num,x)-b;
}
 
int main()
{
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        b[i]=a[i];
    }
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    num=unique(b+1,b+1+n)-(b+1);
    for(ll i=1;i<=n;i++){
        ll id=getid(a[i]);
        cnt[id]++;
    }
    ll ans=0;
    for(ll i=1;i<=n;i++){
        ll now=1;
        while(now<=2*a[n]){
            if(now<a[i]||now-a[i]<a[i]) {now*=2;continue;}
            ll id=getid(now-a[i]);
            if(b[id]==now-a[i]){
              ans+=cnt[id];
              if(now-a[i]==a[i]) {ans--;cnt[getid(a[i])]--;}
            }
            now*=2;
        }
    }
    printf("%lld
",ans);
    return 0;
}
 
View Code

C.发财兔1C

树状数组+前缀和差分

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#define lowbit(x) x&(-x)
typedef long long ll;
using namespace std;

int n,m;
int a[1000005],A[1000005];
ll c[1000005];
map<int,int> last;

struct Query{
  int l,r,id;
  ll ans;
}q[1000005];

bool cmp1(Query a,Query b){
  return a.r<b.r;
}

bool cmp2(Query a,Query b){
  return a.id<b.id;
}

void add(int pos,int val){
  for(int i=pos;i<=n;i+=lowbit(i)) c[i]^=val;
}

ll getsum(int pos){
  ll ret=0;
  for(int i=pos;i>0;i-=lowbit(i)) ret^=c[i];
  return ret;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        A[i]=A[i-1]^a[i];
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&q[i].l,&q[i].r);
        q[i].id=i;
    }
    sort(q+1,q+1+m,cmp1);
    int now=1;
    for(int i=1;i<=n;i++){
        if(last[a[i]]) add(last[a[i]],a[i]);
        last[a[i]]=i;
        add(i,a[i]);
        while(now<=m&&q[now].r<=i){
            int l=q[now].l,r=q[now].r;
            q[now].ans=(A[r]^A[l-1])^(getsum(r)^getsum(l-1));
            now++;
        }
    }
    sort(q+1,q+1+m,cmp2);
    for(int i=1;i<=m;i++){
        printf("%lld
",q[i].ans);
    }
    return 0;
}
View Code

E.bomb

暴力

#include <iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
 
map<double,int> mp;
 
struct Node{
  int x,y;
}node[1205];
 
double getk(Node a,Node b){
  double x=a.x-b.x;
  double y=a.y-b.y;
  if(y==0) return 0;
  else if(x==0) return inf;
  else return y*1.0/(x*1.0);
}
 
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&node[i].x,&node[i].y);
    }
    int ans=1;
    for(int i=1;i<=n;i++){
        int cnt=1;
        mp.clear();
        for(int j=1;j<=n;j++){
            if(j==i) continue;
            double k=getk(node[i],node[j]);
            mp[k]++;
            cnt=max(cnt,mp[k]+1);
        }
        ans=max(ans,cnt);
    }
    printf("%d
",ans);
    return 0;
}
 
View Code

F.matrix

预处理+枚举

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;

char Map[5005][5005];
int cnt[5005][5005];
int vis[5005];

int main()
{
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",Map[i]+1);
    }
    for(int i=1;i<=n;i++){
        for(int j=m;j>=1;j--){
            if(Map[i][j]=='0') cnt[i][j]=0;
            else cnt[i][j]=cnt[i][j+1]+1;
            //printf("%d
",cnt[i][j]);
        }
    }
    int ans=0;
    for(int i=1;i<=m;i++){
        memset(vis,0,sizeof(vis));
        for(int j=1;j<=n;j++){
            vis[cnt[j][i]]++;
        }
        int all=0;
        for(int j=n;j>=1;j--){
            all+=vis[j];
            ans=max(ans,j*all);
        }
    }
    printf("%d
",ans);
    return 0;
}
View Code
转载请注明出处:https://www.cnblogs.com/lllxq/
原文地址:https://www.cnblogs.com/lllxq/p/10263221.html