2018-04-03 查漏补缺

优雅的暴力-莫队
莫队专题

A 区间不同个数的多少

#include 
#include
#include
#include
using namespace std;
#define N 1000005
int n,m;
struct Node{
int a;int b;
int id;
}node[N];
int num[N];
int block;
bool cmp(struct Node a,struct Node b){

   if((a.a/block)==(b.a/block)){
    return a.bnode[i].a){
            l--;

        vis[num[l]]++;
        if(vis[num[l]]==1)
            t++;
    }

     while(rnode[i].b){
        vis[num[r]]--;
        if(vis[num[r]]==0)
            t--;
        r--;
    }
    ans[node[i].id]=t;
   }
   for(int i=1;i<=m;i++){

        printf("%d\n",ans[i]);

   }

    return 0;
}

C

因为没有快速读入 超时了。

#include
#include
#include
#include
#include
using namespace std;
#define N 1000005
typedef long long ll;
struct Node{
int a,b,k,id;}node[N];
vectorv[N];
int n,m;
int num[N];
int cn[N];
int en[N];
int block;
int c[N];
int mun[N];
int po[N];
int nn=1;
bool vis[N];
int nnum[N];
void add(int x){
   cn[mun[x]]++;
   c[cn[mun[x]]]++;
}
void del(int x){
    c[cn[mun[x]]]--;
    cn[mun[x]]--;
}
bool cmp(struct Node a,struct Node b){
    if(a.a/block==b.a/block)
        return a.bnode[i].a){
            l--;
            add(l);
        } while(rnode[i].b){
            del(r);
             r--;
        }
       en[node[i].id]=c[node[i].k];
    }
    for(int i=1;i

没有强制转换成long long wa了2小时,心口子痛 T T ,以后一定不要犯了
求区间的组合数
I

#include
#include
#include
#include
using namespace std;
#define N 100005
typedef long long ll;
struct Node{
int a,b,id;}node[N];
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
int num[N];
int cn[N];
ll ans=0;
ll en[N];
ll ff[N];
int n,m;
void add(int x){
   cn[num[x]]++;
   if(cn[num[x]]>1){
    ans+=cn[num[x]]-1;
   }
}
void del(int x){
    if(cn[num[x]]>1)
    {
        ans-=cn[num[x]]-1;
    }
    cn[num[x]]--;
}
int block;
bool cmp(struct Node a,struct Node b){

    if(a.a/block==b.a/block){
        return a.bnode[i].a){
            l--;
            add(l);
        } while(rnode[i].b){
            del(r);
             r--;
        }
        en[node[i].id]=ans;
        ff[node[i].id]=ll(node[i].b-node[i].a+1)*(node[i].b-node[i].a)/2;
    }
    for(int i=1;i

你可能感兴趣的:(2018-04-03 查漏补缺)