Gym 100307A ASCII Puzzle
Gym 100307B Bonus Cards
#include<bits/stdc++.h>
#define int long long
#define eps 1e-10
#define MAXN 3010
using namespace std;
long long n, a, b;
double f1[MAXN][MAXN], f2[MAXN][MAXN];
signed main(){
freopen("bonus.in", "r", stdin);
freopen("bonus.out", "w", stdout);
cin>>n>>a>>b;
if(n >= a + b + 1){
cout<<1.0<<endl<<1.0<<endl;
return 0;
}
f1[0][0] = 1.0;
a = a + 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= min(n, a); j++){
int a_use = j, a_now = a - a_use;
int b_use = (i - 1) - a_use, b_now = b - b_use;
if(b_use <= b && b_now <= b && f1[i - 1][j] > eps){
f1[i][j] += f1[i - 1][j] * (b_now) / (a_now * 2 + b_now);
}
a_use = j - 1, a_now = a - a_use;
b_use = (i - 1) - a_use, b_now = b - b_use;
if(b_use <= b && b_now <= b && f1[i - 1][j - 1] > eps) f1[i][j] += f1[i - 1][j - 1] * (2 * a_now) / (2 * a_now + b_now);
}
}
double ans = 0;
for(int i = 1; i <= min(n, a); i++){
// ans += f1[n][i] * C[a - 1][i - 1] / C[a][i];
ans += f1[n][i] * i / a;
}
printf("%.16lf\n", ans);
f2[0][0] = 1.0;
a = a - 1, b = b + 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= min(b, n); j++){
int b_use = j, b_now = b - b_use;
int a_use = (i - 1) - b_use, a_now = a - a_use;
if(a_use <= a && a_now <= a && f2[i - 1][j] > eps) f2[i][j] += f2[i - 1][j] * (a_now * 2) / (a_now * 2 + b_now);
b_use = j - 1, b_now = b - b_use;
a_use = (i - 1) - b_use, a_now = a - a_use;
if(a_use <= a && a_now <= a && f2[i - 1][j] > eps) f2[i][j] += f2[i - 1][j - 1] * (b_now) / (2 * a_now + b_now);
}
}
ans = 0;
for(int i = 1; i <= min(b, n); i++){
// ans += f2[n][i] * C[b - 1][i - 1] / C[b][i];
ans += f2[n][i] * i / b;
}
printf("%.16lf\n", ans);
return 0;
}
Gym 100307C Cactus Automorphisms
Gym 100307D Dictionary
Gym 100307E Easy Geometry
Gym 100307F Fraud Busters
签到
#include<bits/stdc++.h>
#define MAXN 1010
using namespace std;
int n, ans;
char s[MAXN], now[MAXN], a[MAXN][MAXN];
int main(){
freopen("fraud.in", "r", stdin);
freopen("fraud.out", "w", stdout);
scanf("%s", s + 1);
int len = strlen(s + 1);
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%s", now + 1);
bool flag = true;
for(int j = 1; j <= strlen(now + 1); j++){
if(s[j] != '*' && s[j] != now[j]){
flag = false;
break;
}
}
if(flag == true){
ans++;
for(int j = 1; j <= strlen(now + 1); j++){
a[ans][j] = now[j];
}
}
}
printf("%d\n", ans);
for(int i = 1; i <= ans; i++){
for(int j = 1; j <= len; j++)
printf("%c", a[i][j]);
puts("");
}
return 0;
}
Gym 100307G Green Energy
Gym 100307H Hack Protection
#include<bits/stdc++.h>
#define MAXN 500010
using namespace std;
int n;
int a[MAXN], pre_sum[MAXN];
struct Node{
int l, r, v;
};
long long ans = 0;
map<int, int>p;
vector<Node>vec[MAXN];
vector<int>is_0[MAXN];
vector<int>pos[MAXN];
inline bool cmp(int x, int y){
return x > y;
}
int main(){
freopen("hack.in", "r", stdin);
freopen("hack.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
if(n == 1){
printf("1\n");
return 0;
}
for(int i = 1; i <= n; i++){
for(int j = 0; j < 32; j++){
if((1 << j) & a[i]) continue;
else is_0[j].push_back(i);
}
}
for(int i = 0; i < 32; i++) sort(is_0[i].begin(), is_0[i].end(), cmp);
for(int i = 1; i <= n; i++){
int now_pos = i, now_val = a[i];
while(now_pos <= n){
int minn = n;
for(int j = 0; j < 32; j++){
if((1 << j) & now_val){
if(is_0[j].size() != 0){
while(is_0[j][is_0[j].size() - 1] <= now_pos){
is_0[j].pop_back();
if(is_0[j].size() == 0) break;
}
if(is_0[j].size()) minn = min(minn, is_0[j][is_0[j].size() - 1] - 1);
}
}
}
vec[i].push_back((Node){now_pos, minn, now_val});
now_pos = minn + 1;
now_val &= a[minn + 1];
}
}
int cur[MAXN], cur_cnt = 0;
for(int i = 1; i <= n; i++){
pre_sum[i] = pre_sum[i - 1] ^ a[i];
cur[++cur_cnt] = pre_sum[i];
}
sort(&cur[1], &cur[cur_cnt + 1]);
cur_cnt = unique(&cur[1], &cur[cur_cnt + 1]) - cur - 1;
for(int i = 1; i <= n; i++){
int cur_p = lower_bound(&cur[1], &cur[cur_cnt + 1], pre_sum[i]) - cur;
if(!p[pre_sum[i]]) p[pre_sum[i]] = cur_p;
}
for(int i = 1; i <= n; i++){
pos[p[pre_sum[i]]].push_back(i);
}
for(int i = 1; i <= n; i++){
for(int j = 0; j < vec[i].size(); j++){
int cur1 = p[vec[i][j].v ^ pre_sum[i - 1]];
if(pos[cur1].size() == 0) continue;
else{
int pos1 = lower_bound(pos[cur1].begin(), pos[cur1].end(), vec[i][j].l) - pos[cur1].begin();
int pos2 = lower_bound(pos[cur1].begin(), pos[cur1].end(), vec[i][j].r + 1) - pos[cur1].begin();
ans += pos2 - pos1;
}
}
}
printf("%lld\n", ans);
return 0;
}
Gym 100307I Interactive Interception
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,vl,vr,xl,xr,lastl,lastr;
int l[100005],r[100005];
char s[100005];
int gogo(int L,int R)
{
ll tot=0;
for(int i=xl;i<=xr;i++)
{
if(l[i]<=r[i]) tot+=r[i]-l[i]+1;
}
int mid=(L+R)>>1;
ll cnt=0;
for(int i=xl;i<=xr;i++)
{
int x=(mid-i)/t;
if(l[i]<=x) cnt+=x-l[i]+1;
}
if(cnt==tot-cnt) return mid;
if(cnt<tot-cnt)
{
int tl=mid+1,tr=R;
while(tl<tr)
{
int mi=(tl+tr)>>1;
cnt=0;
for(int i=xl;i<=xr;i++)
{
int x=(mi-i)/t;
if(l[i]<=x) cnt+=x-l[i]+1;
}
if(cnt>=tot-cnt) tr=mi;
else tl=mi+1;
}
return tl;
}
else
{
int tl=L,tr=mid-1;
while(tl<tr)
{
int mi=(tl+tr+1)>>1;
cnt=0;
for(int i=xl;i<=xr;i++)
{
int x=(mi-i)/t;
if(l[i]<=x) cnt+=x-l[i]+1;
}
if(cnt<=tot-cnt) tl=mi;
else tr=mi-1;
}
return tl;
}
}
int main()
{
scanf("%d%d",&xr,&vr);
for(int i=0;i<=xr;i++) r[i]=vr;
lastr=xr;
while(xl<xr||vl<vr)
{
int L=lastl,R=lastr;
if(!t)
{
int mid=(L+R)>>1;
printf("check %d %d\n",L,mid);
fflush(stdout);
scanf("%s",s+1);
if(s[1]=='Y')
{
xr=mid;
lastl=0,lastr=mid+vr;
}
else xl=mid+1,lastl=mid+1,lastr=xr+vr;
t++;
continue;
}
int mid=gogo(L,R);
printf("check %d %d\n",L,mid);
fflush(stdout);
scanf("%s",s+1);
if(s[1]=='Y')
{
for(int i=xl;i<=xr;i++)
{
int x=(L-i)/t;
if(i+x*t<L) x++;
l[i]=max(l[i],x);
x=(mid-i)/t;
if(mid<i) r[i]=-1;
r[i]=min(r[i],x);
}
}
else
{
for(int i=xl;i<=xr;i++)
{
int x=(mid+1-i)/t;
if(i+x*t<mid+1) x++;
l[i]=max(l[i],x);
x=(R-i)/t;
if(R<i) r[i]=-1;
r[i]=min(r[i],x);
}
}
while(l[xl]>r[xl]&&xl<xr) ++xl;
while(l[xr]>r[xr]&&xl<xr) --xr;
t++;
lastl+=vl,lastr+=vr;
int g=100000;
for(int i=xl;i<=xr;i++) if(l[i]<=r[i]) g=min(g,i+l[i]*t);
lastl=max(lastl,g);
g=0;
for(int i=xl;i<=xr;i++) if(l[i]<=r[i]) g=max(g,i+r[i]*t);
lastr=min(lastr,g);
g=vr;
for(int i=xl;i<=xr;i++) if(l[i]<=r[i]) g=min(g,l[i]);
vl=g;g=vl;
for(int i=xl;i<=xr;i++) if(l[i]<=r[i]) g=max(g,r[i]);
vr=g;
}
printf("answer %d\n",t*vl+xl);
fflush(stdout);
return 0;
}
J Gym 100307J Join the Conversation
#include <bits/stdc++.h>
using namespace std;
#define maxn 1220005
int n, cnt, tot, a[maxn], last[maxn], mem[maxn], maxdp[maxn], dp[maxn];
string s;
unordered_map <string, int> Map;
void Get() {
for(int i = 0; i < s.length(); i ++) {
n = n * 10 + s[i] - '0';
}
}
int main() {
freopen("join.in", "r", stdin);
freopen("join.out", "w", stdout);
ios::sync_with_stdio(0); cin.tie(0);
getline(cin, s);
Get();
for(int i = 1; i <= n; i ++) {
getline(cin, s);
string name; int len = s.length();
int rec = 0, id = 0;
for(int j = 0; j < len; j ++) {
if(s[j] == ':') {
rec = j + 2;
break;
}
if(j != 0) name += s[j];
}
if(!Map[name]) Map[name] = ++ tot, id = tot;
else id = Map[name];
dp[i] = 1, mem[i] = i;
string name1; bool flag = 0;
for(int j = rec; j < len; j ++) {
if(s[j - 1] == ' ' && s[j] == '@') {
flag = 1;
name1.erase(0);
continue;
}
if(flag && s[j] == ' ') {
int id1 = Map[name1];
if(id1 && id1 != id) {
if(maxdp[id1] + 1 > dp[i])
mem[i] = last[id1], dp[i] = maxdp[id1] + 1;
}
flag = 0;
}
if(flag) name1 += s[j];
}
if(flag) {
int id1 = Map[name1];
if(id1 && id1 != id) {
if(maxdp[id1] + 1 > dp[i])
mem[i] = last[id1], dp[i] = maxdp[id1] + 1;
}
flag = 0;
}
if(dp[i] > maxdp[id]) maxdp[id] = dp[i], last[id] = i;
}
int ans = 0, st = 0;
for(int i = 1; i <= n; i ++)
if(dp[i] > ans) ans = dp[i], st = i;
a[++ cnt] = st;
for(int i = st; ; i = mem[i]) {
if(i == mem[i]) break;
a[++ cnt] = mem[i];
}
cout << ans << endl;
for(int i = cnt; i > 1; i --)
cout << a[i] << " ";
cout << a[1] << endl;
return 0;
}
K Gym 100307K Kabaleo Lite
#include <bits/stdc++.h>
using namespace std;
#define maxn 3000000
int n, p, c, h, tot, num;
int ans[maxn], b[maxn], l[maxn], cnt[maxn];
struct node {
int cl, x;
node(int _cl = 0, int _x = 0) {
cl = _cl, x = _x;
}
friend bool operator <(node a, node b) {
return a.x < b.x;
}
friend bool operator ==(node a, node b) {
return (a.cl == b.cl) && (b.x == a.x);
}
};
struct heap {
priority_queue <node> q;
priority_queue <node> q1;
void push(node a) {
q.push(a);
}
void del(node a) {
q1.push(a);
}
int get() {
while(q.size() && q1.size() && q.top() == q1.top()) q.pop(), q1.pop();
return q.top().x;
}
}H;
int main() {
freopen("kabaleo.in", "r", stdin);
freopen("kabaleo.out", "w", stdout);
cin >> n >> p >> c >> h;
for(int i = 1; i <= n; i ++) cin >> b[i];
for(int i = 1; i <= p; i ++) cin >> l[i];
for(int i = 1; i <= n; i ++) cnt[b[i]] ++;
for(int i = 2; i <= p; i ++) cnt[l[i]] ++;
if(n == 1) {
if(l[p] == h) cout << "1" << endl << "1" << endl;
else cout << "0" << endl;
return 0;
}
// cout << "????" << flag << endl;
for(int i = 1; i <= c; i ++)
if(i != h) num += cnt[i], H.push(node(i, cnt[i]));
for(int i = 1; i <= n; i ++) {
num += (l[1] != h);
num -= (b[i] != h);
if(num > n) continue;
if(l[1] != h) {
H.del(node(l[1], cnt[l[1]]));
H.push(node(l[1], cnt[l[1]] + 1));
cnt[l[1]] ++;
}
if(b[i] != h) {
H.del(node(b[i], cnt[b[i]]));
H.push(node(b[i], cnt[b[i]] - 1));
cnt[b[i]] --;
}
// cout << "---->" << i << " " << num << " " << H.get() << endl;
if(H.get() < n - num) ans[++ tot] = i;
if(b[i] != h) {
H.del(node(b[i], cnt[b[i]]));
H.push(node(b[i], cnt[b[i]] + 1));
cnt[b[i]] ++;
}
if(l[1] != h) {
H.del(node(l[1], cnt[l[1]]));
H.push(node(l[1], cnt[l[1]] - 1));
cnt[l[1]] --;
}
num -= (l[1] != h);
num += (b[i] != h);
}
cout << tot << endl;
if(!tot) return 0;
for(int i = 1; i < tot; i ++) cout << ans[i] << " ";
cout << ans[tot] << endl;
return 0;
}