Comet OJ - Contest #8

     Comet OJ - Contest #8參賽總結——林蔭html

  1. 本人仍是一如既往的菜。
  2. Comet OJ - Contest #X屬於ACM賽制
  3. 六道題目難度從入門到金牌遞增

  本次總結給出T3,4分析與解法(5,6之後填坑)ios

  T3:符文能量c++

  • 1000ms,256MB
  1. 題目描述

    米薇女王萬萬沒有想到考德威爾男爵的真實意圖。她的腦海裏浮現出萊里亞的秀美山河,惋惜再也回不去了。數組

    不過所幸的是,她還有着軍隊和重整山河的勇氣。雷納德爲米薇女王呈上了 nnn 塊符文石。符文石能夠幫助你更好的戰鬥。每一個符文石擁有能量,米薇能夠挑選類型相近的符文石融合並釋放出能量。markdown

    形象的,咱們能夠把每一個符文石 PiP_iPi 描述成一個二元組 (ai,bi)(a_i,b_i)(ai,bi) 。對於兩個相鄰的符文石 PiP_iPiPi+1 P_{i+1}Pi+1,能夠把他們融合爲 (ai,bi+1)(a_i,b_{i+1})(ai,bi+1) 並釋放出 ai+1∗bia_{i+1}*b_iai+1bi 的能量。融合完的符文石會替換掉本來的兩個二元組,出如今他們的位置上。米薇但願把全部的 nnn 個符文石融合成 111 個符文石。你能夠以任意順序合併相鄰的兩個符文石。flex

    幸運的是,米薇找到了一個法力通天的術士,在所有融合過程前你能夠選擇一段連續的區間將裏面的符文石精煉。即把本來的一段二元組 (ai,bi)(a_i,b_i)(ai,bi) 乘 kkk 變爲 (ai⋅k,bi⋅k)(a_i \cdot k,b_i \cdot k)(aik,bik)。固然你也能夠不選擇任何區間。注意此操做必須在初始狀態進行。ui

    她但願她釋放的能量儘量小並想知道這個值是多少。spa

    你能夠結合樣例解釋來理解題目。code

     

  2. 輸入描述htm

    111 行 222 個整數 nnn 與 kkk 。 表明有 nnn 塊符文石,精煉符文石的倍率爲kkk。

    接下來 nnn 行,每行 222 個整數 aia_iaibib_ibi 。描述第 iii 個符文石的屬性。

    • 2≤n≤1052\leq n\leq 10^52n105
    • 0≤∣ai∣,∣bi∣,∣k∣≤2000 \leq |a_i|,|b_i|,|k|\leq 2000ai,bi,k200

    輸出描述

    一個整數,釋放能量的最小值

  3. 樣例輸入 1

    4 -1
    -1 -2
    2 3
    3 4
    -3 5
  4. 樣例輸出 1

    -25

  分析:提供一種和正解不沾邊的作法:觀察題目可知,所給入的參數a[1]和b[n]是不參與計算的。進而可得知若是不考慮精煉的話,原始式子的答案固定,即爲sum(i=1,i<n)a[i+1]*b[i]下面開始考慮精煉的狀況。

   手動推導式子能夠獲得一個神奇的發現:若是假設精煉的區間爲L,R,那麼答案就是a[2]*b[1]+a[3]*b[2]+a[4]*b[3]......+a[L-1]*b[L-2]+a[L]*b[L-1]*K+a[L+1]*b[L]*K^2+a[L+2]*b[L+1]*K^2.......a[R]*b[R-1]*K^2+a[R+1]*b[R]*K+a[R+2]*b[R+1].......

  而後這個問題就變成了求上述式子的最小值。

  那果斷DP啊。

  至於方程?狀態:DP[i][0]在1——i的區間內不使用精煉的最小值,DP[i][1]在1——i的區間內已經開始精煉,可是精煉未結束的最小值。DP[i][2]在1——i的區間內已經完成精煉的最小值

  

for(int i=1;i<n;i++)
    {
        dp[i][0]=dp[i-1][0]+sum[i];
        dp[i][1]=min(dp[i-1][0]+sum[i]*k,dp[i-1][1]+sum[i]*k*k);
        dp[i][2]=min(dp[i-1][1]+sum[i]*k,dp[i-1][2]+sum[i]);
    }

  標程放上!

#include<iostream>
#include<cstdio>
using namespace std;
long long int n,k,a1,a2;
long long int sum[100001];
long long int dp[100001][3];
int main()
{
    scanf("%lld%lld",&n,&k);
    scanf("%lld",&a1);
    for(int i=1;i<n;i++)
    {
        scanf("%lld%lld",&a1,&a2);
        sum[i]=a1*a2;
    }
    scanf("%lld",&a1);
    for(int i=1;i<n;i++)
    {
        dp[i][0]=dp[i-1][0]+sum[i];
        dp[i][1]=min(dp[i-1][0]+sum[i]*k,dp[i-1][1]+sum[i]*k*k);
        dp[i][2]=min(dp[i-1][1]+sum[i]*k,dp[i-1][2]+sum[i]);
    }
    cout<<min(dp[n-1][0],min(dp[n-1][2],dp[n-1][1]));
    return 0;
}

 T4

題目描述

 

菜菜太菜,但他不想種菜。

nnn 塊土地,每塊土地有一個菜值。它們之間有 mmm 條小路,每條鏈接兩塊土地,小路只能單向通行,不存在一條小路兩端鏈接同一塊土地,但可能存在兩條小路兩端鏈接的土地分別相同。若是存在一條從土地 uuu 到土地 vvv 的小路,則稱 uuu 能直接到達 vvv

菜菜能夠購買一些土地,他必須在其中選擇一塊建造本身的家,所購買的剩下的土地被做爲菜地。由於菜菜不想種菜,因此他但願從他家能直接到達的土地中,一塊菜地也沒有(若是菜菜家不能直接到達任何一塊土地,這也能知足他的願望)。

菜菜提出了 qqq 個問題,每一個問題給出 L,RL,RL,R ,詢問若是他購買了第 LLL 到第 RRR 塊之間的全部土地,那麼全部知足他願望的建造家的選址的菜值之和是多少?

 

輸入描述

 

111 行 333 個由空格隔開的整數 n,m,qn,m,qn,m,q ,分別表示土地的塊數、小路的條數和問題的個數。

222 行 nnn 個由空格隔開的整數,第 iii 個數 aia_iai 表示第 iii 塊土地的菜值。

接下來 mmm 行,每行 222 個由空格隔開整數 ui,viu_i,v_iui,vi,表示第 iii 條小路從第 uiu_iui 塊土地通向第 viv_ivi 塊土地。

接下來 qqq 行,每行 222 個由空格隔開整數 li,ril_i,r_ili,ri,表示菜菜第 iii 個問題中購買了 [li,ri][l_i,r_i][li,ri] 中的全部土地。

  • 1≤n,m,q≤1061\le n,m,q \le 10^61n,m,q106
  • 1≤ai≤3001\le a_i\le 3001ai300
  • 1≤ui,vi≤n,ui≠vi1\le u_i,v_i\le n,u_i\neq v_i1ui,vin,ui=vi
  • 1≤li≤ri≤n1\le l_i\le r_i\le n1lirin。

 

輸出描述

爲了不輸出量過大,設 ansians_iansi 表示第 iii 個詢問的答案。你只須要輸出 111 行 111 個整數 xori=1qi×ansi{\rm xor}_{i=1}^qi\times ans_ixori=1qi×ansi,即全部詢問的編號與答案的乘積依次按位異或 (c++中的64位整數^)的結果。

樣例輸入 1

4 2 2
3 5 10 6
1 4
2 3
2 3
1 3

樣例輸出 1

16

樣例輸入 2

5 6 3
114 29 219 231 165
5 4
1 2
1 3
5 3
3 2
3 4
2 2
1 2
4 5

樣例輸出 2

658
好吧我老實交待我考場上3,4都沒作出來,3還想了想,4壓根沒看
首先分析題目,發現只有當某塊地它左邊直接相連的土地爲L之外的點右邊爲R之外的點時,這塊土地才能夠做爲菜地
記這兩個直接相連的點爲xi,yi(若是不存在的話xi=0,yi=n+1),因此原題求對於每一組詢問[L,R],求出L<=I<=R且XI<L&&YI>R時的Val[i]之和
下面咱們生成六個神奇參數:a<=i<=b,c<=xi<=d,e<=yi<=f
這樣的話就能夠用6個神奇參數約束出每一種狀況,記做S(a,b,c,d,e,f)
答案即爲S(L,R,0,L-1,R+1,n+1),可是這個鬼東西不會算啊
不虛,咱能差分
S(L,R,0,L-1,R+1,n+1)=S(L,R,0,n+1,0,n+1)-S(L,R,L,n+1,0,n+1)-S(L,R,0,n+1,0,R)+S(L,R,L,n+1,0,R)

這樣的話就變成了一次枚舉兩個參數的二維數點二維數點有經典作法,將全部詢問離線,點和詢問按第一維排序,第二維做爲 下標,順次掃描,遇到一個點將它第二維對應的位置加上它的權值,遇到一個 詢問就查詢對應第二維的對應的區間和,只需一個支持單點加,區間求和的數 據結構,樹狀數組便可勝任。
相關文章
相關標籤/搜索