zoukankan      html  css  js  c++  java
  • Topcoder SRM 698 题解

    D1L1

    • 枚举分界点。
    • 拆成两个串,然后就是个类似于LCS的DP了。
    #include <iostream>
    #include <cstring>
    using namespace std;
    const int INF = 1e9+7;
    int dp[102][102];
    struct RepeatString {
        int minimalModify(string s) {
            int len = s.length();
            string s1,s2;
            int ans = INF;
            for(int i=0;i<len;i++) {
                // [0,i)[i,len)
                s1 = "?", s2 = "!";
                for(int j=0;j<i;j++)   s1+=s[j];
                for(int j=i;j<len;j++) s2+=s[j];
                
                int len1 = s1.length();
                int len2 = s2.length();
                
                dp[0][0] = 0;
                for(int j=1;j<len1;j++) dp[j][0] = j;
                for(int j=1;j<len2;j++) dp[0][j] = j;
                for(int j=1;j<len1;j++) {
                    for(int k=1;k<len2;k++) {
                        dp[j][k] = INF;
                        dp[j][k] = min(dp[j-1][k]+1, dp[j][k]);
                        dp[j][k] = min(dp[j][k-1]+1, dp[j][k]);
                        if (s1[j] == s2[k])
                            dp[j][k] = min(dp[j-1][k-1], dp[j][k]);
                        else
                            dp[j][k] = min(dp[j-1][k-1]+1, dp[j][k]);
                    }
                }
                ans = min(ans, dp[len1-1][len2-1]);
            }
            return ans;
        }
    } T;
    

    D2L2

    • 正难则反,考虑一下不想交的pair有多少个。
    • 注意到两个不相交的凸多边形,内公切线条数=2[很神妙的性质]
    • 枚举切线即可。
    #include <iostream>
    #include <vector>
    using namespace std;
    const int MOD = 1000000007;
    typedef long long LL;
    LL p[102], c[102][102];
    struct IntersectingConvexHull {
        void init() {
            p[0]=1;
            for(int i=1;i<102;i++) p[i]=p[i-1]*2LL%MOD;
            c[0][0]=1; for(int i=1;i<102;i++) c[i][0]=1;
            for(int i=1;i<102;i++)
                for(int j=1;j<=i;j++)
                    c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD;
        }  
    
        int count(vector<int> x, vector<int> y) {
            init();
            LL ans = 0;
            int n = x.size();
            for (int i=6;i<=n;i++) {
                for (int j=3;j<=i-3;j++) {
                    ans = (ans + c[n][i] * c[i][j] % MOD) % MOD;
                }
            }
    
            for (int i=0;i<n;i++)
            for (int j=i+1;j<n;j++) {
                int up = 0, down = 0;
                for(int k=0;k<n;k++) if (k!=i && k!=j){
                    if ( (LL)(x[i]-x[j])*(y[i]-y[k]) < (LL)(y[i]-y[j])*(x[i]-x[k]) )
                        up ++;
                    else
                        down ++;
                }   
                //printf("Point (%d,%d)-(%d,%d)
    ", x[i],y[i],x[j],y[j]);
                //printf("%d %d (%d*%d)
    ", up, down,(p[up] - 1 - up),(p[down] - 1 - down));
    
                ans = ans - 2 * (p[up] - 1 - up) * (p[down] - 1 - down) % MOD;
                ans = (ans % MOD + MOD) % MOD;  
            }
            cout << ans << endl;
            return ans;
        }
    } T;
    

    D1L3

    咕咕咕

  • 相关阅读:
    Luogu-P1404 平均数
    树的直径与重心
    卡常技巧
    背包问题总结
    Codevs-1521 华丽的吊灯
    区间dp与环形dp
    Luogu-P1308 神经网络
    拓扑排序
    01分数规划
    Python学习 4day__基础知识
  • 原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9119892.html
Copyright © 2011-2022 走看看