2020牛客寒假演算法基礎集訓營3

2021-10-02 16:42:31 字數 2630 閱讀 6353

考慮線段樹分治。區間[l,r]裡的貢獻分為 1、l~mid的貢獻。2、r~mid的貢獻。3、經過mid的貢獻。對於第三種我們在維護當前區間的時候就可以直接for整個區間計算得到。前面兩種通過遞迴繼續計算。線段樹正好是儲存分治的過程。

#include #include #include #include #include #include #include #include #include #include #define ll long long

#define inf 0x3f3f3f3f

#define mod 1000000007

using namespace std;

const int maxn = 51111;

const int inf = 0x3f3f3f3f;

const double eps = 1e-6;

const int maxn=100010;

typedef long long ll;

char s[maxn];

struct seg

tree[maxn<<2];

ll ans=0;

void build(int rt,int l,int r)

}for(int i=mid+1;i<=r;i++)

}build(rt<<1,l,mid);

build(rt<<1|1,mid+1,r);

}void update(int rt,int pos,int val)

else

}int main()

return 0;

}

按位考慮,對於第k位的貢獻是[l1,r1]區間裡在第k位為1的數的數量*區間[l2,r2]裡第k位為0的數的數量+[l1,r1]裡第k位為0的數的數量*[l2,r2]裡第k位為1的數的數量,這個結果在乘2的k次方就是所有數在第k位的貢獻。找數的數量可以數字dp。(取模要注意,很容易錯)

#include #include #include #include #include #include #include #include #include #include #define ll long long

#define inf 0x3f3f3f3f

#define mod 1000000007

using namespace std;

const int maxn = 51111;

const int inf = 0x3f3f3f3f;

const double eps = 1e-6;

const int maxn=100010;

typedef long long ll;

ll dp[100][70][2];

int a[100];

ll dfs(int pos,bool limit,int k,bool flag)

ll divs(ll x,int k)

ll inv(ll x,ll md)

return ans;

}int main()

ll res=ans*inv(((r1-l1)%mod)*((r2-l2)%mod)%mod,mod)%mod;

printf("%lld\n",res);

}return 0;

}

圖的點數最多是200,那麼一次最長的步長就是200,每次應該都是可以從前200個點裡轉移過來的。小於200時dp[i]初始化為-inf是為了防止有些點是走不到的,不能從**轉移過來。

#include #include #include #include #include #include #include #include #include #include #define ll long long

#define inf 0x3f3f3f3f

#define mod 1000000007

using namespace std;

const int maxn = 51111;

const int inf = 0x3f3f3f3f;

const double eps = 1e-6;

const int maxn=100010;

typedef long long ll;

int dist[110][110];

ll dp[maxn];

ll premax=0;

struct node

a[maxn];

int main()

}for(int i=1;i<=m;i++)

for(int k=1;k<=n;k++)}}

int k;

scanf("%d",&k);

for(int i=1;i<=k;i++) scanf("%lld %d %lld",&a[i].ti,&a[i].pi,&a[i].val);

sort(a+1,a+k+1,(const node &a,const node &b)

else dp[i]=-inf;

for(int j=1;j<=200&&i-j>=0;j++)

ans=max(ans,dp[i]);

}printf("%lld\n",ans);

return 0;

}

2020牛客寒假演算法基礎集訓營

長期更新,補完為止 2 g 判正誤 題意 t組資料。判斷a d b e c f是否等於g。1e9 a,b,c,g 1e9,0 d,e,f 1e9。保證不會出現指數和底數同為 0 的情況。思路 硬算會tle或mle。快速冪取模,為了增加過題概率,多取幾個模數判斷。includeusing namesp...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...

2020牛客寒假演算法基礎集訓營1

h題 突然發現h題可以用好多種方法做的。方法一 雙指標,維護乙個修改次數小於等於k的區間 include using namespace std typedef long long ll const int mod 1e9 7 const int n 1e5 5 const int inf 0x3f...