市选am2#include <cstdio>
#include <iostream>
int get_ans(int e,int em,int m,int mh,int h)
{
for(int i = e + em;i >= 0;i--)
{
if( e + em < i || mh + h < i) continue;
int E,M,H;
E = std :: min ( e + em - i, em );
H = std :: min ( h + mh - i, mh );
M = m + E + H;
if( M >= i ) return i;
}
}
int main()
{
freopen("pro.in","r",stdin);
freopen("pro.out","w",stdout);
int R;
scanf("%d",&R);
for(int r = 0;r < R;r++)
{
int e,em,m,mh,h;
scanf("%d%d%d%d%d",&e,&em,&m,&mh,&h);
printf("%d\n", get_ans(e,em,m,mh,h) );
}
return 0;
}
市选am3#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
typedef long long llint;
llint n;
int k;
llint get_ans(llint a,llint b)
{
if(k == 1) return std :: abs(a-b);
llint ans=0;
while (a != b)
{
if(a < b) std :: swap(a,b);
a = (a - 2 + k) / k;
ans ++ ;
}
return ans;
}
int main()
{
freopen("ktree.in","r",stdin);
freopen("ktree.out","w",stdout);
int q;
scanf("%I64d%d%d",&n,&k,&q);
for(int Q = 0;Q < q;Q++)
{
llint a,b;
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n", get_ans(a,b) );
}
return 0;
}
市选am4#include <cstdio>
#include <algorithm>
const int MOD = (1e9) + 7,
MAXN = 1 << 17 ,
MAXK = 55;
typedef long long llint;
llint C[MAXN][MAXK];
int a[MAXN];
int n,k;
int main()
{
freopen("summax.in","r",stdin);
freopen("summax.out","w",stdout);
scanf("%d%d",&n,&k);
C[0][0]=1;
for(int i = 1;i <= n;i++)
for(int j = 0;j < k;j++)
{
C[i][j] = C[i-1][j];
if(j > 0) C[i][j] += C[i-1][j-1];
C[i][j] %= MOD;
}
for(int i = 0;i < n;i++)
{
scanf("%d",&a[i]);
}
std :: sort(a,a+n);
llint ans = 0;
for(int i = 0;i < n;i++)
{
ans += (a[i] * C[i][k-1] % MOD) % MOD;
ans %= MOD;
}
printf("%I64d\n",ans);
return 0;
}
市选pm1#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
#define string std :: string
const int MAXN = (1e6) * 2 + 10 ,
MOD = (1e7) + 7;
inline int get_c(const char ch) { return ch - 'A' + 1; }
int n;
string st;
int S[MAXN];
int s[MOD];
int ans;
inline void get_str(string& st){
st.clear();
char ch;
ch = getchar();
while ( !isalpha(ch) ) ch = getchar();
while ( isalpha(ch) ){
st.push_back(ch);
ch = getchar();
}
}
void get_hash(const string st){
int Lh,Rh;
Lh = Rh = 0;
const int len = st . size();
int now_ans = 0;
for(int i = 0,j = len-1;i < len;++i,--j)
{
Lh *= 28; Lh += get_c(st[i]);
Lh %= MOD;
int tmp = get_c(st[j]);
tmp *= S[i];
tmp %= MOD;
Rh += tmp;
Rh %= MOD;
if(Lh == Rh)
{
now_ans = std :: max(now_ans,s[Lh]+1);
}
}
s[Lh] = std :: max(now_ans,s[Lh]);
ans = std :: max(now_ans, ans);
}
int main(){
freopen("psfix.in","r",stdin);
freopen("psfix.out","w",stdout);
scanf("%d\n",&n);
S[0] = 1;
for(int i = 1;i < MAXN;i++){
S[i] = S[i-1] * 28;
S[i] %= MOD;
}
for(int i = 0;i < n;i++){
get_str(st);
get_hash(st);
}
printf("%d\n",ans);
return 0;
}
市选pm2#include <cstdio>
int main()
{
freopen("ele.in","r",stdin);
freopen("ele.out","w",stdout);
int r;
scanf("%d",&r);
for(int R = 0;R < r;R++)
{
int n;
int low = 0,up = 0;
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
int x;
scanf("%d",&x);
x *= 100;
if (x != 0) low += x - 50;
up += x + 49;
}
if( low <= (1e4) && (1e4) <= up ) printf("NO\n");
else printf("YES\n");
}
return 0;
}
Open Bronze1#include <cstdio>
#include <algorithm>
const int MAXN = (1e6) + 5;
int cnt,n;
int a[MAXN];
int k[MAXN];
int get_k();
int main(){
freopen("code.in","r",stdin);
freopen("code.out","w",stdout);
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
}
int x=0,ans=1;
for(int i = 1;i < n;i++)
{
if(a[i] > a[i-1]) x++;
if(a[i] < a[i-1]) x--;
if(a[i] == a[0] && x == 0) ans++;
else{
if( x != 0 && ! ((a[i]-a[0]) % x) ){
k[cnt++] = (a[i]-a[0]) / x;
}
}
}
std :: sort(k,k+cnt);
printf("%d\n",get_k() + ans);
return 0;
}
int get_k(){
int last = k[0] , ans = 0 , count = 0;
for(int i = 0;i < cnt;i++)
{
if(last == k[i]) count ++;
else{
ans = std :: max(ans,count);
count = 1;
last = k[i];
}
}
return std :: max(ans , count);
}
#include <cstdio>
#include <cstring>
int main(){
freopen("diamond.in","r",stdin);
freopen("diamond.out","w",stdout);
int n,k;
scanf("%d%d",&n,&k);
int a[n];
memset(a,0,sizeof a);
for(int i = 0;i < n;i++) scanf("%d",&a[i]);
int ans = 0;
for(int i = 0;i < n;i++){
int cnt = 0;
for(int j = 0;j < n;j++){
if(a[j] >= a[i] && a[j] <= a[i] + k){
cnt++;
}
}
if(cnt > ans){
ans = cnt;
}
}
printf("%d\n",ans);
return 0;
}
Open Silver1#include <cstdio>
const int MAXN = (1e4) * 5 + 5 ,
INF = 0x7fffffff;
int n;
int x[MAXN],y[MAXN];
int MaxX1,MaxX2;
int MinX1 = INF , MinX2 = INF;
int MaxY1,MaxY2;
int MinY1 = INF , MinY2 = INF;
int main() {
freopen("reduce.in","r",stdin);
freopen("reduce.out","w",stdout);
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d %d",&x[i],&y[i]);
if(x[i] < MinX1) MinX2 = MinX1 , MinX1 = x[i];
else if(x[i] < MinX2) MinX2 = x[i];
if(y[i] < MinY1) MinY2 = MinY1 , MinY1 = y[i];
else if(y[i] < MinY2) MinY2 = y[i];
if(x[i] > MaxX1) MaxX2 = MaxX1 , MaxX1 = x[i];
else if(x[i] > MaxX2) MaxX2 = x[i];
if(y[i] > MaxY1) MaxY2 = MaxY1 , MaxY1 = y[i];
else if(y[i] > MaxY2) MaxY2 = y[i];
}
int ans = (MaxX1-MinX1) * (MaxY1-MinY1);
for(int i = 0;i < n;i++){
int xMin = (x[i] == MinX1 ? MinX2 : MinX1);
int xMax = (x[i] == MaxX1 ? MaxX2 : MaxX1);
int yMin = (y[i] == MinY1 ? MinY2 : MinY1);
int yMax = (y[i] == MaxY1 ? MaxY2 : MaxY1);
if(ans > (xMax - xMin) * (yMax - yMin)) ans = (xMax - xMin) * (yMax - yMin);
}
//printf("Minx:%d %d Miny:%d %d Maxx%d %d Maxy%d %d\n",MinX1,MinX2,MinY1,MinY2,MaxX1,MaxX2,MaxY1,MaxY2);
printf("%d\n",ans);
return 0;
}
Open Silver2#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
const int MAXN = 50050 ,
INF = 0x7fffffff;
int n;
bool visited[MAXN];
int s[MAXN];
int x[MAXN],y[MAXN];
struct Tnode {
int value , num;
Tnode() {
value = num = 0;
}
Tnode(int x,int y) {
value = x;
num = y;
}
}a[MAXN],b[MAXN];
bool _cmp(Tnode a,Tnode b) {
return a.value < b.value || a.value == b.value && a.num < b.num;
}
int get_area(int u,int v,int w) {
int xMax = -INF,xMin = INF , yMax = -INF,yMin = INF;
for(int i = 0;i < n;i++) {
if(i == u || i == v || i == w) continue;
xMax = std :: max(xMax,x[i]);
xMin = std :: min(xMin,x[i]);
yMax = std :: max(yMax,y[i]);
yMin = std :: min(yMin,y[i]);
}
return (xMax - xMin) * (yMax - yMin);
}
/*
int change(int v,int u,int w)
{
int a=-oo,b=oo,c=-oo,d=oo;
for (int i=0; i<n; i++)
if (i!=v && i!=u && i!=w)
{
if (x[i]>a) a=x[i];
if (x[i]<b) b=x[i];
if (y[i]>c) c=y[i];
if (y[i]<d) d=y[i];
}
return (a-b)*(c-d);
}
*/
int main() {
freopen("reduce.in","r",stdin);
freopen("reduce.out","w",stdout);
scanf("%d",&n);
for(int i = 0;i < n;i++) {
scanf("%d%d",&x[i],&y[i]);
a[i] = Tnode(x[i],i);
b[i] = Tnode(y[i],i);
}
std :: sort( a , a+n ,_cmp );
std :: sort( b , b+n ,_cmp );
int ans = INF;
int cnt = 0;
for(int i = 0;i < 3;i++) {
if(!visited[a[i].num]) {
++cnt;
s[cnt] = a[i].num;
visited[ s[cnt] ] = true;
}
if(!visited[b[i].num]) {
++cnt;
s[cnt] = b[i].num;
visited[ s[cnt] ] = false;
}
}
for(int i = 3; a[i].num == a[i-1].num ; i++) {
if(!visited[a[i].num]) {
++cnt;
s[cnt] = a[i].num;
visited[ s[cnt] ] = true;
}
}
for(int i = 3;b[i].num == b[i-1].num;i++) {
if(!visited[b[i].num]) {
++cnt;
s[cnt] = b[i].num;
visited[ s[cnt] ] = false;
}
}
for(int i = n-1;i > n-4;i--) {
if( !visited[a[i].num] ) {
++cnt;
s[cnt] = a[i].num;
visited[ s[cnt] ] = true;
}
if(!visited[b[i].num]) {
++cnt;
s[cnt] = b[i].num;
visited[ s[cnt] ] = false;
}
}
for(int i = n-4; a[i].num == a[i-1].num ; i--) {
if(!visited[a[i].num]) {
++cnt;
s[cnt] = a[i].num;
visited[ s[cnt] ] = true;
}
}
for(int i = 3;b[i].num == b[i-1].num;i--) {
if(!visited[b[i].num]) {
++cnt;
s[cnt] = b[i].num;
visited[ s[cnt] ] = false;
}
}
for(int i = 1;i < cnt-1;i++) {
for(int j = i+1;j < cnt;j++) {
for(int k = j+1;k <= cnt;k++) {
ans = std :: min(ans , get_area(s[i],s[j],s[k]));
}
}
}
printf("%d\n",ans);
return 0;
}
Open Silver3#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
const int MAXN = (1e5) + 5;
int n,k;
int a[MAXN];
int Left[MAXN],Right[MAXN];
int main() {
freopen("diamond.in","r",stdin);
freopen("diamond.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++) {
scanf("%d",a+i);
}
std :: sort(a+1,a+n+1);
int j = 1;
for(int i = 1;i <= n;i++) {
while (j <= n && a[j] - a[i] <= k) j++;
j--;
Left[i] = j-i+1;
}
j = n;
for(int i = n;i > 0;i--) {
while (j > 0 && a[i] - a[j] <= k) j--;
j++;
Right[i] = i-j+1;
}
for(int i = n;i > 0;i--) Left[i] = std :: max(Left[i+1] , Left[i]);
for(int i = 1;i <= n;i++) Right[i] = std :: max(Right[i-1] , Right[i]);
int ans = 0;
for(int i = 1;i <= n;i++) ans = std :: max(ans,Right[i-1] + Left[i]);
printf("%d\n",ans);
return 0;
}
#include <cstdio>
const int MAXN = 3005;
int fa[MAXN];
bool ans[MAXN],F[MAXN] = {0};
int a[MAXN];
int n,m;
bool edge[MAXN][MAXN];
int _find(int root) {
if( fa[root] == root ) return root;
return fa[root] = _find( fa[root] );
}
int main() {
freopen("closing.in","r",stdin);
freopen("closing.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) fa[i] = i;
for(int i = 0;i < m;i++) {
int u,v;
scanf("%d%d",&u,&v);
edge[u][v] = edge[v][u] = 1;
}
for(int i = n-1;i >= 0;i--) {
scanf("%d",&a[i]);
}
for(int i = 0;i < n;i++) {
bool f = 1;
F[ a[i] ] = 1;
int fa1;
for(int j = 1;j <= n;j++) {
fa1 = _find(a[i]);
if( j == a[i] || !edge[ a[i] ][j] || !F[j]) continue;
int fa2 = _find(j);
if(fa1 != fa2) {
fa[fa2] = fa1;
}
}
for(int j = 1;j <= n;j++) {
fa1 = _find(a[i]);
int fa2 = _find(j);
if(F[j] && fa1 != fa2) f=0;
}
ans[i] = f;
for(int i = 1;i <= n;i++) printf("%d ",fa[i]);
puts("");
}
for(int i = n-1;i >= 0;i--) {
printf("%s\n",ans[i] ? "YES" : "NO");
}
return 0;
}