luoguP2615 神奇的幻方
模擬即可
#include<bits/stdc++.h>
using namespace std;
int n,tu[49][49];
void dfs(int x , int y , int now){
tu[x][y] = now;
if(now == n * n)return;
if(x == 1 && y != n)dfs(n , y + 1 , now + 1);
else if(x != 1 && y == n)dfs(x - 1 , 1 , now + 1);
else if(x == 1 && y == n)dfs(x + 1 , y , now + 1);
else if(x != 1 && y != n && tu[x - 1][y + 1] == (-1))dfs(x - 1 , y + 1 , now + 1);
else if(x != 1 && y != n && tu[x - 1][y + 1] != (-1))dfs(x + 1 , y , now + 1);
return;
}
int main(){
memset(tu , -1 , sizeof(tu));
cin>>n;
dfs(1, (n + 1) / 2 , 1);
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
cout<<tu[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
luoguP2661 信息傳遞
水題
拓撲刪邊找環dfs統計最大環
#include<bits/stdc++.h>
#define MAXN 200105
using namespace std;
int n,pre[MAXN],in[MAXN],minl,color[MAXN],zz;
void toop(){
queue<int>q;
for(int i = 1 ; i <= n ; i++)if(!in[i])q.push(i);
int now;
while(!q.empty()){
now = q.front();q.pop();
in[pre[now]]--;
if(!in[pre[now]])q.push(pre[now]);
}
return;
}
void dfs(int now , int tp){
zz++;
if(color[pre[now]] == tp)return;
color[now] = tp;
dfs(pre[now] , tp);
return;
}
int main(){
memset(color , -1 , sizeof(color));
memset(in , 0 , sizeof(in));
minl = MAXN * 25;
cin>>n;
for(int i = 1 ; i <= n ; i++)cin>>pre[i];
for(int i = 1 ; i <= n ; i++)in[pre[i]]++;
toop();
for(int i = 1 ; i <= n ; i++){
if(in[i] && color[i] == (-1)){
zz = 0;
dfs(i , i);
minl = min(minl , zz);
}
}
cout<<minl<<endl;
return 0;
}
luoguP2668 鬥地主
水題,直接dfs
注意優化就行了
#include<bits/stdc++.h>
using namespace std;
int T,n,pp[37],minl;
void dfs(int now , int rest){
if(now >= minl)return;
if(rest == 0){
minl = min(minl , now);
return;
}
if(now + 1 >= minl)return;
int hh = 0;
for(int i = 1 ; i <= 15 ; i++)hh = max(hh , pp[i]);
for(int i = 1 ; i <= 13 && hh >= 4 ; i++){
if(pp[i] != 4)continue;
pp[i] -= 4;
for(int j = 1 ; j <= 13 ; j++){
if(pp[j] < 2)continue;
pp[j] -= 2;
for(int k = j ; k <= 13 ; k++){
if(pp[k] < 2)continue;
pp[k] -= 2;
dfs(now + 1 , rest - 8);
pp[k] += 2;
}
pp[j] += 2;
}
for(int j = 1 ; j <= 15 ; j++){
if(pp[j] == 0)continue;
pp[j]--;
for(int k = 1 ; k <= 15 ; k++){
if(pp[k] == 0)continue;
pp[k]--;
dfs(now + 1 , rest - 6);
pp[k]++;
}
pp[j]++;
}
pp[i] += 4;
}
for(int i = 1 ; i + 1 <= 12 && hh >= 3 ; i++){
if(pp[i] >= 3 && pp[i + 1] >= 3){
for(int j = i + 1 ; pp[j] >= 3 && j <= 12 ; j++){
for(int k = i ; k <= j ; k++)pp[k] -= 3;
dfs(now + 1 , rest - (j - i + 1) * 3);
for(int k = i ; k <= j ; k++)pp[k] += 3;
}
}
}
for(int i = 1 ; i + 2 <= 12 && hh >= 2 ; i++){
if(pp[i] >= 2 && pp[i + 1] >= 2 && pp[i + 2] >= 2){
for(int j = i + 2 ; pp[j] >= 2 && j <= 12 ; j++){
for(int k = i ; k <= j ; k++)pp[k] -= 2;
dfs(now + 1 , rest - (j - i + 1) * 2);
for(int k = i ; k <= j ; k++)pp[k] += 2;
}
}
}
for(int i = 1 ; i + 4 <= 12 ; i++){
if(pp[i] && pp[i + 1] && pp[i + 2] && pp[i + 3] && pp[i + 4]){
for(int j = i + 4 ; pp[j] && j <= 12 ; j++){
for(int k = i ; k <= j ; k++)pp[k]--;
dfs(now + 1 , rest - (j - i + 1));
for(int k = i ; k <= j ; k++)pp[k]++;
}
}
}
for(int i = 1 ; i <= 13 && hh >= 3 ; i++){
if(pp[i] < 3)continue;
pp[i] -= 3;
for(int j = 1 ; j <= 13 ; j++){
if(pp[j] < 2)continue;
pp[j] -= 2;
dfs(now + 1 , rest - 5);
pp[j] += 2;
}
for(int j = 1 ; j <= 15 ; j++){
if(!pp[j])continue;
pp[j]--;
dfs(now + 1 , rest - 4);
pp[j]++;
}
pp[i] += 3;
}
if(pp[14] && pp[15]){
pp[14] = pp[15] = 0;
dfs(now + 1 , rest - 2);
pp[14] = pp[15] = 1;
}
int ak = 0;
for(int i = 1 ; i <= 15 ; i++){
if(pp[i] == 0)continue;
ak = pp[i];
pp[i] = 0;
dfs(now + 1 , rest - ak);
pp[i] = ak;
break;
}
return;
}
int main(){
cin>>T>>n;
while(T--){
minl = 99999999;
memset(pp , 0 , sizeof(pp));
for(int i = 1 ; i <= n ; i++){
int x,y;cin>>x>>y;
if(x == 1)pp[12]++;
else if(x == 2)pp[13]++;
else if(x == 0)pp[13 + y]++;
else pp[x - 2]++;
}
dfs(0 , n);
cout<<minl<<endl;
}
return 0;
}
luoguP2678 跳石頭
水題
#include<bits/stdc++.h>
#define MAXN 50005
typedef long long ll;
using namespace std;
ll L,l,r,mid,best,d[MAXN];
int n,m;
void init(){
cin>>L>>n>>m;
for(int i = 1 ; i <= n ; i++)cin>>d[i];
}
bool check(){
//ÿ´Î´Ó×ó±ßÍùÓÒ±ßÌø£¬Ê¹µÃ¾àÀëСÓÚmidµÄ»° ¾ÍÒÆ×ß
ll last = 0 , js = 0;
for(int i = 1 ; i <= n && js <= m ; i++){
if(d[i] - last < mid){js++;continue;}
last = d[i];
}
if(js > m)return 0;
else return 1;
}
void solve(){
l = 0 , r = L;best = (-1);
while(l <= r){
mid = (l + r) >> 1;
if(check())l = mid + 1 , best = mid;
else r = mid - 1;
}
cout<<best<<endl;
}
int main(){
init();
solve();
}
luoguP2679 子串
寫醜了,沒A掉
直接前綴和優化dp就好了
記得滾動數組清零
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,m,p;
ll mod = 1e9 + 7 , f[1505][55][55] , sum[1505][55][55];
char a[1005],b[205];
void init(){
memset(f , 0 , sizeof(f));
cin>>n>>m>>p;
for(int i = 0 ; i <= n ; i++)f[i][0][0] = 1;
scanf("%s" , a + 1);
scanf("%s" , b + 1);
}
void solve(){
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
for(int k = 1 ; k <= min(min(i , j) , p) ; k++){
for(int v = 0 ; v < i && v < j && a[i - v] == b[j - v] ; v++){
if(sum[i - 1][j - 1][k - 1] != 0){
f[i][j][k] = (sum[i - 1][j - 1][k - 1]) % mod;
break;
}
f[i][j][k] = (f[i][j][k] + f[i - v - 1][j - v - 1][k - 1]) % mod;
}
f[i][j][k] = (f[i][j][k] + f[i - 1][j][k]) % mod;
sum[i][j][k] = (f[i][j][k] + sum[i - 1][j - 1][k]) % mod;
}
}
}
cout<<f[n][m][p] % mod<<endl;
}
int main(){
init();
solve();
}
luoguP2680 運輸計劃
之前打的。。。。。(早知道我就不寫t3直接寫t2了。。。。這樣還有500)
#include<bits/stdc++.h>
#define MAXN 300005
using namespace std;
int n,m,tot,h[MAXN],w[MAXN],id[MAXN],ik[MAXN],ch[MAXN],dep[MAXN],sz[MAXN],dex,tp[MAXN],f[MAXN];
struct node{
int from,to,cost,next;
}e[MAXN << 1];
struct node2{
int color,maxl,lazy,sum;
}t[MAXN * 6];
void add(int x , int y , int z){
tot++;
e[tot].from = x;
e[tot].to = y;
e[tot].cost = z;
e[tot].next = h[x];
h[x] = tot;
}
int dfs(int now , int fa){
dep[now] = dep[fa] + 1;
sz[now] = 1;
f[now] = fa;
for(int i = h[now] ; i != (-1) ; i = e[i].next){
if(e[i].to == fa)continue;
dfs(e[i].to , now);
sz[now] += sz[e[i].to];
}
for(int i = h[now] ; i != (-1) ; i = e[i].next){
if(e[i].to == fa)continue;
ch[now] = (sz[ch[now]] < sz[e[i].to] ? e[i].to : ch[now]);
}
}
int dfs2(int now , int fa){
dex++;id[now] = dex;ik[dex] = now;
if(ch[now]){
tp[ch[now]] = tp[now];
dfs2(ch[now] , now);
}
for(int i = h[now] ; i != (-1) ; i = e[i].next){
if(e[i].to == fa || e[i].to == ch[now])continue;
tp[e[i].to] = e[i].to;
dfs2(e[i].to , now);
}
}
int build(int rt , int l ,int r){
t[rt].lazy = 0;
t[rt].color = 0;
if(l == r){
t[rt].sum = t[rt].maxl = w[l];
return 0;
}
int mid = (l + r) >> 1;
build(rt << 1 , l , mid);
build((rt << 1) | 1 , mid + 1 , r);
t[rt].maxl = max(t[rt << 1].maxl , t[(rt << 1) | 1].maxl);
t[rt].sum = t[rt << 1].sum + t[(rt << 1) | 1].sum;
}
int push_down(int rt , int l , int r){
if(t[rt].lazy == 0)return 0;
int mid = (l + r) >> 1;
t[rt << 1].color = t[rt].lazy;
t[(rt << 1) | 1].color = t[rt].lazy;
t[rt << 1].lazy = t[rt].lazy;
t[(rt << 1) | 1].lazy = t[rt].lazy;
t[rt].lazy = 0;
}
int cc(int rt , int l , int r , int x , int y , int z){
if(r < x || l > y)return 0;
if(x <= l && r <= y){
if(t[rt].color == (z - 1)){
t[rt].color = z;
t[rt].lazy = z;
}
return 0;
}
push_down(1 , l , r);
int mid = (l + r) >> 1;
cc(rt << 1 , l , mid , x , y , z);
cc((rt << 1) | 1 , mid + 1 , r , x , y , z);
}
//
int csum(int rt , int l , int r , int x , int y){
if(r < x || l > y)return 0;
if(x <= l && r <= y){
return t[rt].sum;
}
push_down(1 , l , r);
int mid = (l + r) >> 1 , zz = 0;
zz = zz + csum(rt << 1 , l , mid , x , y);
zz = zz + csum((rt << 1) | 1 , mid + 1 , r , x , y);
return zz;
}
//
int que(int rt , int l , int r , int x , int y , int z){
if(r < x || l > y)return 0;
if(x <= l && r <= y){
if(t[rt].color == z)return t[rt].maxl;
return 0;
}
push_down(1 , l , r);
int zz = 0 , mid = (l + r) >> 1;
zz = max(zz , que(rt << 1 , l , mid , x , y , z));
zz = max(zz , que((rt << 1) | 1 , mid + 1 , r , x , y , z));
return zz;
}
int add1(int x , int y , int z){
while(tp[x] != tp[y]){
if(dep[tp[x]] < dep[tp[y]])swap(x , y);
cc(1 , 1 , n , id[tp[x]] , id[x] , z);
x = f[tp[x]];
}
if(id[x] > id[y])swap(x , y);
cc(1 , 1 , n , id[x] + 1 , id[y] , z);
}
int que1(int x , int y , int z){
int zz = 0;
while(tp[x] != tp[y]){
if(dep[tp[x]] < dep[tp[y]])swap(x , y);
zz = max(zz , que(1 , 1 , n , id[tp[x]] , id[x] , z));
x = f[tp[x]];
}
if(id[x] > id[y])swap(x , y);
zz = max(zz , que(1 , 1 , n , id[x] + 1 , id[y] , z));
return zz;
}
int que2(int x , int y){
int zz = 0;
while(tp[x] != tp[y]){
if(dep[tp[x]] < dep[tp[y]])swap(x , y);
zz += csum(1 , 1 , n , id[tp[x]] , id[x]);
x = f[tp[x]];
}
if(id[x] > id[y])swap(x , y);
zz += csum(1 , 1 , n , id[x] + 1 , id[y]);
return zz;
}
void init(){
memset(h , -1 , sizeof(h));
tp[1] = 1;
tot = 0;
cin>>n>>m;
for(int i = 1 ; i < n ; i++){
int x,y,z;cin>>x>>y>>z;
add(x , y , z);
add(y , x , z);
}
dfs(1 , 1);
dfs2(1 , 1);
for(int i = 1 ; i <= tot ; i++){
int x = e[i].from;
int y = e[i].to;
if(dep[x] < dep[y])swap(x , y);
w[id[x]] = e[i].cost;
}
build(1 , 1 , n);
}
struct node3{
int u,v,val;
}c[MAXN];
bool cmp(node3 x , node3 y){
return x.val > y.val;
}
void solve(){
for(int i = 1 ; i <= m ; i++){
cin>>c[i].u>>c[i].v;
c[i].val = que2(c[i].u , c[i].v);
}
sort(c + 1 , c + 1 + m , cmp);
int s1 = c[1].val , minl;
add1(c[1].u , c[1].v , 1);
minl = s1 - que1(c[1].u , c[1].v , 1);
for(int i = 2 ; i <= m ; i++){
int u,v,k;
u = c[i].u;
v = c[i].v;
add1(u , v , i);
k = que1(u , v , i);
if(k == 0){cout<<max(minl , que2(u , v))<<endl;exit(0);}
minl = min(minl , max(c[i].val , s1 - k));
}
cout<<minl<<endl;
}
int main(){
//freopen("P2680_2.in" , "r" , stdin);
init();
solve();
}