zoukankan      html  css  js  c++  java
  • Summer training round2 #5 (Training #21)

    A:正着DFS一次处理出每个节点有多少个优先级比他低的(包括自己)作为值v[i] 求A B 再反着DFS求优先级比自己高的求C

    #include <bits/stdc++.h>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define EPS 1.0e-9
    #define PI acos(-1.0)
    #define INF 30000000
    #define MOD 1000000007
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define pai pair<int,int>
    //using ll = long long;
    //using ull= unsigned long long;
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn=5005;
    int value[maxn];
    int number[maxn];
    vector<int> pe[maxn];
    vector<int> pe2[maxn];
    //queue<int> que;
    void dfsgo(int x)
    {
     number[x]++;
     int len=pe2[x].size();
     for(int i=0;i<len;i++)
     {
            if(!value[pe2[x][i]])
            {
            value[pe2[x][i]]=1;
            dfsgo(pe2[x][i]);
            }
     }
    }
    void dfsback(int x)
    {
     number[x]++;
     int len=pe[x].size();
     for(int i=0;i<len;i++)
     {
            if(!value[pe[x][i]])
            {
            value[pe[x][i]]=1;
            dfsback(pe[x][i]);
            }
     }
    }
    int main()
    {
     int a,b,e,p;
     int anser1=0;
     int anser2=0;
     int anser3=0;
     cin >> a >> b >> e >> p;
     mem(value,0);
     mem(number,0);
     int now,to;
     for(int i=1;i<=p;i++)
     {
            scanf("%d %d",&now,&to);
            pe[now].pb(to);
            pe2[to].pb(now);
     }
     for(int i=0;i<e;i++)
     {
            mem(value,0);
            value[i]=1;
            dfsgo(i);
     }
     //for(int i=0;i<e;i++)
     //cout<<number[i]<<" ";
     //cout<<endl;
     for(int i=0;i<e;i++)
    {
     int curr=number[i];
     if(e-curr<a)
     anser1++;
     if(e-curr<b)
     anser2++;
    }
     mem(number,0);
     for(int i=0;i<e;i++)
     {
            mem(value,0);
            value[i]=1;
            dfsback(i);
     }
    
     for(int i=0;i<e;i++)
     if(number[i]>b)
     anser3++;
     cout<<anser1<<endl<<anser2<<endl<<anser3;
    }
    View Code

    C:哈夫曼树做法

    D:签到题 直接暴力

    E:递推DP

    #include <bits/stdc++.h>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define EPS 1.0e-9
    #define PI acos(-1.0)
    #define INF 30000000
    #define MOD 1000000007
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define pai pair<int,int>
    //using ll = long long;
    //using ull= unsigned long long;
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que;
    typedef long long ll;
    typedef unsigned long long ull;
    ll mod=2147483647;
    int a[2005];
    ll ans[2010][2010];
    ll anser=0;
    int main()
    {
     int n;
     while(~scanf("%d",&n))
     {
     //mem(ans,0);
     anser=0;
     int x;
     ll minn;
     ll maxn;
     ll now;
     for(int i=0;i<=n;i++)
     scanf("%d",&a[i]);
     ans[1][a[0]]=1;
     for(int i=2;i<=n;i++)
            for(int j=1;j<=n+1;j++)
            {
            minn=min(a[i-1],j);
            maxn=max(a[i-1],j);
            now=a[i];
            if(now>minn)
            {
            ans[i][minn]=(ans[i][minn]+ans[i-1][j])%mod;
            }
            if(now<maxn)
            {
            ans[i][maxn]=(ans[i][maxn]+ans[i-1][j])%mod;
            }
            }
     for(int i=1;i<=n+1;i++)
     anser+=ans[n][i];
     cout<<anser%mod<<endl;
     }
    }
    View Code

    F!:网络流

    G:SG函数

    H:问区间[x,y]中有多少数的二进制表示是ABAB..AB型或者A型的,其中A是n个1,B是m个0,n,m>0  直接暴力

    J:凸包+扫描线+二分

    给出l个大点和s个小点,问有多少小点被三个大点组成的三角形覆盖 

    #include <bits/stdc++.h>
    #define MN 10010
    #define pi acos(-1.0)
    using namespace std;
    typedef long long LL;
    
    struct Point {
        LL x, y;
    
        Point(LL x = 0, LL y = 0) : x(x), y(y) {}
    
        bool operator<(const Point &rhs) const { return x < rhs.x || (x == rhs.x && y < rhs.y); }
    
        Point operator-(const Point &rhs) const { return Point(x - rhs.x, y - rhs.y); }
    
        LL operator^(const Point &rhs) const { return x * rhs.y - y * rhs.x; }
    } a[MN], p[MN];
    
    int n, tot;
    
    void ConvexHull() {
        sort(a + 1, a + 1 + n);
        tot = 0;
        for (int i = 1; i <= n; i++) {
            while (tot > 1 && ((p[tot - 1] - p[tot - 2]) ^ (a[i] - p[tot - 2])) <= 0)tot--;
            p[tot++] = a[i];
        }
        int k = tot;
        for (int i = n - 1; i > 0; i--) {
            while (tot > k && ((p[tot - 1] - p[tot - 2]) ^ (a[i] - p[tot - 2])) <= 0)tot--;
            p[tot++] = a[i];
        }
        if (n > 1)tot--;
    }
    
    bool Judge(Point A) {
        int l = 1, r = tot - 2, mid;
        while (l <= r) {
            mid = (l + r) / 2;
            LL a1 = (p[mid] - p[0]) ^ (A - p[0]);
            LL a2 = (p[mid + 1] - p[0]) ^ (A - p[0]);
            if (a1 >= 0 && a2 <= 0) {
                if (((p[mid + 1] - p[mid]) ^ (A - p[mid])) >= 0)return true;
                return false;
            } else if (a1 < 0) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return false;
    }
    
    int s, ans = 0;
    
    int main() {
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;;
        ConvexHull();
        cin >> s;
        Point t;
        for (int i = 1; i <= s; i++) {
            cin >> t.x >> t.y;
            if (Judge(t)) ans++;
        }
        printf("%d", ans);
        return 0;
    }
    View Code
  • 相关阅读:
    基因id转换
    Trinity的分步运行
    免费的稳定的SVN托管的服务器
    游戏化
    一个华裔男孩在美国的成长之路
    你懂USB和Type-C吗
    ios调试小技巧
    swift开发笔记19
    iOS 3DTouch应用
    iCloud实现APP多设备数据同步
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7309253.html
Copyright © 2011-2022 走看看