NOIP2012 簡要題解

2021-06-11 07:04:03 字數 3839 閱讀 3691

day1 p1vigenere密碼

直接根據規律模擬即可

#include #include #include #include #include using namespace std;

const int maxn = 2000;

char s[maxn],t[maxn];

int calc(char c)

int main()

}return 0;

}

day1 p2國王遊戲

首先我們分析一下 如果i和j兩個相鄰那麼i排在j前面的必要條件是  total * a[i] / b[j]  <  total * a[j] /b[i] 也就是說 a[i]*b[i] < a[j]*b[j]

這樣就立刻確定了順序(有序性在資訊學競賽中的應用)

接下來就是模擬出每個大臣得到的數,直接使用一下高精度計算即可。

#include #include #include #include #include #define inf 1000000000

using namespace std;

const int maxn = 200000;

struct big;

string str() const

big operator = (int num)

big operator * (int b)

return c;

}big operator /(int b)

/*if (x>0)

while(true);

}*/while (c.a[c.len-1]==0 && c.len>1) c.len--;

return c;

}big operator +(const big & b)

}ans,answer,t;

struct node

}p[maxn];

istream& operator >> (istream& in, big &x)

ostream& operator << (ostream& out, big &x)

int main()

}f[maxn][20+2];

struct point

}p[maxn];

multisets;

multiset::iterator it;

void updata(int i ,int h,int j,int h2)

if ((abs(h-h2) == len1[i] && p[next1[i]].h > h2)

|| (abs(h-h2) < len1[i]))

if (!next2[i])

if ((abs(h-h2)== len2[i] && p[next1[i]].h > h2)

|| (abs(h-h2) < len2[i]))

}void ask(int st,ll len)

}if (next2[st] && len>=len2[st])

lena +=len2[st];

}int main()

for (int i = n; i>=1; --i)

if (it != s.begin())

if (it != s.begin())

s.insert(p[i]);

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

cout << pos << endl;

cin>>m;

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

int mid = (l+r) / 2;

build(a,l,mid,p+p);

build(a,mid+1,r,p+p+1);

min[p] = min(min[p+p],min[p+p+1]);

}void update(int p )

void push(int p)

void getdec(int l ,int r,int p, int a,int b,int need)

push(p);

int mid = (l+r) / 2;

if (b <= mid ) getdec(l,mid,p+p,a,b,need); else

if (a > mid ) getdec(mid+1,r,p+p+1,a,b,need); else

update(p);

}}tree;

int main()

}cout << 0 << endl;

return 0;

}

day2 p3疫情控制

題目大意即所有軍隊攔截住1節點通往葉節點的道路。

首先答案最小,可以用二分轉化為判定性問題。

第二繼續利用倍增思想判斷軍隊能否達到1節點。能則記錄還有多少時間可以移動,不能則停留在最上面的節點上。

然後根據目前情況dfs出1的那幾個子節點需要軍隊,然後就是軍隊與子節點的一一匹配。

這個匹配可以用貪心,首先而比邊的權值排序從大到小操作,對於1的某個自己點,如果有軍隊從他走到了1,但是回不到自身了,則

讓該軍隊控制這個節點,否則選出還有時間能夠走到該節點的剩餘時間最小的軍隊去控制這個節點(可以用乙個set,方便查詢)。

#include #include #include #include #include #include #include #include using namespace std;

const int maxn = 100000;

typedef long long ll;

multisets;

multiset::iterator it;

int n,u,v,w,m,nownode;

ll f[maxn][20];

int y[maxn];

int g[maxn][20];

int sontree[maxn];

int cnt[maxn];

int p[maxn];

int min[maxn];

bool leaf[maxn];

bool son[maxn];

struct arm

a[maxn];

struct graph

void addedge(int a,int b,int c)

}g;void dfs(int x,int father)

}leaf[x] = flag;

}void find_leaf(int x, int father)

for (int j = g.v[x]; j ; j = g.next[j])

}}bool ok(ll value)

}if (pos == 1)

else

cnt[pos]++;

}

find_leaf(1,0);

for (int i = 1;i <= n;++i) min[i]= -1;

for (int i = 0; i < arm ; ++ i)

} int tot = 0;

for (int i = 1; i <= n;++i)

return true;

}int main()

cin>>m ;

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

dfs(1,0);

/*for (int i = 1;i <= n; ++i)

{cout <

NOIP2012 國王遊戲 題解

恰逢h國國慶,國王邀請n位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這n位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手上的數的乘積...

noip2012 借教室 題解

emm,根據題意描述,就是每次區間加乙個數,問是否滿足條件。首先,答案肯定滿足二分性質,之後就是判斷了。說白了就是很多次區間加,然後一次查詢前面各個數。當然,線段樹,樹狀陣列裸題,但是,這樣是nlogn的,過不了呀。要重新考慮。由於只查詢一次,我們可以差分陣列,每次修改是o 1 的,查詢是o n 的...

NOIP2012提高組 開車旅行 題解

題目連線 題目描述 小 a 和小 b 決定利用假期外出旅行,他們將想去的城市從 1 到 n 編號,且編號較小的城市在編號較大的城市的西邊,已知各個城市的海拔高度互不相同,記城市 i 的海拔高度為hi,城市 i 和城市 j 之間的距離 d i,j 恰好是這兩個城市海拔高度之差的絕對值,即d i,j h...