t1 入陣曲
n的範圍很小,可以用n^3的方法解決。但是我一開始想的是線段樹維護矩陣的和,但是複雜度一直降不下來,還多乙個log,最後還沒有n^4的暴力高。
n^4暴力(70分):就是二維字首和,n^4列舉即可。
100分做法:
現預處理出二維字首和,然後枚舉行和列,列舉列可以直接變成少掉一維列舉,就是看是否能被整除,然後開乙個桶統計一下就可以了,複雜度n^3。
**如下:
#includeusingview codenamespace
std;
const
int maxn=505
;const
int nn=1e6+7
;int
a[maxn][maxn];
long
long
sum[maxn][maxn];
intn,m,k;
long
long
ans;
intcnt[nn];
intb[nn];
intmain()
for(int i=1;i<=n;i++)
for(int i=0;i)
for(int o=1;o<=m;o++) cnt[b[o]]=0
; }
}printf(
"%lld\n
",ans);
return0;
}
t2 將軍令
一看,這不是最小點覆蓋嗎,直接上樹形dp最小點覆蓋,結果最後wa的很慘。
正解:樹形dp(那是肯定的),只不過dp方程極其複雜,考慮有沒有簡單一點的方法,當然就是貪心。貪心的列舉每個點最多能覆蓋掉的點的個數打標記,用乙個堆來存,從深度深的點向它的第k祖先上打標記。看哪些點沒被覆蓋即可。如果沒被覆蓋,就增加乙個驛站。
**如下:
#includeusingview codenamespace
std;
const
int maxn=1e6+7
;struct
nodeedge[maxn*2
];int
head[maxn],cnt;
intdeg[maxn];
bool
vis[maxn];
void add(int x,int
y)priority_queue
int,int> >q;
intfa[maxn];
intdep[maxn];
inttot;
intn,m,k,x,y,t;
void dfs1(int
x) }
}void mark(int x,int f,int
dep)
}int getfa(int
x)
returnx;}
intmain()
fa[1]=1;dep[1]=1;dfs1(1
);
for(int i=1;i<=n;i++) q.push(make_pair(dep[i],i));
while(!q.empty())
printf(
"%lld\n
",tot);
return0;
}
t3 星空
輸出0,1,2,3運氣最好的是輸出2,有12分。
看k的範圍很小,就想是否可以狀壓處理,對於每次區間異或,可以將其轉化為差分的形式,維護乙個差分陣列,然後看差分陣列中每個不為0的點的位置所能到達的其他區間,預處理出他們之間的距離,bfs即可。然後就是狀壓dp。設dp[i]表示狀態為i時的最小步數,我們的最終狀態是燈全亮,就這樣dp下去求解即可。轉移方程也非常簡單。
**如下:
#includeusingview codenamespace
std;
const
int maxn=1e6+7
;const
int n=550
;int dis[20
][maxn];
inta[maxn],b[maxn];
intcha[maxn];
intn,k,m;
intcnt[maxn],num;
intx;
bool
vis[maxn];
long
long dp[1
<<20|1
];int
state[n][n];
void bfs(int x,int *dis)
y=u+b[i];
if(y<=n+1&&!vis[y])} }
}int
main()
for(int i=1;i<=m;i++) scanf("
%d",&b[i]);
for(int i=1;i<=n+1;i++) cha[i]=a[i]^a[i-1
]; memset(dis,
88,sizeof
(dis));
for(int i=1;i<=n+1;i++)
}memset(dp,
88,sizeof
(dp));
for(int i=1;i<=num;i++)
}dp[
0]=0
;
int maxx=1
<
for(int i=0;i)}}
}}
printf(
"%lld\n
",dp[maxx-1
]);
return0;
}
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...
NOIP模擬 項鍊
經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...
NOIP模擬 幻象
phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生 空格 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。等我比賽完之後,我們才知道 空格 是x2 所以比...