#include<bits/stdc++.h>
#define PII pair<int,int>
#define f first
#define s second
#define VI vector<int>
#define LL long long
#define MP make_pair
#define LD long double
#define PB push_back
#define ALL(V) V.begin(),V.end()
#define abs(x) max((x),-(x))
#define PDD pair<LD,LD>
#define VPII vector< PII >
#define siz(V) ((int)V.size())
#define FOR(x, b, e) for(int x=b;x<=(e);x++)
#define FORD(x, b, e) for(int x=b;x>=(e);x--)
#define REP(x, n) for(int x=0;x<(n);x++)
#define mini(a,b) a=min(a,b)
#define maxi(a,b) a=max(a,b)
using namespace std;
#include "cielib.h"
const int MXD = 500;
int mi[MXD];
int mx[MXD];
int acc[MXD];
int d = podajD();
int k = podajK();
int r = podajR();
void ustawsr()
{
REP(i, d)
acc[i] = (mi[i] + mx[i])/2;
}
int mxsro(int a, int b)
{
return (b-a+1)/2;
}
int main()
{
REP(i, d)
{
mi[i] = 0;
mx[i] = r;
}
if(r % 2 == 1)// napraw niepatrzyste
{
int odl = r/2 + 1;
int ust = r/2;
REP(i, d)
{
ustawsr();
acc[i] = acc[i] - ust;
czyCieplo(acc);
acc[i] = acc[i] + 2*ust;
if(czyCieplo(acc))
mi[i]++;
else
mx[i]--;
}
}
while(1)
{
int mxodl = 0;
REP(j, d)
{
if((mx[j] - mi[j]) % 2 == 1)
{
if(mx[j] < r)mx[j]++;
else if(mi[j] > 0)mi[j]--;
else assert(false);
}
maxi(mxodl, mxsro(mi[j], mx[j]));
}
if(mxodl == 0)break;
REP(i, d)
{
/* cerr<<" mxodl: "<<mxodl<<endl;
REP(j, d)
cerr<<mi[j]<<" "<<mx[j]<<endl;
cerr<<endl;*/
if(mi[i] == mx[i])continue;
ustawsr();
acc[i] = acc[i] - mxodl;
czyCieplo(acc); // 1
acc[i] = acc[i] + 2 * mxodl;
if(czyCieplo(acc)) // 2
{
mi[i] += mxodl + 1;
}
else
{
acc[i] = acc[i] - 2 * mxodl;
if(czyCieplo(acc)) // 3
{
mx[i] -= mxodl + 1;
}
else
{
mi[i] = mx[i] = acc[i] + mxodl;
}
}
}
}
REP(i, d)acc[i] = mi[i];
znalazlem(acc);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include<bits/stdc++.h> #define PII pair<int,int> #define f first #define s second #define VI vector<int> #define LL long long #define MP make_pair #define LD long double #define PB push_back #define ALL(V) V.begin(),V.end() #define abs(x) max((x),-(x)) #define PDD pair<LD,LD> #define VPII vector< PII > #define siz(V) ((int)V.size()) #define FOR(x, b, e) for(int x=b;x<=(e);x++) #define FORD(x, b, e) for(int x=b;x>=(e);x--) #define REP(x, n) for(int x=0;x<(n);x++) #define mini(a,b) a=min(a,b) #define maxi(a,b) a=max(a,b) using namespace std; #include "cielib.h" const int MXD = 500; int mi[MXD]; int mx[MXD]; int acc[MXD]; int d = podajD(); int k = podajK(); int r = podajR(); void ustawsr() { REP(i, d) acc[i] = (mi[i] + mx[i])/2; } int mxsro(int a, int b) { return (b-a+1)/2; } int main() { REP(i, d) { mi[i] = 0; mx[i] = r; } if(r % 2 == 1)// napraw niepatrzyste { int odl = r/2 + 1; int ust = r/2; REP(i, d) { ustawsr(); acc[i] = acc[i] - ust; czyCieplo(acc); acc[i] = acc[i] + 2*ust; if(czyCieplo(acc)) mi[i]++; else mx[i]--; } } while(1) { int mxodl = 0; REP(j, d) { if((mx[j] - mi[j]) % 2 == 1) { if(mx[j] < r)mx[j]++; else if(mi[j] > 0)mi[j]--; else assert(false); } maxi(mxodl, mxsro(mi[j], mx[j])); } if(mxodl == 0)break; REP(i, d) { /* cerr<<" mxodl: "<<mxodl<<endl; REP(j, d) cerr<<mi[j]<<" "<<mx[j]<<endl; cerr<<endl;*/ if(mi[i] == mx[i])continue; ustawsr(); acc[i] = acc[i] - mxodl; czyCieplo(acc); // 1 acc[i] = acc[i] + 2 * mxodl; if(czyCieplo(acc)) // 2 { mi[i] += mxodl + 1; } else { acc[i] = acc[i] - 2 * mxodl; if(czyCieplo(acc)) // 3 { mx[i] -= mxodl + 1; } else { mi[i] = mx[i] = acc[i] + mxodl; } } } } REP(i, d)acc[i] = mi[i]; znalazlem(acc); } |
English