2013-2014 ACM-ICPC Northeastern European Regional Contest (NEERC 13) 补题代码

链接

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值