zoukankan      html  css  js  c++  java
  • day 2 数学基础+数据结构

    好吧,实际上好多我也不会

    质数

    bool is_prime(int n)
    {
        if(n<2) return flase;
        for(int i=2;i<=sqrt(n);i++)
        if(n%i==0) return flase;
        return true;
        }
        
    
    

    质数筛

    基本上用欧式晒

    void prime(int n)
    {
    	memset(v,0,sizeof(v));
    	for(int i=2;i<=n;i++)
    	{
    		if(v[i]) continue;
    		cout<<i<<endl;
    		for(int j=2;j<=n/i;j++) v[i*j]=1;
    	}
    }
    

    剩下的估计初赛也不考

    数据结构

    并查集

    int find(int x)
    {
    	if(x==fa[x])return  fa[x];
    	return fa[x]=get(fa[x]);
    }
    
    void merge(int x,int y)
    {
    	fa[get(x)]=get(y);
    }
    

    另外还有扩展与,边带全
    在我博客,不再重复

    树状数组

    #include<bits/stdc++.h>
    using namespace std;
    inline long long read(){
        long long num=0;int z=1;char c=getchar();
        if(c=='-') z=-1;
        while((c<'0'||c>'9')&&c!='-') c=getchar();
        if(c=='-') z=-1,c=getchar();
        while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
        return z*num;
    }
    int m,n;
    int a;
    int tree[2000005];
    int lowbit(int x)
    {
        return x&-x;
    }
    long long add(int x,int k)
    {
        while(x<=n)
        {
            tree[x]+=k;
            x+=lowbit(x);
        }
    }
    long long ask(int x)
    {
        long long ans=0;
        while(x!=0)
        {
            ans+=tree[x];
            x-=lowbit(x);
        }
        return ans;
    }
    int main(){
        n=read();m=read();
        int last=0,now;
        for(int i=1;i<=n;i++)
        {
            now=read();
            add(i,now-last);
            last=now;
        }
        for(int i=1;i<=m;i++)
        {
            int o,x,y,k;
            o=read();
            if(o==1)
            {
                x=read();y=read();k=read();
                add(x,k);
                add(y+1,-k);//区间
            }
            else{
                x=read();
                cout<<ask(x)<<endl;
            }
        }
        return 0;
    }
    

    逆序对

    楼兰图图,很经典

    for(int i=n;i;i--)
    {
    	ans+=ask(a[i]-1);
    	add(a[i],1);
    }
    
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define ll long long
    using namespace std;
    const int N = 200006;
    int n, a[N], c[N], l[N], r[N];
    
    int ask(int x) {
        int ans = 0;
        while (x) {
            ans += c[x];
            x -= x & -x;
        }
        return ans;
    }
    
    void add(int x, int y) {
        while (x <= n) {
            c[x] += y;
            x += x & -x;
        }
    }
    
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        memset(c, 0, sizeof(c));
        for (int i = n; i; i--) {
            r[i] = ask(a[i] - 1);
            add(a[i], 1);
        }
        memset(c, 0, sizeof(c));
        for (int i = 1; i <= n; i++) {
            l[i] = ask(a[i] - 1);
            add(a[i], 1);
        }
        ll ans = 0;
        for (int i = 1; i <= n; i++)
            ans += (ll)(n - i - r[i]) * (i - 1 - l[i]);
        cout << ans << " ";
        ans = 0;
        for (int i = 1; i <= n; i++) ans += (ll)r[i] * l[i];
        cout << ans << endl;
        return 0;
    }
    
    作者:ruanmowen
    链接:https://www.acwing.com/activity/content/code/content/323834/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    线段树

    注意4倍空间

    struct segmentTree
    {
    	int l,r;
    	int dat;
    }t[SIZE*4];
    
    void build(int p,int l,int r)
    {
    	t[p].l=l,t[p].r=r;
    	if(l==r) {
    		t[p].dat=a[l];return ;
    	}
    	int mid=l+r>>1;
    	build(p*2,l,mid);
    	build(p*2+1,mid+1,r);
    	t[p].dat=t[p*2+1].dat+t[p*2].dat;
    }
    
    build(1,1,n);
    
    void change(int p,int x,int v)
    {
    	if(t[p].l==t[p].r)
    	{
    		t[p].dat=v;return ;
    	}
    	int mid=t[p].l+t[p].r>>1;
    	if(x<=mid)change(p*2,x,v);
    	else change(p*2+1,x,v);
    	t[p].dat=t[p*2].dat+t[p*2+1].dat;
    }
    
    change(1,x,v); 
    
  • 相关阅读:
    java:输出流程printStream
    phalcon 连接多个数据库 phalcon multi-database
    Selenium Webdriver元素定位的八种常用方法
    adb push ,adb pull和adb install的区别
    Java将数据写进excel
    Java接口和抽象类的区别
    深入理解Java的接口和抽象类
    Java内存解析 程序的执行过程
    bit,byte,char,位,字节,字符 的区别
    java static成员变量方法和非static成员变量方法的区别 ( 二 )
  • 原文地址:https://www.cnblogs.com/ruanmowen/p/13763617.html
Copyright © 2011-2022 走看看