1011 ( Segment Tree with Pruning )
过题:3
排名:230
记忆化、模拟。
CY
#include <bits/stdc++.h>
typedef long long ll;
std::map < ll, ll > mp;
ll k, n;
ll calc(ll len)
{
if (len <= k) return 1;
if (mp.find(len) != mp.end()) return mp[len];
ll mid = len >> 1;
ll ans = calc(mid) + calc(len - mid) + 1;
return mp[len] = ans;
}
int main()
{
int t; scanf("%d", &t);
while (t--)
{
mp.clear();
scanf("%lld%lld", &n, &k);
printf("%lld\n", calc(n));
}
return 0;
}
1007 ( Photoshop Layers )
WYX
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
const int inf = 0x3f3f3f3f;
char s[MAXN], temp[MAXN];
ll sum[MAXN][3], sum1[MAXN];
int f(char a, char b)
{
int a1, b1;
if (a <= '9' && a >= '0')
a1 = a - '0';
else
a1 = a - 'A' + 10;
if (b <= '9' && b >= '0')
b1 = b - '0';
else
b1 = b - 'A' + 10;
return 16 * a1 + b1;
}
int f1(int c)
{
int cnt = 0;
while (c)
{
int q = c % 16;
c /= 16;
if (q <= 9)
temp[cnt++] = '0' + q;
else
temp[cnt++] = 'A' + q - 10;
}
while (cnt < 2)
temp[cnt++] = '0';
reverse(temp, temp + cnt);
return cnt;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, q;
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d%s", &x, s);
sum1[i] = sum1[i - 1];
if (x == 1)
{
sum1[i]++;
for (int j = 0; j < 3; j++)
sum[i][j] = f(s[j * 2], s[2 * j + 1]);
}
else
{
for (int j = 0; j < 3; j++)
sum[i][j] = sum[i - 1][j] + f(s[j * 2], s[2 * j + 1]);
}
}
while (q--)
{
int l, r;
scanf("%d%d", &l, &r);
if (sum1[r] - sum1[l - 1] != 0)
{
int cnt = 0;
for (int j = 0; j < 3; j++)
{
int len = f1(min(sum[r][j], 1ll * 255));
for (int k = 0; k < len; ++k)
s[cnt++] = temp[k];
}
printf("%s\n", s);
}
else
{
int cnt = 0;
for (int j = 0; j < 3; j++)
{
int len = f1(min(sum[r][j] - sum[l - 1][j], 1ll * 255));
for (int k = 0; k < len; ++k)
s[cnt++] = temp[k];
}
printf("%s\n", s);
}
}
}
return 0;
}
1004 ( Game on Plane )
WYX
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
typedef std::pair < int, int > pll;
std::map < pll, int > mp;
ll gcd(ll a, ll b)
{
if (b == 0) return a;
else return gcd(b, a % b);
}
int aa[maxn];
int main()
{
int t; scanf("%d", &t);
while (t--)
{
int n; scanf("%d", &n);
mp.clear();
int cnt=0;
for (int i = 1; i <= n; ++i)
{
int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d);
int gcdx = gcd(a - c, b - d);
int u = (a - c) / gcdx, v = (b - d) / gcdx;
if (u < 0) u *= -1, v *= -1;
if(!mp[{u, v}]) {
mp[{u, v}]=++cnt;
aa[cnt]=0;
}
aa[mp[{u,v}]]++;
}
sort(aa+1,aa+1+cnt);
int l=1;
int ans = 0;
bool f = true;
while (f)
{
int cnt1 = 0; f = false;
for (int i=l;i<=cnt;i++)
{
++cnt1; f = true;
if (cnt1 != 1) ++ans;
printf("%d\n", ans);
aa[i]--;
if(aa[i]==0) l++;
}
}
}
return 0;
}